Significant progress to getting pl1$pl1 to compile something, implemented many necess...
[multics_sim.git] / stack_header.h
1 #ifndef _STACK_HEADER_H
2 #define _STACK_HEADER_H
3
4 #include "pointer.h"
5
6 // see pl1/stack_header.incl.pl1
7
8 // dcl sb ptr; /* the main pointer to the stack header */
9
10 // dcl 1 stack_header based (sb) aligned,
11 struct stack_header {
12   // 2 pad1 (4) fixed bin, /* (0) also used as arg list by outward_call_handler */
13   uint64_t pad1[4];
14
15   // 2 cpm_data_ptr ptr, /* (4) pointer to control point which owns this stack */
16   struct its_pointer cpm_data_ptr;
17
18   // 2 combined_stat_ptr ptr, /* (6) pointer to area containing separate static */
19   struct its_pointer combined_stat_ptr;
20
21   // 2 clr_ptr ptr, /* (8) pointer to area containing linkage sections */
22   struct its_pointer clr_ptr;
23
24   // 2 max_lot_size fixed bin (17) unal, /* (10) DU number of words allowed in lot */
25   // 2 main_proc_invoked fixed bin (11) unal, /* (10) DL nonzero if main procedure invoked in run unit */
26   // 2 have_static_vlas bit (1) unal, /* (10) DL "1"b if (very) large arrays are being used in static */
27   // 2 pad4 bit (2) unal,
28   // 2 run_unit_depth fixed bin (2) unal, /* (10) DL number of active run units stacked */
29   int64_t unit_depth : 3;
30   uint64_t pad4 : 2;
31   uint64_t have_static_vlas : 1;
32   int64_t main_proc_invoked : 12;
33   int64_t max_lot_size : 18;
34   uint64_t dummy0 : 28;
35
36   // 2 cur_lot_size fixed bin (17) unal, /* (11) DU number of words (entries) in lot */
37   // 2 cpm_enabled bit (18) unal, /* (11) DL non-zero if control point management is enabled */
38   uint64_t cpm_enabled : 18;
39   int64_t cur_lot_size : 18;
40   uint64_t dummy1 : 28;
41
42   // 2 system_free_ptr ptr, /* (12) pointer to system storage area */
43   struct its_pointer system_free_ptr;
44
45   // 2 user_free_ptr ptr, /* (14) pointer to user storage area */
46   struct its_pointer user_free_ptr;
47
48   // 2 null_ptr ptr, /* (16) */
49   struct its_pointer null_ptr;
50
51   // 2 stack_begin_ptr ptr, /* (18) pointer to first stack frame on the stack */
52   struct its_pointer stack_begin_ptr;
53
54   // 2 stack_end_ptr ptr, /* (20) pointer to next useable stack frame */
55   struct its_pointer stack_end_ptr;
56
57   // 2 lot_ptr ptr, /* (22) pointer to the lot for the current ring */
58   struct its_pointer lot_ptr;
59
60   // 2 signal_ptr ptr, /* (24) pointer to signal procedure for current ring */
61   struct its_pointer signal_ptr;
62
63   // 2 bar_mode_sp ptr, /* (26) value of sp before entering bar mode */
64   struct its_pointer bar_mode_sp;
65
66   // 2 pl1_operators_ptr ptr, /* (28) pointer to pl1_operators_$operator_table */
67   struct its_pointer pl1_operators_ptr;
68
69   // 2 call_op_ptr ptr, /* (30) pointer to standard call operator */
70   struct its_pointer call_op_ptr;
71
72   // 2 push_op_ptr ptr, /* (32) pointer to standard push operator */
73   struct its_pointer push_op_ptr;
74
75   // 2 return_op_ptr ptr, /* (34) pointer to standard return operator */
76   struct its_pointer return_op_ptr;
77
78   // 2 return_no_pop_op_ptr
79   // ptr, /* (36) pointer to standard return / no pop operator */
80   struct its_pointer no_pop_op_ptr;
81
82   // 2 entry_op_ptr ptr, /* (38) pointer to standard entry operator */
83   struct its_pointer entry_op_ptr;
84
85   // 2 trans_op_tv_ptr ptr, /* (40) pointer to translator operator ptrs */
86   struct its_pointer trans_op_tv_ptr;
87
88   // 2 isot_ptr ptr, /* (42) pointer to ISOT */
89   struct its_pointer isot_ptr;
90
91   // 2 sct_ptr ptr, /* (44) pointer to System Condition Table */
92   struct its_pointer sct_ptr;
93
94   // 2 unwinder_ptr ptr, /* (46) pointer to unwinder for current ring */
95   struct its_pointer unwinder_ptr;
96
97   // 2 sys_link_info_ptr ptr, /* (48) pointer to *system link name table */
98   struct its_pointer sys_link_info_ptr;
99
100   // 2 rnt_ptr ptr, /* (50) pointer to Reference Name Table */
101   struct its_pointer rnt_ptr;
102
103   // 2 ect_ptr ptr, /* (52) pointer to event channel table */
104   struct its_pointer ect_ptr;
105
106   // 2 assign_linkage_ptr ptr, /* (54) pointer to storage for (obsolete) hcs_$assign_linkage */
107   struct its_pointer assign_linkage_ptr;
108
109   // 2 heap_header_ptr ptr, /* (56) pointer to the heap header for this ring */
110   struct its_pointer heap_header_ptr;
111
112   // 2 trace,
113   // 3 frames,
114   // 4 count fixed bin, /* (58) number of trace frames */
115   int64_t trace_frames_count;
116
117   // 4 top_ptr ptr unal, /* (59) pointer to last trace frame */
118   uint64_t trace_frames_top_ptr;
119
120   // 3 in_trace bit (36) aligned, /* (60) trace antirecursion flag */
121   uint64_t trace_in_trace;
122
123   // 2 pad2 bit (36), /* (61) */
124   uint64_t pad2;
125
126   // 2 pad5 pointer; /* (62) pointer to future stuff */
127   struct its_pointer pad5;
128 };
129
130 /* The following offset refers to a table within the pl1 operator table. */
131
132 // dcl tv_offset fixed bin init (361) internal static;
133  /* (551) octal */
134 #define TV_OFFSET 361
135
136 /* The following constants are offsets within this transfer vector table. */
137
138 // dcl (
139 enum {
140   // call_offset fixed bin init (271),
141   call_offset = 271,
142
143   // push_offset fixed bin init (272),
144   push_offset = 272,
145
146   // return_offset fixed bin init (273),
147   return_offset = 273,
148
149   // return_no_pop_offset fixed bin init (274),
150   no_pop_offset = 274,
151
152   // entry_offset fixed bin init (275)
153   entry_offset = 275
154 // ) internal static;
155 };
156
157 /* The following declaration is an overlay of the whole stack header. Procedures which
158  move the whole stack header should use this overlay.
159 */
160
161 // dcl stack_header_overlay (size (stack_header)) fixed bin based (sb);
162
163 #endif