xref: /inferno-os/include/interp.h (revision cb6deecc455ddb2a6a83cedaafc576838587d217)
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