137da2899SCharles.Forsyth typedef uchar BYTE; /* 8 bits */ 237da2899SCharles.Forsyth typedef int WORD; /* 32 bits */ 337da2899SCharles.Forsyth typedef unsigned int UWORD; /* 32 bits */ 437da2899SCharles.Forsyth typedef vlong LONG; /* 64 bits */ 537da2899SCharles.Forsyth typedef uvlong ULONG; /* 64 bits */ 637da2899SCharles.Forsyth typedef double REAL; /* 64 double IEEE754 */ 737da2899SCharles.Forsyth typedef short SHORT; /* 16 bits */ 837da2899SCharles.Forsyth typedef float SREAL; /* 32 float IEEE754 */ 937da2899SCharles.Forsyth 1037da2899SCharles.Forsyth enum ProgState 1137da2899SCharles.Forsyth { 1237da2899SCharles.Forsyth Palt, /* blocked in alt instruction */ 1337da2899SCharles.Forsyth Psend, /* waiting to send */ 1437da2899SCharles.Forsyth Precv, /* waiting to recv */ 1537da2899SCharles.Forsyth Pdebug, /* debugged */ 1637da2899SCharles.Forsyth Pready, /* ready to be scheduled */ 1737da2899SCharles.Forsyth Prelease, /* interpreter released */ 1837da2899SCharles.Forsyth Pexiting, /* exit because of kill or error */ 1937da2899SCharles.Forsyth Pbroken, /* thread crashed */ 2037da2899SCharles.Forsyth }; 2137da2899SCharles.Forsyth 2237da2899SCharles.Forsyth enum 2337da2899SCharles.Forsyth { 2437da2899SCharles.Forsyth propagator = 3, /* gc marking color */ 2537da2899SCharles.Forsyth 2637da2899SCharles.Forsyth PRNSIZE = 1024, 2737da2899SCharles.Forsyth BIHASH = 23, 2837da2899SCharles.Forsyth PQUANTA = 2048, /* prog time slice */ 2937da2899SCharles.Forsyth 3037da2899SCharles.Forsyth /* STRUCTALIGN is the unit to which the compiler aligns structs. */ 3137da2899SCharles.Forsyth /* It really should be defined somewhere else */ 3237da2899SCharles.Forsyth STRUCTALIGN = sizeof(int) /* must be >=2 because of Strings */ 3337da2899SCharles.Forsyth }; 3437da2899SCharles.Forsyth 3537da2899SCharles.Forsyth enum 3637da2899SCharles.Forsyth { 37*cb6deeccSforsyth /* Prog and Progs flags */ 38*cb6deeccSforsyth Ppropagate = 1<<0, /* propagate exceptions within group */ 39*cb6deeccSforsyth Pnotifyleader = 1<<1, /* send exceptions to group leader */ 40*cb6deeccSforsyth Prestrict = 1<<2, /* enforce memory limits */ 4137da2899SCharles.Forsyth Prestricted = 1<<3, 42*cb6deeccSforsyth Pkilled = 1<<4, 43*cb6deeccSforsyth Pprivatemem = 1<<5 /* keep heap and stack private */ 4437da2899SCharles.Forsyth }; 4537da2899SCharles.Forsyth 4637da2899SCharles.Forsyth typedef struct Alt Alt; 4737da2899SCharles.Forsyth typedef struct Channel Channel; 4837da2899SCharles.Forsyth typedef struct Progq Progq; 4937da2899SCharles.Forsyth typedef struct Import Import; 50d3ba796fSCharles.Forsyth typedef struct ILock ILock; 5137da2899SCharles.Forsyth typedef struct Inst Inst; 5237da2899SCharles.Forsyth typedef struct Module Module; 5337da2899SCharles.Forsyth typedef struct Modlink Modlink; 5437da2899SCharles.Forsyth typedef struct Modl Modl; 5537da2899SCharles.Forsyth typedef struct Type Type; 5637da2899SCharles.Forsyth typedef struct Prog Prog; 5737da2899SCharles.Forsyth typedef struct Progs Progs; 5837da2899SCharles.Forsyth typedef struct Heap Heap; 5937da2899SCharles.Forsyth typedef struct Link Link; 6037da2899SCharles.Forsyth typedef struct List List; 6137da2899SCharles.Forsyth typedef struct Array Array; 6237da2899SCharles.Forsyth typedef struct String String; 6337da2899SCharles.Forsyth typedef union Linkpc Linkpc; 6437da2899SCharles.Forsyth typedef struct REG REG; 6537da2899SCharles.Forsyth typedef struct Frame Frame; 6637da2899SCharles.Forsyth typedef union Stkext Stkext; 6737da2899SCharles.Forsyth typedef struct Atidle Atidle; 6837da2899SCharles.Forsyth typedef struct Altc Altc; 6937da2899SCharles.Forsyth typedef struct Except Except; 7037da2899SCharles.Forsyth typedef struct Handler Handler; 7137da2899SCharles.Forsyth 72d3ba796fSCharles.Forsyth struct ILock 73d3ba796fSCharles.Forsyth { 74d3ba796fSCharles.Forsyth int lk; 75d3ba796fSCharles.Forsyth int pid; 76d3ba796fSCharles.Forsyth void* ql; 77d3ba796fSCharles.Forsyth }; 78d3ba796fSCharles.Forsyth 7937da2899SCharles.Forsyth struct Frame 8037da2899SCharles.Forsyth { 8137da2899SCharles.Forsyth Inst* lr; /* REGLINK isa.h */ 8237da2899SCharles.Forsyth uchar* fp; /* REGFP */ 8337da2899SCharles.Forsyth Modlink* mr; /* REGMOD */ 8437da2899SCharles.Forsyth Type* t; /* REGTYPE */ 8537da2899SCharles.Forsyth }; 8637da2899SCharles.Forsyth 8737da2899SCharles.Forsyth union Stkext 8837da2899SCharles.Forsyth { 8937da2899SCharles.Forsyth uchar stack[1]; 9037da2899SCharles.Forsyth struct { 9137da2899SCharles.Forsyth Type* TR; 9237da2899SCharles.Forsyth uchar* SP; 9337da2899SCharles.Forsyth uchar* TS; 9437da2899SCharles.Forsyth uchar* EX; 9537da2899SCharles.Forsyth union { 9637da2899SCharles.Forsyth uchar fu[1]; 9737da2899SCharles.Forsyth Frame fr[1]; 9837da2899SCharles.Forsyth } tos; 9937da2899SCharles.Forsyth } reg; 10037da2899SCharles.Forsyth }; 10137da2899SCharles.Forsyth 10237da2899SCharles.Forsyth struct Array 10337da2899SCharles.Forsyth { 10437da2899SCharles.Forsyth WORD len; 10537da2899SCharles.Forsyth Type* t; 10637da2899SCharles.Forsyth Array* root; 10737da2899SCharles.Forsyth uchar* data; 10837da2899SCharles.Forsyth }; 10937da2899SCharles.Forsyth 11037da2899SCharles.Forsyth struct List 11137da2899SCharles.Forsyth { 11237da2899SCharles.Forsyth List* tail; 11337da2899SCharles.Forsyth Type* t; 11437da2899SCharles.Forsyth WORD data[1]; 11537da2899SCharles.Forsyth }; 11637da2899SCharles.Forsyth 11737da2899SCharles.Forsyth struct Channel 11837da2899SCharles.Forsyth { 11937da2899SCharles.Forsyth Array* buf; /* For buffered channels - must be first */ 12037da2899SCharles.Forsyth Progq* send; /* Queue of progs ready to send */ 12137da2899SCharles.Forsyth Progq* recv; /* Queue of progs ready to receive */ 12237da2899SCharles.Forsyth void* aux; /* Rock for devsrv */ 12337da2899SCharles.Forsyth void (*mover)(void); /* Data mover */ 12437da2899SCharles.Forsyth union { 12537da2899SCharles.Forsyth WORD w; 12637da2899SCharles.Forsyth Type* t; 12737da2899SCharles.Forsyth } mid; 12837da2899SCharles.Forsyth int front; /* Front of buffered queue */ 12937da2899SCharles.Forsyth int size; /* Number of data items in buffered queue */ 13037da2899SCharles.Forsyth }; 13137da2899SCharles.Forsyth 13237da2899SCharles.Forsyth struct Progq 13337da2899SCharles.Forsyth { 13437da2899SCharles.Forsyth Prog* prog; 13537da2899SCharles.Forsyth Progq* next; 13637da2899SCharles.Forsyth }; 13737da2899SCharles.Forsyth 13837da2899SCharles.Forsyth struct String 13937da2899SCharles.Forsyth { 14037da2899SCharles.Forsyth int len; /* string length */ 14137da2899SCharles.Forsyth int max; /* maximum length in representation */ 14237da2899SCharles.Forsyth char* tmp; 14337da2899SCharles.Forsyth union { 14437da2899SCharles.Forsyth #define Sascii data.ascii 14537da2899SCharles.Forsyth #define Srune data.runes 14637da2899SCharles.Forsyth char ascii[STRUCTALIGN]; /* string.c relies on having extra space (eg, in string2c) */ 14737da2899SCharles.Forsyth Rune runes[1]; 14837da2899SCharles.Forsyth }data; 14937da2899SCharles.Forsyth }; 15037da2899SCharles.Forsyth 15137da2899SCharles.Forsyth union Linkpc 15237da2899SCharles.Forsyth { 15337da2899SCharles.Forsyth void (*runt)(void*); 15437da2899SCharles.Forsyth Inst* pc; 15537da2899SCharles.Forsyth }; 15637da2899SCharles.Forsyth 15737da2899SCharles.Forsyth struct Link 15837da2899SCharles.Forsyth { 15937da2899SCharles.Forsyth int sig; 16037da2899SCharles.Forsyth Type* frame; 16137da2899SCharles.Forsyth Linkpc u; 16237da2899SCharles.Forsyth char *name; 16337da2899SCharles.Forsyth }; 16437da2899SCharles.Forsyth 16537da2899SCharles.Forsyth typedef union Adr Adr; 16637da2899SCharles.Forsyth union Adr 16737da2899SCharles.Forsyth { 16837da2899SCharles.Forsyth WORD imm; 16937da2899SCharles.Forsyth WORD ind; 17037da2899SCharles.Forsyth Inst* ins; 17137da2899SCharles.Forsyth struct { 17237da2899SCharles.Forsyth ushort f; /* First indirection */ 17337da2899SCharles.Forsyth ushort s; /* Second indirection */ 17437da2899SCharles.Forsyth } i; 17537da2899SCharles.Forsyth }; 17637da2899SCharles.Forsyth 17737da2899SCharles.Forsyth struct Inst 17837da2899SCharles.Forsyth { 17937da2899SCharles.Forsyth uchar op; 18037da2899SCharles.Forsyth uchar add; 18137da2899SCharles.Forsyth ushort reg; 18237da2899SCharles.Forsyth Adr s; 18337da2899SCharles.Forsyth Adr d; 18437da2899SCharles.Forsyth }; 18537da2899SCharles.Forsyth 18637da2899SCharles.Forsyth struct Altc 18737da2899SCharles.Forsyth { 18837da2899SCharles.Forsyth Channel* c; 18937da2899SCharles.Forsyth void* ptr; 19037da2899SCharles.Forsyth }; 19137da2899SCharles.Forsyth 19237da2899SCharles.Forsyth struct Alt 19337da2899SCharles.Forsyth { 19437da2899SCharles.Forsyth int nsend; 19537da2899SCharles.Forsyth int nrecv; 19637da2899SCharles.Forsyth Altc ac[1]; 19737da2899SCharles.Forsyth }; 19837da2899SCharles.Forsyth 19937da2899SCharles.Forsyth struct Type 20037da2899SCharles.Forsyth { 20137da2899SCharles.Forsyth int ref; 20237da2899SCharles.Forsyth void (*free)(Heap*, int); 20337da2899SCharles.Forsyth void (*mark)(Type*, void*); 20437da2899SCharles.Forsyth int size; 20537da2899SCharles.Forsyth int np; 20637da2899SCharles.Forsyth void* destroy; 20737da2899SCharles.Forsyth void* initialize; 20837da2899SCharles.Forsyth uchar map[STRUCTALIGN]; 20937da2899SCharles.Forsyth }; 21037da2899SCharles.Forsyth 21137da2899SCharles.Forsyth struct REG 21237da2899SCharles.Forsyth { 21337da2899SCharles.Forsyth Inst* PC; /* Program counter */ 21437da2899SCharles.Forsyth uchar* MP; /* Module data */ 21537da2899SCharles.Forsyth uchar* FP; /* Frame pointer */ 21637da2899SCharles.Forsyth uchar* SP; /* Stack pointer */ 21737da2899SCharles.Forsyth uchar* TS; /* Top of allocated stack */ 21837da2899SCharles.Forsyth uchar* EX; /* Extent register */ 21937da2899SCharles.Forsyth Modlink* M; /* Module */ 22037da2899SCharles.Forsyth int IC; /* Instruction count for this quanta */ 22137da2899SCharles.Forsyth Inst* xpc; /* Saved program counter */ 22237da2899SCharles.Forsyth void* s; /* Source */ 22337da2899SCharles.Forsyth void* d; /* Destination */ 22437da2899SCharles.Forsyth void* m; /* Middle */ 22537da2899SCharles.Forsyth WORD t; /* Middle temporary */ 22637da2899SCharles.Forsyth WORD st; /* Source temporary */ 22737da2899SCharles.Forsyth WORD dt; /* Destination temporary */ 22837da2899SCharles.Forsyth }; 22937da2899SCharles.Forsyth 23037da2899SCharles.Forsyth struct Progs 23137da2899SCharles.Forsyth { 23237da2899SCharles.Forsyth int id; 23337da2899SCharles.Forsyth int flags; 23437da2899SCharles.Forsyth Progs* parent; 23537da2899SCharles.Forsyth Progs* child; 23637da2899SCharles.Forsyth Progs* sib; 23737da2899SCharles.Forsyth Prog* head; /* live group leader is at head */ 23837da2899SCharles.Forsyth Prog* tail; 23937da2899SCharles.Forsyth }; 24037da2899SCharles.Forsyth 24137da2899SCharles.Forsyth struct Prog 24237da2899SCharles.Forsyth { 24337da2899SCharles.Forsyth REG R; /* Register set */ 24437da2899SCharles.Forsyth Prog* link; /* Run queue */ 24537da2899SCharles.Forsyth Channel* chan; /* Channel pointer */ 24637da2899SCharles.Forsyth void* ptr; /* Channel data pointer */ 24737da2899SCharles.Forsyth enum ProgState state; /* Scheduler state */ 24837da2899SCharles.Forsyth char* kill; /* Set if prog should error */ 24937da2899SCharles.Forsyth char* killstr; /* kill string buffer when needed */ 25037da2899SCharles.Forsyth int pid; /* unique Prog id */ 25137da2899SCharles.Forsyth int quanta; /* time slice */ 25237da2899SCharles.Forsyth ulong ticks; /* time used */ 25337da2899SCharles.Forsyth int flags; /* error recovery flags */ 25437da2899SCharles.Forsyth Prog* prev; 25537da2899SCharles.Forsyth Prog* next; 25637da2899SCharles.Forsyth Prog* pidlink; /* next in pid hash chain */ 25737da2899SCharles.Forsyth Progs* group; /* process group */ 25837da2899SCharles.Forsyth Prog* grpprev; /* previous group member */ 25937da2899SCharles.Forsyth Prog* grpnext; /* next group member */ 26037da2899SCharles.Forsyth void* exval; /* current exception */ 26137da2899SCharles.Forsyth char* exstr; /* last exception */ 26237da2899SCharles.Forsyth void (*addrun)(Prog*); 26337da2899SCharles.Forsyth void (*xec)(Prog*); 26437da2899SCharles.Forsyth 26537da2899SCharles.Forsyth void* osenv; 26637da2899SCharles.Forsyth }; 26737da2899SCharles.Forsyth 26837da2899SCharles.Forsyth struct Module 26937da2899SCharles.Forsyth { 27037da2899SCharles.Forsyth int ref; /* Use count */ 27137da2899SCharles.Forsyth int compiled; /* Compiled into native assembler */ 27237da2899SCharles.Forsyth ulong ss; /* Stack size */ 27337da2899SCharles.Forsyth ulong rt; /* Runtime flags */ 27437da2899SCharles.Forsyth ulong mtime; /* Modtime of dis file */ 27537da2899SCharles.Forsyth Qid qid; /* Qid of dis file */ 27637da2899SCharles.Forsyth ushort dtype; /* type of dis file's server*/ 27737da2899SCharles.Forsyth uint dev; /* subtype of dis file's server */ 27837da2899SCharles.Forsyth int nprog; /* number of instructions */ 27937da2899SCharles.Forsyth Inst* prog; /* text segment */ 28037da2899SCharles.Forsyth uchar* origmp; /* unpolluted Module data */ 28137da2899SCharles.Forsyth int ntype; /* Number of type descriptors */ 28237da2899SCharles.Forsyth Type** type; /* Type descriptors */ 28337da2899SCharles.Forsyth Inst* entry; /* Entry PC */ 28437da2899SCharles.Forsyth Type* entryt; /* Entry frame */ 28537da2899SCharles.Forsyth char* name; /* Implements type */ 28637da2899SCharles.Forsyth char* path; /* File module loaded from */ 28737da2899SCharles.Forsyth Module* link; /* Links */ 28837da2899SCharles.Forsyth Link* ext; /* External dynamic links */ 28937da2899SCharles.Forsyth Import** ldt; /* Internal linkage descriptor tables */ 29037da2899SCharles.Forsyth Handler* htab; /* Exception handler table */ 29137da2899SCharles.Forsyth ulong* pctab; /* dis pc to code pc when compiled */ 29237da2899SCharles.Forsyth void* dlm; /* dynamic C module */ 29337da2899SCharles.Forsyth }; 29437da2899SCharles.Forsyth 29537da2899SCharles.Forsyth struct Modl 29637da2899SCharles.Forsyth { 29737da2899SCharles.Forsyth Linkpc u; /* PC of Dynamic link */ 29837da2899SCharles.Forsyth Type* frame; /* Frame type for this entry */ 29937da2899SCharles.Forsyth }; 30037da2899SCharles.Forsyth 30137da2899SCharles.Forsyth struct Modlink 30237da2899SCharles.Forsyth { 30337da2899SCharles.Forsyth uchar* MP; /* Module data for this instance */ 30437da2899SCharles.Forsyth Module* m; /* The real module */ 30537da2899SCharles.Forsyth int compiled; /* Compiled into native assembler */ 30637da2899SCharles.Forsyth Inst* prog; /* text segment */ 30737da2899SCharles.Forsyth Type** type; /* Type descriptors */ 30837da2899SCharles.Forsyth uchar* data; /* for dynamic C modules */ 30937da2899SCharles.Forsyth int nlinks; /* ?apparently required by Java */ 31037da2899SCharles.Forsyth Modl links[1]; 31137da2899SCharles.Forsyth }; 31237da2899SCharles.Forsyth 3136e425a9dSCharles.Forsyth /* must be a multiple of 8 bytes */ 31437da2899SCharles.Forsyth struct Heap 31537da2899SCharles.Forsyth { 31637da2899SCharles.Forsyth int color; /* Allocation color */ 31737da2899SCharles.Forsyth ulong ref; 31837da2899SCharles.Forsyth Type* t; 3196e425a9dSCharles.Forsyth ulong hprof; /* heap profiling */ 32037da2899SCharles.Forsyth }; 32137da2899SCharles.Forsyth 32237da2899SCharles.Forsyth struct Atidle 32337da2899SCharles.Forsyth { 32437da2899SCharles.Forsyth int (*fn)(void*); 32537da2899SCharles.Forsyth void* arg; 32637da2899SCharles.Forsyth Atidle* link; 32737da2899SCharles.Forsyth }; 32837da2899SCharles.Forsyth 32937da2899SCharles.Forsyth struct Import 33037da2899SCharles.Forsyth { 33137da2899SCharles.Forsyth int sig; 33237da2899SCharles.Forsyth char* name; 33337da2899SCharles.Forsyth }; 33437da2899SCharles.Forsyth 33537da2899SCharles.Forsyth struct Except 33637da2899SCharles.Forsyth { 33737da2899SCharles.Forsyth char* s; 33837da2899SCharles.Forsyth ulong pc; 33937da2899SCharles.Forsyth }; 34037da2899SCharles.Forsyth 34137da2899SCharles.Forsyth struct Handler 34237da2899SCharles.Forsyth { 34337da2899SCharles.Forsyth ulong pc1; 34437da2899SCharles.Forsyth ulong pc2; 34537da2899SCharles.Forsyth ulong eoff; 34637da2899SCharles.Forsyth ulong ne; 34737da2899SCharles.Forsyth Type* t; 34837da2899SCharles.Forsyth Except* etab; 34937da2899SCharles.Forsyth }; 35037da2899SCharles.Forsyth 35137da2899SCharles.Forsyth #define H2D(t, x) ((t)(((uchar*)(x))+sizeof(Heap))) 35237da2899SCharles.Forsyth #define D2H(x) ((Heap*)(((uchar*)(x))-sizeof(Heap))) 35337da2899SCharles.Forsyth #define H ((void*)(-1)) 35437da2899SCharles.Forsyth #define SEXTYPE(f) ((Stkext*)((uchar*)(f)-OA(Stkext, reg.tos.fu))) 35537da2899SCharles.Forsyth #define Setmark(h) if((h)->color!=mutator) { (h)->color = propagator; nprop=1; } 35637da2899SCharles.Forsyth #define gclock() gchalt++ 35737da2899SCharles.Forsyth #define gcunlock() gchalt-- 35837da2899SCharles.Forsyth #define gcruns() (gchalt == 0) 35937da2899SCharles.Forsyth 36037da2899SCharles.Forsyth extern int bflag; 36137da2899SCharles.Forsyth extern int cflag; 36237da2899SCharles.Forsyth extern int nproc; 36337da2899SCharles.Forsyth extern Type Tarray; 36437da2899SCharles.Forsyth extern Type Tstring; 36537da2899SCharles.Forsyth extern Type Tchannel; 36637da2899SCharles.Forsyth extern Type Tlist; 36737da2899SCharles.Forsyth extern Type Tmodlink; 36837da2899SCharles.Forsyth extern Type* TImage; 36937da2899SCharles.Forsyth extern Type Tptr; 37037da2899SCharles.Forsyth extern Type Tbyte; 37137da2899SCharles.Forsyth extern Type Tword; 37237da2899SCharles.Forsyth extern Type Tlong; 37337da2899SCharles.Forsyth extern Type Treal; 37437da2899SCharles.Forsyth extern REG R; 37537da2899SCharles.Forsyth extern String snil; 37637da2899SCharles.Forsyth extern void (*optab[256])(void); 37737da2899SCharles.Forsyth extern void (*comvec)(void); 37837da2899SCharles.Forsyth extern void (*dec[])(void); 37937da2899SCharles.Forsyth extern Module* modules; 38037da2899SCharles.Forsyth extern int mutator; 38137da2899SCharles.Forsyth extern int nprop; 38237da2899SCharles.Forsyth extern int gchalt; 38337da2899SCharles.Forsyth extern int gccolor; 38437da2899SCharles.Forsyth extern int minvalid; 38537da2899SCharles.Forsyth 38637da2899SCharles.Forsyth extern int Dconv(Fmt*); 38737da2899SCharles.Forsyth extern void acquire(void); 38837da2899SCharles.Forsyth extern void addrun(Prog*); 38937da2899SCharles.Forsyth extern void altdone(Alt*, Prog*, Channel*, int); 39037da2899SCharles.Forsyth extern void altgone(Prog*); 39137da2899SCharles.Forsyth extern Array* allocimgarray(Heap*, Heap*); 39237da2899SCharles.Forsyth extern Module* builtinmod(char*, void*, int); 39337da2899SCharles.Forsyth extern void cblock(Prog*); 3947de2b42dSforsyth extern void* checktype(void*, Type*, char*, int); 39537da2899SCharles.Forsyth extern void cmovw(void*, void*); 39637da2899SCharles.Forsyth extern Channel* cnewc(Type*, void (*)(void), int); 39737da2899SCharles.Forsyth extern int compile(Module*, int, Modlink*); 39837da2899SCharles.Forsyth extern void cqadd(Progq**, Prog*); 39937da2899SCharles.Forsyth extern void cqdel(Progq**); 40037da2899SCharles.Forsyth extern void cqdelp(Progq**, Prog*); 40137da2899SCharles.Forsyth extern void crecv(Channel*, void*); 40237da2899SCharles.Forsyth extern void csend(Channel*, void*); 40337da2899SCharles.Forsyth extern int csendalt(Channel*, void*, Type *, int); 40437da2899SCharles.Forsyth extern Prog* currun(void); 40537da2899SCharles.Forsyth extern void dbgexit(Prog*, int, char*); 40637da2899SCharles.Forsyth extern void dbgxec(Prog*); 40737da2899SCharles.Forsyth extern void delprog(Prog*, char*); 40837da2899SCharles.Forsyth extern Prog* delrun(int); 40937da2899SCharles.Forsyth extern void delrunq(Prog*); 41037da2899SCharles.Forsyth extern Prog* delruntail(int); 41137da2899SCharles.Forsyth extern void destroy(void*); 41237da2899SCharles.Forsyth extern void destroyimage(ulong); 41337da2899SCharles.Forsyth extern void destroylinks(Module*); 41437da2899SCharles.Forsyth extern void destroystack(REG*); 41537da2899SCharles.Forsyth extern void drawmodinit(void); 4167de2b42dSforsyth extern Type* dtype(void (*)(Heap*, int), int, uchar*, int); 4177de2b42dSforsyth extern Module* dupmod(Module*); 41837da2899SCharles.Forsyth extern int dynldable(int); 419d3ba796fSCharles.Forsyth extern void iqlock(ILock*); 420d3ba796fSCharles.Forsyth extern void iqunlock(ILock*); 42137da2899SCharles.Forsyth extern void loadermodinit(void); 42237da2899SCharles.Forsyth extern void error(char*); 42337da2899SCharles.Forsyth extern void errorf(char*, ...); 42437da2899SCharles.Forsyth extern void extend(void); 42537da2899SCharles.Forsyth extern void freedyncode(Module*); 42637da2899SCharles.Forsyth extern void freedyndata(Modlink*); 42737da2899SCharles.Forsyth extern void freemod(Module*); 42837da2899SCharles.Forsyth extern void freeheap(Heap*, int); 42937da2899SCharles.Forsyth extern void freeptrs(void*, Type*); 43037da2899SCharles.Forsyth extern void freestring(Heap*, int); 43137da2899SCharles.Forsyth extern void freetype(Type*); 43237da2899SCharles.Forsyth extern void freetypemodinit(void); 43337da2899SCharles.Forsyth extern long getdbreg(); 43437da2899SCharles.Forsyth extern int gfltconv(Fmt*); 43537da2899SCharles.Forsyth extern void go(Module*); 43637da2899SCharles.Forsyth extern int handler(char*); 43737da2899SCharles.Forsyth extern Heap* heap(Type*); 43837da2899SCharles.Forsyth extern Heap* heaparray(Type*, int); 43937da2899SCharles.Forsyth extern void (*heapmonitor)(int, void*, ulong); 44037da2899SCharles.Forsyth extern int heapref(void*); 44137da2899SCharles.Forsyth extern Heap* heapz(Type*); 44237da2899SCharles.Forsyth extern int hmsize(void*); 44337da2899SCharles.Forsyth extern void incmem(void*, Type*); 44437da2899SCharles.Forsyth extern void initarray(Type*, Array*); 44537da2899SCharles.Forsyth extern void initmem(Type*, void*); 44637da2899SCharles.Forsyth extern void irestore(Prog*); 44737da2899SCharles.Forsyth extern Prog* isave(void); 44837da2899SCharles.Forsyth extern void keyringmodinit(void); 44937da2899SCharles.Forsyth extern void killcomm(Progq **p); 45037da2899SCharles.Forsyth extern int killprog(Prog*, char*); 45137da2899SCharles.Forsyth extern int killgrp(Prog*, char*); 45237da2899SCharles.Forsyth extern Modlink* linkmod(Module*, Import*, int); 45337da2899SCharles.Forsyth extern Modlink* mklinkmod(Module*, int); 45437da2899SCharles.Forsyth extern Module* load(char*); 45537da2899SCharles.Forsyth extern Module* lookmod(char*); 45637da2899SCharles.Forsyth extern long magic(void); 45737da2899SCharles.Forsyth extern void markarray(Type*, void*); 45837da2899SCharles.Forsyth extern void markchan(Type*, void*); 45937da2899SCharles.Forsyth extern void markheap(Type*, void*); 46037da2899SCharles.Forsyth extern void marklist(Type*, void*); 46137da2899SCharles.Forsyth extern void markmodl(Type*, void*); 46237da2899SCharles.Forsyth extern void mathmodinit(void); 46337da2899SCharles.Forsyth extern Array* mem2array(void*, int); 46437da2899SCharles.Forsyth extern void mlink(Module*, Link*, uchar*, int, int, Type*); 46537da2899SCharles.Forsyth extern void modinit(void); 46637da2899SCharles.Forsyth extern WORD modstatus(REG*, char*, int); 46737da2899SCharles.Forsyth extern void movp(void); 46837da2899SCharles.Forsyth extern void movtmp(void); 46937da2899SCharles.Forsyth extern void movtmpsafe(void); 47037da2899SCharles.Forsyth extern int mustbesigned(char*, uchar*, ulong, Dir*); 47137da2899SCharles.Forsyth extern Module* newmod(char*); 47237da2899SCharles.Forsyth extern Module* newdyncode(int, char*, Dir*); 47337da2899SCharles.Forsyth extern void newdyndata(Modlink*); 47437da2899SCharles.Forsyth extern void newgrp(Prog*); 47537da2899SCharles.Forsyth extern void newmp(void*, void*, Type*); 47637da2899SCharles.Forsyth extern Prog* newprog(Prog*, Modlink*); 47737da2899SCharles.Forsyth extern void newstack(Prog*); 47837da2899SCharles.Forsyth extern Heap* nheap(int); 47937da2899SCharles.Forsyth extern void noptrs(Type*, void*); 48037da2899SCharles.Forsyth extern int nprog(void); 48137da2899SCharles.Forsyth extern void opinit(void); 48237da2899SCharles.Forsyth extern Module* parsemod(char*, uchar*, ulong, Dir*); 48337da2899SCharles.Forsyth extern Module* parsedmod(char*, int, ulong, Qid); 48437da2899SCharles.Forsyth extern void prefabmodinit(void); 48537da2899SCharles.Forsyth extern Prog* progn(int); 48637da2899SCharles.Forsyth extern Prog* progpid(int); 48737da2899SCharles.Forsyth extern void ptradd(Heap*); 48837da2899SCharles.Forsyth extern void ptrdel(Heap*); 48937da2899SCharles.Forsyth extern void pushrun(Prog*); 49037da2899SCharles.Forsyth extern Module* readmod(char*, Module*, int); 49137da2899SCharles.Forsyth extern void irecv(void); 49237da2899SCharles.Forsyth extern void release(void); 49337da2899SCharles.Forsyth extern void releasex(void); 49437da2899SCharles.Forsyth extern void retnstr(char*, int, String**); 49537da2899SCharles.Forsyth extern void retstr(char*, String**); 49637da2899SCharles.Forsyth extern void rungc(Prog*); 49737da2899SCharles.Forsyth extern void runtime(Module*, Link*, char*, int, void(*)(void*), Type*); 49837da2899SCharles.Forsyth extern void safemem(void*, Type*, void (*)(void*)); 49937da2899SCharles.Forsyth extern int segflush(void *, ulong); 50037da2899SCharles.Forsyth extern void isend(void); 50137da2899SCharles.Forsyth extern void setdbreg(uchar*); 50237da2899SCharles.Forsyth extern uchar* setdbloc(uchar*); 50337da2899SCharles.Forsyth extern void seterror(char*, ...); 50437da2899SCharles.Forsyth extern void sethints(String*, int); 50537da2899SCharles.Forsyth extern String* splitc(String**, int); 50637da2899SCharles.Forsyth extern uchar* stack(Frame*); 50737da2899SCharles.Forsyth extern int stringblen(String*); 50837da2899SCharles.Forsyth extern int stringcmp(String*, String*); 50937da2899SCharles.Forsyth extern String* stringdup(String*); 51037da2899SCharles.Forsyth extern String* stringheap(int, int, int, int); 51137da2899SCharles.Forsyth extern char* syserr(char*, char*, Prog*); 51237da2899SCharles.Forsyth extern void sysinit(void); 51337da2899SCharles.Forsyth extern void sysmodinit(void); 51437da2899SCharles.Forsyth extern void tellsomeone(Prog*, char*); 51537da2899SCharles.Forsyth extern void tkmodinit(void); 51637da2899SCharles.Forsyth extern void unextend(Frame*); 51737da2899SCharles.Forsyth extern void unframe(void); 51837da2899SCharles.Forsyth extern void unload(Module*); 51937da2899SCharles.Forsyth extern int verifysigner(uchar*, int, uchar*, ulong); 52037da2899SCharles.Forsyth extern void xec(Prog*); 52137da2899SCharles.Forsyth extern void xecalt(int); 52237da2899SCharles.Forsyth extern int xprint(Prog*, void*, void*, String*, char*, int); 52337da2899SCharles.Forsyth extern int bigxprint(Prog*, void*, void*, String*, char**, int); 52437da2899SCharles.Forsyth extern void iyield(void); 52537da2899SCharles.Forsyth extern String* newrunes(int); 52637da2899SCharles.Forsyth extern String* newstring(int); 52737da2899SCharles.Forsyth extern int runeslen(Rune*, int); 52837da2899SCharles.Forsyth extern String* c2string(char*, int); 52937da2899SCharles.Forsyth extern char* string2c(String*); 53037da2899SCharles.Forsyth extern List* cons(ulong, List**); 53137da2899SCharles.Forsyth extern String* slicer(ulong, ulong, String*); 53237da2899SCharles.Forsyth extern String* addstring(String*, String*, int); 53337da2899SCharles.Forsyth extern int brpatch(Inst*, Module*); 53437da2899SCharles.Forsyth extern void readimagemodinit(void); 53537da2899SCharles.Forsyth 53637da2899SCharles.Forsyth #define O(t,e) ((long)(&((t*)0)->e)) 53737da2899SCharles.Forsyth #define OA(t,e) ((long)(((t*)0)->e)) 53837da2899SCharles.Forsyth 53937da2899SCharles.Forsyth #pragma varargck type "D" Inst* 54037da2899SCharles.Forsyth #pragma varargck argpos errorf 1 541