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