1 /*  START OF:       unpaged_page_tables.incl.pl1              *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * */
 2 
 3 /* This include file describes the segments unpaged_page_tables and
 4    int_unpaged_page_tables.  These segments contain the page tables for
 5    supervisor segments loaded by the bootloader that are paged and wired.
 6    Such segments were previously called unpaged and defined without using
 7    a page table.
 8 
 9    Both unpage_page_tables and int_unpage_page_tables share the format
10    declared below.
11 
12     - Page tables for some segs having the SLTE ^paged attribute are stored
13       in unpaged_page_tables.  The unpaged_page_tables segment is setup by
14       Collection One programs and in-use in all phases of Multics operation.
15 
16     - Page tables for segs having the SLTE init_seg attribute are stored in
17       int_unpaged_page_tables.  Segments with the init_seg attribute only
18       exist while Collection One bootload programs are running.  Early in
19       Collection Two, these initialization-related programs and the
20       int_unpaged_page_tables segment itself are deleted from Multics
21       memory, and from the Segment Loading Table maintained in memory.
22       Only some early dumps include these initialization segments and their
23       SLT entries.
24 
25    Written September 15, 1983 by Keith Loepere. */
26 
27 
28 
29 
30 /****^  HISTORY COMMENTS:
31   1) change(2022-11-14,GDixon), approve(2023-01-16,MCR10129),
32      audit(2023-02-28,Swenson), install(2023-02-28,MR12.8-1054):
33       A) Change declaration of upt.first_entry to denote only the location of
34          the first Page Table + header (rather than declaring its full
35          contents).  This prevents infinite loop in the azm request:
36           display unpaged_page_tables -as upt
37          which thinks upt.first_entry includes a very large number of PTWs.
38       B) Add declaration of upt_entry_header so size of this header can be
39          determined in PL/I code.
40       C) Expand comments to explain use and layout of the segments.
41                                                    END HISTORY COMMENTS */
42 
43 
44 
45 
46 /* format: style4,indattr,ifthenstmt,ifthen,idind33,^indcomtxt */
47 
48 dcl  upt_ptr                          ptr;
49 dcl  1 upt                            aligned based (upt_ptr),
50        2 sst_absloc                   fixed bin (26),       /* for dump analyzers */
51        2 sst_last_loc                 fixed bin (26),
52        2 upt_absloc                   fixed bin (26),
53        2 upt_last_loc                 fixed bin (26),
54        2 iupt_absloc                  fixed bin (26),
55        2 iupt_last_loc                fixed bin (26),
56 
57        2 current_length               fixed bin,            /* number of words currently used */
58        2 max_length                   fixed bin,            /* max number of words in memory allocated */
59        2 first_entry                  fixed bin;            /* size of the 1st page table (see: upt_entry.size below) */
60 
61 /* ----------------------------------------------------------------------------------------------------
62    The upt structure can be located by a pointer to the unpaged_page_tables segment.
63       upt_ptr = addr(unpaged_page_tables$);
64 
65    If upt.iupt_absloc > 0, then the upt structure overlaying int_unpaged_page_tables
66    can be located by a reference to that segment.
67       upt_ptr = addr(int_unpaged_page_tables$);
68 
69    The first Page Table with header begins at location:
70       upt_entry_ptr = addr(upt.first_entry);
71 
72    Each Page table is an even-word aligned array of PTWs preceded by a 2-word header,
73    as shown by upt_entry declaration (see below).  sdw.add gives the absolute address of
74    the actual page table defined by the upt_entry.ptws(*) array.
75 
76    Each subsequent Page Table entry may be accessed by:
77       upt_entry_ptr =
78         addwordno (upt_entry_ptr, currentsize (upt_entry) + mod (currentsize (upt_entry), 2) );
79    ---------------------------------------------------------------------------------------------------- */
80 
81 dcl  upt_entry_ptr                    ptr;
82 dcl  1 upt_entry                      aligned based (upt_entry_ptr),
83        2 upt_pt_header                aligned like upt_entry_header,
84        2 ptws                         (0 refer (upt_entry.size)) bit (36) aligned;
85 
86 dcl  1 upt_entry_header               aligned based,
87        2 size                         fixed bin,            /* number of page table words allocated */
88        2 segno                        fixed bin;            /* segment number of hardcore segment */
89 
90 /*  END OF:         unpaged_page_tables.incl.pl1              *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * */