1 typedef uchar BYTE; /* 8 bits */ 2 typedef int WORD; /* 32 bits */ 3 typedef unsigned int UWORD; /* 32 bits */ 4 typedef vlong LONG; /* 64 bits */ 5 typedef uvlong ULONG; /* 64 bits */ 6 typedef double REAL; /* 64 double IEEE754 */ 7 typedef short SHORT; /* 16 bits */ 8 typedef float SREAL; /* 32 float IEEE754 */ 9 10 enum ProgState 11 { 12 Palt, /* blocked in alt instruction */ 13 Psend, /* waiting to send */ 14 Precv, /* waiting to recv */ 15 Pdebug, /* debugged */ 16 Pready, /* ready to be scheduled */ 17 Prelease, /* interpreter released */ 18 Pexiting, /* exit because of kill or error */ 19 Pbroken, /* thread crashed */ 20 }; 21 22 enum 23 { 24 propagator = 3, /* gc marking color */ 25 26 PRNSIZE = 1024, 27 BIHASH = 23, 28 PQUANTA = 2048, /* prog time slice */ 29 30 /* STRUCTALIGN is the unit to which the compiler aligns structs. */ 31 /* It really should be defined somewhere else */ 32 STRUCTALIGN = sizeof(int) /* must be >=2 because of Strings */ 33 }; 34 35 enum 36 { 37 /* Prog and Progs flags */ 38 Ppropagate = 1<<0, /* propagate exceptions within group */ 39 Pnotifyleader = 1<<1, /* send exceptions to group leader */ 40 Prestrict = 1<<2, /* enforce memory limits */ 41 Prestricted = 1<<3, 42 Pkilled = 1<<4, 43 Pprivatemem = 1<<5 /* keep heap and stack private */ 44 }; 45 46 typedef struct Alt Alt; 47 typedef struct Channel Channel; 48 typedef struct Progq Progq; 49 typedef struct Import Import; 50 typedef struct ILock ILock; 51 typedef struct Inst Inst; 52 typedef struct Module Module; 53 typedef struct Modlink Modlink; 54 typedef struct Modl Modl; 55 typedef struct Type Type; 56 typedef struct Prog Prog; 57 typedef struct Progs Progs; 58 typedef struct Heap Heap; 59 typedef struct Link Link; 60 typedef struct List List; 61 typedef struct Array Array; 62 typedef struct String String; 63 typedef union Linkpc Linkpc; 64 typedef struct REG REG; 65 typedef struct Frame Frame; 66 typedef union Stkext Stkext; 67 typedef struct Atidle Atidle; 68 typedef struct Altc Altc; 69 typedef struct Except Except; 70 typedef struct Handler Handler; 71 72 struct ILock 73 { 74 int lk; 75 int pid; 76 void* ql; 77 }; 78 79 struct Frame 80 { 81 Inst* lr; /* REGLINK isa.h */ 82 uchar* fp; /* REGFP */ 83 Modlink* mr; /* REGMOD */ 84 Type* t; /* REGTYPE */ 85 }; 86 87 union Stkext 88 { 89 uchar stack[1]; 90 struct { 91 Type* TR; 92 uchar* SP; 93 uchar* TS; 94 uchar* EX; 95 union { 96 uchar fu[1]; 97 Frame fr[1]; 98 } tos; 99 } reg; 100 }; 101 102 struct Array 103 { 104 WORD len; 105 Type* t; 106 Array* root; 107 uchar* data; 108 }; 109 110 struct List 111 { 112 List* tail; 113 Type* t; 114 WORD data[1]; 115 }; 116 117 struct Channel 118 { 119 Array* buf; /* For buffered channels - must be first */ 120 Progq* send; /* Queue of progs ready to send */ 121 Progq* recv; /* Queue of progs ready to receive */ 122 void* aux; /* Rock for devsrv */ 123 void (*mover)(void); /* Data mover */ 124 union { 125 WORD w; 126 Type* t; 127 } mid; 128 int front; /* Front of buffered queue */ 129 int size; /* Number of data items in buffered queue */ 130 }; 131 132 struct Progq 133 { 134 Prog* prog; 135 Progq* next; 136 }; 137 138 struct String 139 { 140 int len; /* string length */ 141 int max; /* maximum length in representation */ 142 char* tmp; 143 union { 144 #define Sascii data.ascii 145 #define Srune data.runes 146 char ascii[STRUCTALIGN]; /* string.c relies on having extra space (eg, in string2c) */ 147 Rune runes[1]; 148 }data; 149 }; 150 151 union Linkpc 152 { 153 void (*runt)(void*); 154 Inst* pc; 155 }; 156 157 struct Link 158 { 159 int sig; 160 Type* frame; 161 Linkpc u; 162 char *name; 163 }; 164 165 typedef union Adr Adr; 166 union Adr 167 { 168 WORD imm; 169 WORD ind; 170 Inst* ins; 171 struct { 172 ushort f; /* First indirection */ 173 ushort s; /* Second indirection */ 174 } i; 175 }; 176 177 struct Inst 178 { 179 uchar op; 180 uchar add; 181 ushort reg; 182 Adr s; 183 Adr d; 184 }; 185 186 struct Altc 187 { 188 Channel* c; 189 void* ptr; 190 }; 191 192 struct Alt 193 { 194 int nsend; 195 int nrecv; 196 Altc ac[1]; 197 }; 198 199 struct Type 200 { 201 int ref; 202 void (*free)(Heap*, int); 203 void (*mark)(Type*, void*); 204 int size; 205 int np; 206 void* destroy; 207 void* initialize; 208 uchar map[STRUCTALIGN]; 209 }; 210 211 struct REG 212 { 213 Inst* PC; /* Program counter */ 214 uchar* MP; /* Module data */ 215 uchar* FP; /* Frame pointer */ 216 uchar* SP; /* Stack pointer */ 217 uchar* TS; /* Top of allocated stack */ 218 uchar* EX; /* Extent register */ 219 Modlink* M; /* Module */ 220 int IC; /* Instruction count for this quanta */ 221 Inst* xpc; /* Saved program counter */ 222 void* s; /* Source */ 223 void* d; /* Destination */ 224 void* m; /* Middle */ 225 WORD t; /* Middle temporary */ 226 WORD st; /* Source temporary */ 227 WORD dt; /* Destination temporary */ 228 }; 229 230 struct Progs 231 { 232 int id; 233 int flags; 234 Progs* parent; 235 Progs* child; 236 Progs* sib; 237 Prog* head; /* live group leader is at head */ 238 Prog* tail; 239 }; 240 241 struct Prog 242 { 243 REG R; /* Register set */ 244 Prog* link; /* Run queue */ 245 Channel* chan; /* Channel pointer */ 246 void* ptr; /* Channel data pointer */ 247 enum ProgState state; /* Scheduler state */ 248 char* kill; /* Set if prog should error */ 249 char* killstr; /* kill string buffer when needed */ 250 int pid; /* unique Prog id */ 251 int quanta; /* time slice */ 252 ulong ticks; /* time used */ 253 int flags; /* error recovery flags */ 254 Prog* prev; 255 Prog* next; 256 Prog* pidlink; /* next in pid hash chain */ 257 Progs* group; /* process group */ 258 Prog* grpprev; /* previous group member */ 259 Prog* grpnext; /* next group member */ 260 void* exval; /* current exception */ 261 char* exstr; /* last exception */ 262 void (*addrun)(Prog*); 263 void (*xec)(Prog*); 264 265 void* osenv; 266 }; 267 268 struct Module 269 { 270 int ref; /* Use count */ 271 int compiled; /* Compiled into native assembler */ 272 ulong ss; /* Stack size */ 273 ulong rt; /* Runtime flags */ 274 ulong mtime; /* Modtime of dis file */ 275 Qid qid; /* Qid of dis file */ 276 ushort dtype; /* type of dis file's server*/ 277 uint dev; /* subtype of dis file's server */ 278 int nprog; /* number of instructions */ 279 Inst* prog; /* text segment */ 280 uchar* origmp; /* unpolluted Module data */ 281 int ntype; /* Number of type descriptors */ 282 Type** type; /* Type descriptors */ 283 Inst* entry; /* Entry PC */ 284 Type* entryt; /* Entry frame */ 285 char* name; /* Implements type */ 286 char* path; /* File module loaded from */ 287 Module* link; /* Links */ 288 Link* ext; /* External dynamic links */ 289 Import** ldt; /* Internal linkage descriptor tables */ 290 Handler* htab; /* Exception handler table */ 291 ulong* pctab; /* dis pc to code pc when compiled */ 292 void* dlm; /* dynamic C module */ 293 }; 294 295 struct Modl 296 { 297 Linkpc u; /* PC of Dynamic link */ 298 Type* frame; /* Frame type for this entry */ 299 }; 300 301 struct Modlink 302 { 303 uchar* MP; /* Module data for this instance */ 304 Module* m; /* The real module */ 305 int compiled; /* Compiled into native assembler */ 306 Inst* prog; /* text segment */ 307 Type** type; /* Type descriptors */ 308 uchar* data; /* for dynamic C modules */ 309 int nlinks; /* ?apparently required by Java */ 310 Modl links[1]; 311 }; 312 313 /* must be a multiple of 8 bytes */ 314 struct Heap 315 { 316 int color; /* Allocation color */ 317 ulong ref; 318 Type* t; 319 ulong hprof; /* heap profiling */ 320 }; 321 322 struct Atidle 323 { 324 int (*fn)(void*); 325 void* arg; 326 Atidle* link; 327 }; 328 329 struct Import 330 { 331 int sig; 332 char* name; 333 }; 334 335 struct Except 336 { 337 char* s; 338 ulong pc; 339 }; 340 341 struct Handler 342 { 343 ulong pc1; 344 ulong pc2; 345 ulong eoff; 346 ulong ne; 347 Type* t; 348 Except* etab; 349 }; 350 351 #define H2D(t, x) ((t)(((uchar*)(x))+sizeof(Heap))) 352 #define D2H(x) ((Heap*)(((uchar*)(x))-sizeof(Heap))) 353 #define H ((void*)(-1)) 354 #define SEXTYPE(f) ((Stkext*)((uchar*)(f)-OA(Stkext, reg.tos.fu))) 355 #define Setmark(h) if((h)->color!=mutator) { (h)->color = propagator; nprop=1; } 356 #define gclock() gchalt++ 357 #define gcunlock() gchalt-- 358 #define gcruns() (gchalt == 0) 359 360 extern int bflag; 361 extern int cflag; 362 extern int nproc; 363 extern Type Tarray; 364 extern Type Tstring; 365 extern Type Tchannel; 366 extern Type Tlist; 367 extern Type Tmodlink; 368 extern Type* TImage; 369 extern Type Tptr; 370 extern Type Tbyte; 371 extern Type Tword; 372 extern Type Tlong; 373 extern Type Treal; 374 extern REG R; 375 extern String snil; 376 extern void (*optab[256])(void); 377 extern void (*comvec)(void); 378 extern void (*dec[])(void); 379 extern Module* modules; 380 extern int mutator; 381 extern int nprop; 382 extern int gchalt; 383 extern int gccolor; 384 extern int minvalid; 385 386 extern int Dconv(Fmt*); 387 extern void acquire(void); 388 extern void addrun(Prog*); 389 extern void altdone(Alt*, Prog*, Channel*, int); 390 extern void altgone(Prog*); 391 extern Array* allocimgarray(Heap*, Heap*); 392 extern Module* builtinmod(char*, void*, int); 393 extern void cblock(Prog*); 394 extern void* checktype(void*, Type*, char*, int); 395 extern void cmovw(void*, void*); 396 extern Channel* cnewc(Type*, void (*)(void), int); 397 extern int compile(Module*, int, Modlink*); 398 extern void cqadd(Progq**, Prog*); 399 extern void cqdel(Progq**); 400 extern void cqdelp(Progq**, Prog*); 401 extern void crecv(Channel*, void*); 402 extern void csend(Channel*, void*); 403 extern int csendalt(Channel*, void*, Type *, int); 404 extern Prog* currun(void); 405 extern void dbgexit(Prog*, int, char*); 406 extern void dbgxec(Prog*); 407 extern void delprog(Prog*, char*); 408 extern Prog* delrun(int); 409 extern void delrunq(Prog*); 410 extern Prog* delruntail(int); 411 extern void destroy(void*); 412 extern void destroyimage(ulong); 413 extern void destroylinks(Module*); 414 extern void destroystack(REG*); 415 extern void drawmodinit(void); 416 extern Type* dtype(void (*)(Heap*, int), int, uchar*, int); 417 extern Module* dupmod(Module*); 418 extern int dynldable(int); 419 extern void iqlock(ILock*); 420 extern void iqunlock(ILock*); 421 extern void loadermodinit(void); 422 extern void error(char*); 423 extern void errorf(char*, ...); 424 extern void extend(void); 425 extern void freedyncode(Module*); 426 extern void freedyndata(Modlink*); 427 extern void freemod(Module*); 428 extern void freeheap(Heap*, int); 429 extern void freeptrs(void*, Type*); 430 extern void freestring(Heap*, int); 431 extern void freetype(Type*); 432 extern void freetypemodinit(void); 433 extern long getdbreg(); 434 extern int gfltconv(Fmt*); 435 extern void go(Module*); 436 extern int handler(char*); 437 extern Heap* heap(Type*); 438 extern Heap* heaparray(Type*, int); 439 extern void (*heapmonitor)(int, void*, ulong); 440 extern int heapref(void*); 441 extern Heap* heapz(Type*); 442 extern int hmsize(void*); 443 extern void incmem(void*, Type*); 444 extern void initarray(Type*, Array*); 445 extern void initmem(Type*, void*); 446 extern void irestore(Prog*); 447 extern Prog* isave(void); 448 extern void keyringmodinit(void); 449 extern void killcomm(Progq **p); 450 extern int killprog(Prog*, char*); 451 extern int killgrp(Prog*, char*); 452 extern Modlink* linkmod(Module*, Import*, int); 453 extern Modlink* mklinkmod(Module*, int); 454 extern Module* load(char*); 455 extern Module* lookmod(char*); 456 extern long magic(void); 457 extern void markarray(Type*, void*); 458 extern void markchan(Type*, void*); 459 extern void markheap(Type*, void*); 460 extern void marklist(Type*, void*); 461 extern void markmodl(Type*, void*); 462 extern void mathmodinit(void); 463 extern Array* mem2array(void*, int); 464 extern void mlink(Module*, Link*, uchar*, int, int, Type*); 465 extern void modinit(void); 466 extern WORD modstatus(REG*, char*, int); 467 extern void movp(void); 468 extern void movtmp(void); 469 extern void movtmpsafe(void); 470 extern int mustbesigned(char*, uchar*, ulong, Dir*); 471 extern Module* newmod(char*); 472 extern Module* newdyncode(int, char*, Dir*); 473 extern void newdyndata(Modlink*); 474 extern void newgrp(Prog*); 475 extern void newmp(void*, void*, Type*); 476 extern Prog* newprog(Prog*, Modlink*); 477 extern void newstack(Prog*); 478 extern Heap* nheap(int); 479 extern void noptrs(Type*, void*); 480 extern int nprog(void); 481 extern void opinit(void); 482 extern Module* parsemod(char*, uchar*, ulong, Dir*); 483 extern Module* parsedmod(char*, int, ulong, Qid); 484 extern void prefabmodinit(void); 485 extern Prog* progn(int); 486 extern Prog* progpid(int); 487 extern void ptradd(Heap*); 488 extern void ptrdel(Heap*); 489 extern void pushrun(Prog*); 490 extern Module* readmod(char*, Module*, int); 491 extern void irecv(void); 492 extern void release(void); 493 extern void releasex(void); 494 extern void retnstr(char*, int, String**); 495 extern void retstr(char*, String**); 496 extern void rungc(Prog*); 497 extern void runtime(Module*, Link*, char*, int, void(*)(void*), Type*); 498 extern void safemem(void*, Type*, void (*)(void*)); 499 extern int segflush(void *, ulong); 500 extern void isend(void); 501 extern void setdbreg(uchar*); 502 extern uchar* setdbloc(uchar*); 503 extern void seterror(char*, ...); 504 extern void sethints(String*, int); 505 extern String* splitc(String**, int); 506 extern uchar* stack(Frame*); 507 extern int stringblen(String*); 508 extern int stringcmp(String*, String*); 509 extern String* stringdup(String*); 510 extern String* stringheap(int, int, int, int); 511 extern char* syserr(char*, char*, Prog*); 512 extern void sysinit(void); 513 extern void sysmodinit(void); 514 extern void tellsomeone(Prog*, char*); 515 extern void tkmodinit(void); 516 extern void unextend(Frame*); 517 extern void unframe(void); 518 extern void unload(Module*); 519 extern int verifysigner(uchar*, int, uchar*, ulong); 520 extern void xec(Prog*); 521 extern void xecalt(int); 522 extern int xprint(Prog*, void*, void*, String*, char*, int); 523 extern int bigxprint(Prog*, void*, void*, String*, char**, int); 524 extern void iyield(void); 525 extern String* newrunes(int); 526 extern String* newstring(int); 527 extern int runeslen(Rune*, int); 528 extern String* c2string(char*, int); 529 extern char* string2c(String*); 530 extern List* cons(ulong, List**); 531 extern String* slicer(ulong, ulong, String*); 532 extern String* addstring(String*, String*, int); 533 extern int brpatch(Inst*, Module*); 534 extern void readimagemodinit(void); 535 536 #define O(t,e) ((long)(&((t*)0)->e)) 537 #define OA(t,e) ((long)(((t*)0)->e)) 538 539 #pragma varargck type "D" Inst* 540 #pragma varargck argpos errorf 1 541