|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)objfmt.h 5.3 (Berkeley) 6/29/90
7: */
8:
9: /*
10: * The size of the display.
11: */
12: #define DSPLYSZ 20
13:
14: /*
15: * The structure of the runtime display
16: */
17: #ifdef OBJ
18: struct dispsave {
19: char *locvars; /* pointer to local variables */
20: struct blockmark *stp; /* pointer to local stack frame */
21: };
22: /*
23: * The following union allows fast access to
24: * precomputed display entries
25: */
26: union display {
27: struct dispsave frame[DSPLYSZ];
28: char *raw[2*DSPLYSZ];
29: } display;
30: #endif OBJ
31: #ifdef PC
32: #ifdef vax
33: /*
34: * the display is made up of saved AP's and FP's.
35: * FP's are used to find locals,
36: * and AP's are used to find parameters.
37: * FP and AP are untyped pointers,
38: * but are used throughout as (char *).
39: * the display is used by adding AP_OFFSET or FP_OFFSET to the
40: * address of the approriate display entry.
41: */
42: struct dispsave {
43: char *savedAP;
44: char *savedFP;
45: } display[ DSPLYSZ ];
46:
47: # define AP_OFFSET ( 0 )
48: # define FP_OFFSET ( sizeof (char *) )
49: #endif vax
50: #ifdef mc68000
51: /*
52: * the display is just the saved a6.
53: * arguments are at positive offsets,
54: * locals are at negative offsets.
55: * there are no offsets within the saved display structure.
56: */
57: struct dispsave {
58: char *saveda6;
59: } display[ DSPLYSZ ];
60:
61: # define AP_OFFSET (0)
62: # define FP_OFFSET (0)
63: #endif mc68000
64: #ifdef tahoe
65: /*
66: * the display is just the saved FP.
67: * arguments are at positive offsets,
68: * locals are at negative offsets.
69: * there are no offsets within the saved display structure.
70: */
71: struct dispsave {
72: char *savedFP;
73: } display[ DSPLYSZ ];
74:
75: # define AP_OFFSET 0
76: # define FP_OFFSET 0
77: #endif tahoe
78: #endif PC
79:
80: /*
81: * the structure below describes the block mark used by the architecture.
82: * this is the space used by the machine between the arguments and the
83: * whatever is used to point to the arguments.
84: */
85: #ifdef OBJ
86: struct blockmark {
87: char *tos; /* pointer to top of stack frame */
88: struct iorec *file; /* pointer to active file name */
89: struct hdr {
90: long framesze; /* number of bytes of local vars */
91: long nargs; /* number of bytes of arguments */
92: long tests; /* TRUE => perform runtime tests */
93: short offset; /* offset of procedure in source file */
94: char name[1]; /* name of active procedure */
95: } *entry;
96: struct dispsave odisp; /* previous display value for this level */
97: struct dispsave *dp; /* pointer to active display entry */
98: char *pc; /* previous location counter */
99: long lino; /* previous line number */
100: };
101: #endif OBJ
102: #ifdef PC
103: #ifdef vax
104: /*
105: * since we have the ap pointing to the number of args:
106: */
107: struct blockmark {
108: long nargs;
109: };
110: #endif vax
111: #ifdef mc68000
112: /*
113: * there's the saved pc (from the jsr)
114: * and the saved a6 (from the link a6).
115: */
116: struct blockmark {
117: char *savedpc;
118: char *saveda6;
119: };
120: #endif mc68000
121: #ifdef tahoe
122: /*
123: * since we have the fp pointing to its predecessor
124: */
125: struct blockmark {
126: long savedfp;
127: };
128: #endif tahoe
129: #endif PC
130:
131: /*
132: * formal routine structure:
133: */
134: struct formalrtn {
135: long (*fentryaddr)(); /* formal entry point */
136: long fbn; /* block number of function */
137: struct dispsave fdisp[ DSPLYSZ ]; /* saved at first passing */
138: };
139: #ifndef PC
140: #ifndef OBJ
141: struct formalrtn frtn;
142: #endif
143: #endif
144:
145: #define FENTRYOFFSET 0
146: #define FBNOFFSET ( FENTRYOFFSET + sizeof frtn.fentryaddr )
147: #define FDISPOFFSET ( FBNOFFSET + sizeof frtn.fbn )
148:
149: #ifdef OBJ
150: /*
151: * the creation time, the size and the magic number of the obj file
152: */
153: struct pxhdr {
154: long maketime;
155: long objsize;
156: long symtabsize;
157: short magicnum;
158: };
159:
160: /*
161: * START defines the beginning of the text space.
162: * This should be the defined external label "start",
163: * however there is no way to access externals from C
164: * whose names do not begin with an "_".
165: */
166: #ifdef vax
167: # define HEADER_BYTES 2048 /* the size of px_header */
168: # define START 0x0 /* beginning of text */
169: #endif vax
170: #ifdef tahoe
171: # define HEADER_BYTES 2560 /* the size of px_header */
172: # define START 0x0 /* beginning of text */
173: #endif tahoe
174: #ifdef mc68000
175: # define HEADER_BYTES 3072 /* the size of px_header */
176: # define START 0x8000 /* beginning of text */
177: #endif mc68000
178: # define INDX 1 /* amt to shift display index */
179: #endif OBJ
180:
181: /*
182: * these are because of varying sizes of pointers
183: */
184: #ifdef ADDR16
185: # define PTR_AS O_AS2
186: # define PTR_RV O_RV2
187: # define PTR_IND O_IND2
188: # define PTR_CON O_CON2
189: # define PTR_DUP O_SDUP2
190: # define CON_INT O_CON2
191: # define INT_TYP (nl + T2INT)
192: # define PTR_DCL char *
193: # define TOOMUCH 50000
194: # define SHORTADDR 65536
195: # define MAXSET 65536 /* maximum set size */
196: #endif ADDR16
197: #ifdef ADDR32
198: # define PTR_AS O_AS4
199: # define PTR_RV O_RV4
200: # define PTR_IND O_IND4
201: # define PTR_CON O_CON4
202: # define PTR_DUP O_SDUP4
203: # define CON_INT O_CON24
204: # define INT_TYP (nl + T4INT)
205: # define PTR_DCL unsigned long /* for pointer variables */
206: # define SHORTADDR 32768 /* maximum short address */
207: # define TOOMUCH 65536 /* maximum variable size */
208: # define MAXSET 65536 /* maximum set size */
209: #endif ADDR32
210: /*
211: * Offsets due to the structure of the runtime stack.
212: * DPOFF1 is the amount of fixed storage in each block allocated
213: * as local variables for the runtime system.
214: * since locals are allocated negative offsets,
215: * -DPOFF1 is the last used implicit local offset.
216: * DPOFF2 is the size of the block mark.
217: * since arguments are allocated positive offsets,
218: * DPOFF2 is the end of the implicit arguments.
219: * for obj, the first argument has the highest offset
220: * from the stackpointer. and the block mark is an
221: * implicit last parameter.
222: * for pc, the first argument has the lowest offset
223: * from the argumentpointer. and the block mark is an
224: * implicit first parameter.
225: */
226: # ifdef OBJ
227: # ifdef ADDR32
228: # define MAGICNUM 0403 /* obj magic number */
229: # define DPOFF1 0
230: # define DPOFF2 (sizeof (struct blockmark))
231: # define INPUT_OFF -8 /* offset of `input' */
232: # define OUTPUT_OFF -4 /* offset of `output' */
233: # endif ADDR32
234: # ifdef ADDR16
235: # define MAGICNUM 0404
236: # define DPOFF1 0
237: # define DPOFF2 (sizeof (struct blockmark))
238: # define INPUT_OFF -2
239: # define OUTPUT_OFF -4
240: # endif ADDR16
241: # endif OBJ
242: # ifdef PC
243: # define DPOFF1 ( sizeof (struct rtlocals) )
244: # define DPOFF2 ( sizeof (struct blockmark) )
245: # define INPUT_OFF 0
246: # define OUTPUT_OFF 0
247: # endif PC
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.