1 /* Copyright (c) 1979 Regents of the University of California */ 2 3 /* static char sccsid[] = "@(#)vars.h 1.8 02/02/82"; */ 4 5 #include <stdio.h> 6 7 /* 8 * px - Berkeley Pascal interpreter 9 * 10 * Version 4.0, January 1981 11 * 12 * Original version by Ken Thompson 13 * 14 * Substantial revisions by Bill Joy and Chuck Haley 15 * November-December 1976 16 * 17 * Rewritten for VAX 11/780 by Kirk McKusick 18 * Fall 1978 19 * 20 * Rewritten in ``C'' using libpc by Kirk McKusick 21 * Winter 1981 22 * 23 * Px is described in detail in the "PX 4.0 Implementation Notes" 24 * The source code for px is in several major pieces: 25 * 26 * int.c C main program which reads in interpreter code 27 * interp.c Driver including main interpreter loop and 28 * the interpreter instructions grouped by their 29 * positions in the interpreter table. 30 * except.c Handlers for interpreter specific errors not 31 * included in libpc. 32 * utilities.c Interpreter exit, backtrace, and runtime statistics. 33 * 34 * In addition there are several headers defining mappings for panic 35 * names into codes, and a definition of the interpreter transfer 36 * table. These are made by the script make.ed1 in this directory and 37 * the routine opc.c from ${PASCALDIR}. (see the makefile for details) 38 */ 39 #define PXPFILE "pmon.out" 40 #define BITSPERBYTE 8 41 #define BITSPERLONG (BITSPERBYTE * sizeof(long)) 42 #define HZ 60 43 #define MAXLVL 20 44 #define NAMSIZ 76 45 #define MAXFILES 32 46 #define PREDEF 2 47 #ifdef VAX 48 #define STDLVL ((struct iorec *)(0x7ffffff1)) 49 #define GLVL ((struct iorec *)(0x7ffffff0)) 50 #else 51 #define STDLVL ((struct iorec *)(0xfff1)) 52 #define GLVL ((struct iorec *)(0xfff0)) 53 #endif VAX 54 #define FILNIL ((struct iorec *)(0)) 55 #define INPUT ((struct iorec *)(&input)) 56 #define OUTPUT ((struct iorec *)(&output)) 57 #define ERR ((struct iorec *)(&_err)) 58 #define PX 0 /* normal run of px */ 59 #define PIX 1 /* load and go */ 60 #define PIPE 2 /* bootstrap via a pipe */ 61 #define PDX 3 /* invoked by the debugger "pdx" */ 62 #define releq 0 63 #define relne 2 64 #define rellt 4 65 #define relgt 6 66 #define relle 8 67 #define relge 10 68 typedef enum {FALSE, TRUE} bool; 69 70 /* 71 * interrupt and allocation routines 72 */ 73 extern long createtime; 74 extern char *PALLOC(); 75 extern char *malloc(); 76 extern long time(); 77 extern intr(); 78 extern memsize(); 79 extern except(); 80 extern syserr(); 81 extern liberr(); 82 83 /* 84 * stack routines and structures 85 */ 86 struct sze8 { 87 char element[8]; 88 }; 89 extern short pop2(); 90 extern long pop4(); 91 extern double pop8(); 92 extern struct sze8 popsze8(); 93 extern char *pushsp(); 94 95 /* 96 * emulated pc types 97 */ 98 union progcntr { 99 char *cp; 100 unsigned char *ucp; 101 short *sp; 102 unsigned short *usp; 103 long *lp; 104 double *dbp; 105 struct hdr *hdrp; 106 }; 107 108 /* 109 * THE RUNTIME DISPLAY 110 * 111 * The entries in the display point to the active static block marks. 112 * The first entry in the display is for the global variables, 113 * then the procedure or function at level one, etc. 114 * Each display entry points to a stack frame as shown: 115 * 116 * base of stack frame 117 * --------------- 118 * | | 119 * | block mark | 120 * | | 121 * --------------- <-- display entry "stp" points here 122 * | | <-- display entry "locvars" points here 123 * | local | 124 * | variables | 125 * | | 126 * --------------- 127 * | | 128 * | expression | 129 * | temporary | 130 * | storage | 131 * | | 132 * - - - - - - - - 133 * 134 * The information in the block mark is thus at positive offsets from 135 * the display.stp pointer entries while the local variables are at negative 136 * offsets from display.locvars. The block mark actually consists of 137 * two parts. The first part is created at CALL and the second at entry, 138 * i.e. BEGIN. Thus: 139 * 140 * ------------------------- 141 * | | 142 * | Saved lino | 143 * | Saved lc | 144 * | Saved dp | 145 * | | 146 * ------------------------- 147 * | | 148 * | Saved (dp) | 149 * | | 150 * | Pointer to current | 151 * | routine header info | 152 * | | 153 * | Saved value of | 154 * | "curfile" | 155 * | | 156 * | Empty tos value | 157 * | | 158 * ------------------------- 159 */ 160 161 /* 162 * runtime display structure 163 */ 164 struct disp { 165 char *locvars; /* pointer to local variables */ 166 struct stack *stp; /* pointer to local stack frame */ 167 }; 168 169 struct stack { 170 char *tos; /* pointer to top of stack frame */ 171 struct iorec *file; /* pointer to active file name */ 172 struct hdr { 173 long framesze; /* number of bytes of local vars */ 174 long nargs; /* number of bytes of arguments */ 175 bool tests; /* TRUE => perform runtime tests */ 176 short offset; /* offset of procedure in source file */ 177 char name[1]; /* name of active procedure */ 178 } *entry; 179 struct disp odisp; /* previous display value for this level */ 180 struct disp *dp; /* pointer to active display entry */ 181 union progcntr pc; /* previous location counter */ 182 long lino; /* previous line number */ 183 }; 184 185 union disply { 186 struct disp frame[MAXLVL]; 187 char *raw[2*MAXLVL]; 188 }; 189 190 /* 191 * formal routine structure 192 */ 193 struct formalrtn { 194 char *fentryaddr; /* formal entry point */ 195 long fbn; /* block number of function */ 196 struct disp fdisp[ MAXLVL ]; /* saved at first passing */ 197 }; 198 199 /* 200 * program variables 201 */ 202 extern union disply _display; /* runtime display */ 203 extern struct disp *_dp; /* ptr to active frame */ 204 extern long _lino; /* current line number */ 205 extern int _argc; /* number of passed args */ 206 extern char **_argv; /* values of passed args */ 207 extern bool _nodump; /* TRUE => no post mortum dump */ 208 extern bool _runtst; /* TRUE => runtime tests */ 209 extern long _mode; /* execl by PX, PIPE, or PIX */ 210 extern long _stlim; /* statement limit */ 211 extern long _stcnt; /* statement count */ 212 extern long _seed; /* random number seed */ 213 extern char *_maxptr; /* maximum valid pointer */ 214 extern char *_minptr; /* minimum valid pointer */ 215 extern long *_pcpcount; /* pointer to pxp buffer */ 216 extern long _cntrs; /* number of counters */ 217 extern long _rtns; /* number of routine cntrs */ 218 219 /* 220 * The file i/o routines maintain a notion of a "current file". 221 * A pointer to this file structure is kept in "curfile". 222 * 223 * file structures 224 */ 225 struct iorechd { 226 char *fileptr; /* ptr to file window */ 227 long lcount; /* number of lines printed */ 228 long llimit; /* maximum number of text lines */ 229 FILE *fbuf; /* FILE ptr */ 230 struct iorec *fchain; /* chain to next file */ 231 struct iorec *flev; /* ptr to associated file variable */ 232 char *pfname; /* ptr to name of file */ 233 short funit; /* file status flags */ 234 short fblk; /* index into active file table */ 235 long fsize; /* size of elements in the file */ 236 char fname[NAMSIZ]; /* name of associated UNIX file */ 237 }; 238 239 struct iorec { 240 char *fileptr; /* ptr to file window */ 241 long lcount; /* number of lines printed */ 242 long llimit; /* maximum number of text lines */ 243 FILE *fbuf; /* FILE ptr */ 244 struct iorec *fchain; /* chain to next file */ 245 struct iorec *flev; /* ptr to associated file variable */ 246 char *pfname; /* ptr to name of file */ 247 short funit; /* file status flags */ 248 short fblk; /* index into active file table */ 249 long fsize; /* size of elements in the file */ 250 char fname[NAMSIZ]; /* name of associated UNIX file */ 251 char buf[BUFSIZ]; /* I/O buffer */ 252 char window[1]; /* file window element */ 253 }; 254 255 /* 256 * unit flags 257 */ 258 #define FDEF 0x80 /* 1 => reserved file name */ 259 #define FTEXT 0x40 /* 1 => text file, process EOLN */ 260 #define FWRITE 0x20 /* 1 => open for writing */ 261 #define FREAD 0x10 /* 1 => open for reading */ 262 #define TEMP 0x08 /* 1 => temporary file */ 263 #define SYNC 0x04 /* 1 => window is out of sync */ 264 #define EOLN 0x02 /* 1 => at end of line */ 265 #define EOFF 0x01 /* 1 => at end of file */ 266 267 /* 268 * file routines 269 */ 270 extern struct iorec *GETNAME(); 271 extern char *MKTEMP(); 272 273 /* 274 * file record variables 275 */ 276 extern struct iorechd _fchain; /* head of active file chain */ 277 extern struct iorec *_actfile[]; /* table of active files */ 278 extern long _filefre; /* last used entry in _actfile */ 279 280 /* 281 * standard files 282 */ 283 extern struct iorechd input; 284 extern struct iorechd output; 285 extern struct iorechd _err; 286 287 /* 288 * Px execution profile array 289 */ 290 #ifdef PROFILE 291 #define NUMOPS 256 292 extern long _profcnts[NUMOPS]; 293 #endif PROFILE 294