xref: /plan9/sys/include/mach.h (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
13e12c5d1SDavid du Colombier /*
2219b2ee8SDavid du Colombier  *	Architecture-dependent application data
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier #include "a.out.h"
5219b2ee8SDavid du Colombier #pragma	src	"/sys/src/libmach"
63e12c5d1SDavid du Colombier #pragma	lib	"libmach.a"
73e12c5d1SDavid du Colombier /*
8bd389b36SDavid du Colombier  *	Supported architectures:
9bd389b36SDavid du Colombier  *		mips,
10bd389b36SDavid du Colombier  *		68020,
11bd389b36SDavid du Colombier  *		i386,
12bd389b36SDavid du Colombier  *		sparc,
13bd389b36SDavid du Colombier  *		i960 (limited)
14219b2ee8SDavid du Colombier  *		3210DSP (limited)
157dd7cddfSDavid du Colombier  *		mips2 (R4000)
167dd7cddfSDavid du Colombier  *		arm (limited)
177dd7cddfSDavid du Colombier  *		power pc (limited)
183e12c5d1SDavid du Colombier */
193e12c5d1SDavid du Colombier enum
203e12c5d1SDavid du Colombier {
213e12c5d1SDavid du Colombier 	MMIPS,			/* machine types */
223e12c5d1SDavid du Colombier 	MSPARC,
233e12c5d1SDavid du Colombier 	M68020,
243e12c5d1SDavid du Colombier 	MI386,
253e12c5d1SDavid du Colombier 	MI960,
26219b2ee8SDavid du Colombier 	M3210,
277dd7cddfSDavid du Colombier 	MMIPS2,
287dd7cddfSDavid du Colombier 	NMIPS2,
297dd7cddfSDavid du Colombier 	M29000,
307dd7cddfSDavid du Colombier 	MARM,
317dd7cddfSDavid du Colombier 	MPOWER,
327dd7cddfSDavid du Colombier 	MALPHA,
33*3ff48bf5SDavid du Colombier 	NMIPS,
347dd7cddfSDavid du Colombier 				/* types of executables */
35219b2ee8SDavid du Colombier 	FNONE = 0,		/* unidentified */
363e12c5d1SDavid du Colombier 	FMIPS,			/* v.out */
373e12c5d1SDavid du Colombier 	FMIPSB,			/* mips bootable */
383e12c5d1SDavid du Colombier 	FSPARC,			/* k.out */
393e12c5d1SDavid du Colombier 	FSPARCB,		/* Sparc bootable */
403e12c5d1SDavid du Colombier 	F68020,			/* 2.out */
413e12c5d1SDavid du Colombier 	F68020B,		/* 68020 bootable */
423e12c5d1SDavid du Colombier 	FNEXTB,			/* Next bootable */
433e12c5d1SDavid du Colombier 	FI386,			/* 8.out */
443e12c5d1SDavid du Colombier 	FI386B,			/* I386 bootable */
453e12c5d1SDavid du Colombier 	FI960,			/* 6.out */
463e12c5d1SDavid du Colombier 	FI960B,			/* I960 bootable */
47219b2ee8SDavid du Colombier 	F3210,			/* x.out */
487dd7cddfSDavid du Colombier 	FMIPS2BE,			/* 4.out */
497dd7cddfSDavid du Colombier 	F29000,			/* 9.out */
507dd7cddfSDavid du Colombier 	FARM,			/* 5.out */
517dd7cddfSDavid du Colombier 	FARMB,			/* ARM bootable */
527dd7cddfSDavid du Colombier 	FPOWER,			/* q.out */
537dd7cddfSDavid du Colombier 	FPOWERB,		/* power pc bootable */
547dd7cddfSDavid du Colombier 	FMIPS2LE,		/* 4k little endian */
557dd7cddfSDavid du Colombier 	FALPHA,		/* 7.out */
567dd7cddfSDavid du Colombier 	FALPHAB,		/* DEC Alpha bootable */
57*3ff48bf5SDavid du Colombier 	FMIPSLE,		/* 3k little endian */
583e12c5d1SDavid du Colombier 
59219b2ee8SDavid du Colombier 	ANONE = 0,		/* dissembler types */
603e12c5d1SDavid du Colombier 	AMIPS,
613e12c5d1SDavid du Colombier 	AMIPSCO,		/* native mips */
623e12c5d1SDavid du Colombier 	ASPARC,
633e12c5d1SDavid du Colombier 	ASUNSPARC,		/* native sun */
643e12c5d1SDavid du Colombier 	A68020,
653e12c5d1SDavid du Colombier 	AI386,
663e12c5d1SDavid du Colombier 	AI8086,			/* oh god */
673e12c5d1SDavid du Colombier 	AI960,
687dd7cddfSDavid du Colombier 	A29000,
697dd7cddfSDavid du Colombier 	AARM,
707dd7cddfSDavid du Colombier 	APOWER,
717dd7cddfSDavid du Colombier 	AALPHA,
72bd389b36SDavid du Colombier 				/* object file types */
73bd389b36SDavid du Colombier 	Obj68020 = 0,		/* .2 */
74219b2ee8SDavid du Colombier 	ObjSparc,		/* .k */
75219b2ee8SDavid du Colombier 	ObjMips,		/* .v */
76219b2ee8SDavid du Colombier 	Obj386,			/* .8 */
77219b2ee8SDavid du Colombier 	Obj960,			/* .6 */
78219b2ee8SDavid du Colombier 	Obj3210,		/* .x */
797dd7cddfSDavid du Colombier 	ObjMips2,		/* .4 */
807dd7cddfSDavid du Colombier 	Obj29000,		/* .9 */
817dd7cddfSDavid du Colombier 	ObjArm,			/* .5 */
827dd7cddfSDavid du Colombier 	ObjPower,		/* .q */
837dd7cddfSDavid du Colombier 	ObjMips2le,		/* .0 */
847dd7cddfSDavid du Colombier 	ObjAlpha,		/* .7 */
85219b2ee8SDavid du Colombier 	Maxobjtype,
863e12c5d1SDavid du Colombier 
873e12c5d1SDavid du Colombier 	CNONE  = 0,		/* symbol table classes */
88219b2ee8SDavid du Colombier 	CAUTO,
89219b2ee8SDavid du Colombier 	CPARAM,
90219b2ee8SDavid du Colombier 	CSTAB,
91219b2ee8SDavid du Colombier 	CTEXT,
92219b2ee8SDavid du Colombier 	CDATA,
93219b2ee8SDavid du Colombier 	CANY,			/* to look for any class */
943e12c5d1SDavid du Colombier };
95219b2ee8SDavid du Colombier 
96219b2ee8SDavid du Colombier typedef	struct	Map	Map;
97219b2ee8SDavid du Colombier typedef struct	Symbol	Symbol;
98219b2ee8SDavid du Colombier typedef	struct	Reglist	Reglist;
99219b2ee8SDavid du Colombier typedef	struct	Mach	Mach;
100219b2ee8SDavid du Colombier typedef	struct	Machdata Machdata;
101219b2ee8SDavid du Colombier 
1023e12c5d1SDavid du Colombier /*
103bd389b36SDavid du Colombier  * 	Structure to map a segment to a position in a file
1043e12c5d1SDavid du Colombier  */
105219b2ee8SDavid du Colombier struct Map {
106219b2ee8SDavid du Colombier 	int	nsegs;			/* number of segments */
107219b2ee8SDavid du Colombier 	struct segment {		/* per-segment map */
1083e12c5d1SDavid du Colombier 		char	*name;		/* the segment name */
1097dd7cddfSDavid du Colombier 		int	fd;		/* file descriptor */
110bd389b36SDavid du Colombier 		int	inuse;		/* in use - not in use */
1113e12c5d1SDavid du Colombier 		ulong	b;		/* base */
1123e12c5d1SDavid du Colombier 		ulong	e;		/* end */
1133e12c5d1SDavid du Colombier 		ulong	f;		/* offset within file */
114219b2ee8SDavid du Colombier 	} seg[1];			/* actually n of these */
115219b2ee8SDavid du Colombier };
1167dd7cddfSDavid du Colombier 
117219b2ee8SDavid du Colombier /*
118219b2ee8SDavid du Colombier  *	Internal structure describing a symbol table entry
119219b2ee8SDavid du Colombier  */
120219b2ee8SDavid du Colombier struct Symbol {
121219b2ee8SDavid du Colombier 	void 	*handle;		/* used internally - owning func */
122219b2ee8SDavid du Colombier 	struct {
123219b2ee8SDavid du Colombier 		char	*name;
124219b2ee8SDavid du Colombier 		long	value;		/* address or stack offset */
125219b2ee8SDavid du Colombier 		char	type;		/* as in a.out.h */
126219b2ee8SDavid du Colombier 		char	class;		/* as above */
127219b2ee8SDavid du Colombier 	};
1283e12c5d1SDavid du Colombier };
1297dd7cddfSDavid du Colombier 
1303e12c5d1SDavid du Colombier /*
1313e12c5d1SDavid du Colombier  *	machine register description
1323e12c5d1SDavid du Colombier  */
133219b2ee8SDavid du Colombier struct Reglist {
1343e12c5d1SDavid du Colombier 	char	*rname;			/* register name */
1353e12c5d1SDavid du Colombier 	short	roffs;			/* offset in u-block */
136219b2ee8SDavid du Colombier 	char	rflags;			/* INTEGER/FLOAT, WRITABLE */
137bd389b36SDavid du Colombier 	char	rformat;		/* print format: 'x', 'X', 'f', '8' */
138219b2ee8SDavid du Colombier };
139219b2ee8SDavid du Colombier 
140219b2ee8SDavid du Colombier enum {				/* bits in rflags field */
141219b2ee8SDavid du Colombier 	RINT	= (0<<0),
142219b2ee8SDavid du Colombier 	RFLT	= (1<<0),
143219b2ee8SDavid du Colombier 	RRDONLY	= (1<<1),
1443e12c5d1SDavid du Colombier };
1453e12c5d1SDavid du Colombier /*
146219b2ee8SDavid du Colombier  *	Machine-dependent data is stored in two structures:
147219b2ee8SDavid du Colombier  *		Mach  - miscellaneous general parameters
148219b2ee8SDavid du Colombier  *		Machdata - jump vector of service functions used by debuggers
149219b2ee8SDavid du Colombier  *
1507dd7cddfSDavid du Colombier  *	Mach is defined in 2.c, 4.c, v.c, k.c, 8.c, 6.c and set in executable.c
151219b2ee8SDavid du Colombier  *
1527dd7cddfSDavid du Colombier  *	Machdata is defined in 2db.c, 4db.c, vdb.c, kdb.c, 8db.c, and 6db.c
153219b2ee8SDavid du Colombier  *		and set in the debugger startup.
1543e12c5d1SDavid du Colombier  */
155219b2ee8SDavid du Colombier 
156219b2ee8SDavid du Colombier 
1573e12c5d1SDavid du Colombier struct Mach{
1583e12c5d1SDavid du Colombier 	char	*name;
159219b2ee8SDavid du Colombier 	int	mtype;			/* machine type code */
1603e12c5d1SDavid du Colombier 	Reglist *reglist;		/* register set */
1617dd7cddfSDavid du Colombier 	ulong	regsize;		/* sizeof registers in bytes*/
1627dd7cddfSDavid du Colombier 	ulong	fpregsize;		/* sizeof fp registers in bytes*/
163219b2ee8SDavid du Colombier 	char	*pc;			/* pc name */
164219b2ee8SDavid du Colombier 	char	*sp;			/* sp name */
165219b2ee8SDavid du Colombier 	char	*link;			/* link register name */
1663e12c5d1SDavid du Colombier 	char	*sbreg;			/* static base register name */
1677dd7cddfSDavid du Colombier 	ulong	sb;			/* static base register value */
1687dd7cddfSDavid du Colombier 	int	pgsize;			/* page size */
1697dd7cddfSDavid du Colombier 	ulong	kbase;			/* kernel base address */
1707dd7cddfSDavid du Colombier 	ulong	ktmask;			/* ktzero = kbase & ~ktmask */
1717dd7cddfSDavid du Colombier 	int	pcquant;		/* quantization of pc */
1723e12c5d1SDavid du Colombier 	int	szaddr;			/* sizeof(void*) */
1733e12c5d1SDavid du Colombier 	int	szreg;			/* sizeof(register) */
1743e12c5d1SDavid du Colombier 	int	szfloat;		/* sizeof(float) */
1753e12c5d1SDavid du Colombier 	int	szdouble;		/* sizeof(double) */
1763e12c5d1SDavid du Colombier };
1773e12c5d1SDavid du Colombier 
1783e12c5d1SDavid du Colombier extern	Mach	*mach;			/* Current machine */
1793e12c5d1SDavid du Colombier 
1807dd7cddfSDavid du Colombier typedef vlong	(*Rgetter)(Map*, char*);
181219b2ee8SDavid du Colombier typedef	void	(*Tracer)(Map*, ulong, ulong, Symbol*);
1823e12c5d1SDavid du Colombier 
183219b2ee8SDavid du Colombier struct	Machdata {		/* Machine-dependent debugger support */
1843e12c5d1SDavid du Colombier 	uchar	bpinst[4];			/* break point instr. */
1853e12c5d1SDavid du Colombier 	short	bpsize;				/* size of break point instr. */
1863e12c5d1SDavid du Colombier 
187219b2ee8SDavid du Colombier 	ushort	(*swab)(ushort);		/* short to local byte order */
188219b2ee8SDavid du Colombier 	long	(*swal)(long);			/* long to local byte order */
1897dd7cddfSDavid du Colombier 	vlong	(*swav)(vlong);			/* vlong to local byte order */
190219b2ee8SDavid du Colombier 	int	(*ctrace)(Map*, ulong, ulong, ulong, Tracer); /* C traceback */
191219b2ee8SDavid du Colombier 	ulong	(*findframe)(Map*, ulong, ulong, ulong, ulong);/* frame finder */
192219b2ee8SDavid du Colombier 	char*	(*excep)(Map*, Rgetter);	/* last exception */
1933e12c5d1SDavid du Colombier 	ulong	(*bpfix)(ulong);		/* breakpoint fixup */
194219b2ee8SDavid du Colombier 	int	(*sftos)(char*, int, void*);	/* single precision float */
195219b2ee8SDavid du Colombier 	int	(*dftos)(char*, int, void*);	/* double precision float */
196219b2ee8SDavid du Colombier 	int	(*foll)(Map*, ulong, Rgetter, ulong*);	/* follow set */
197219b2ee8SDavid du Colombier 	int	(*das)(Map*, ulong, char, char*, int);	/* symbolic disassembly */
198219b2ee8SDavid du Colombier 	int	(*hexinst)(Map*, ulong, char*, int); 	/* hex disassembly */
199219b2ee8SDavid du Colombier 	int	(*instsize)(Map*, ulong);	/* instruction size */
2003e12c5d1SDavid du Colombier };
2013e12c5d1SDavid du Colombier 
2023e12c5d1SDavid du Colombier /*
203bd389b36SDavid du Colombier  *	Common a.out header describing all architectures
2043e12c5d1SDavid du Colombier  */
2053e12c5d1SDavid du Colombier typedef struct Fhdr
2063e12c5d1SDavid du Colombier {
2073e12c5d1SDavid du Colombier 	char	*name;		/* identifier of executable */
2083e12c5d1SDavid du Colombier 	short	type;		/* file type - see codes above*/
2093e12c5d1SDavid du Colombier 	short	hdrsz;		/* size of this header */
2103e12c5d1SDavid du Colombier 	long	magic;		/* magic number */
2113e12c5d1SDavid du Colombier 	long	txtaddr;	/* text address */
2123e12c5d1SDavid du Colombier 	long	entry;		/* entry point */
2133e12c5d1SDavid du Colombier 	long	txtsz;		/* text size */
2143e12c5d1SDavid du Colombier 	long	txtoff;		/* start of text in file */
2153e12c5d1SDavid du Colombier 	long	dataddr;	/* start of data segment */
2163e12c5d1SDavid du Colombier 	long	datsz;		/* size of data seg */
2173e12c5d1SDavid du Colombier 	long	datoff;		/* offset to data seg in file */
2183e12c5d1SDavid du Colombier 	long	bsssz;		/* size of bss */
2193e12c5d1SDavid du Colombier 	long	symsz;		/* size of symbol table */
2203e12c5d1SDavid du Colombier 	long	symoff;		/* offset of symbol table in file */
2213e12c5d1SDavid du Colombier 	long	sppcsz;		/* size of sp-pc table */
2223e12c5d1SDavid du Colombier 	long	sppcoff;	/* offset of sp-pc table in file */
2233e12c5d1SDavid du Colombier 	long	lnpcsz;		/* size of line number-pc table */
2243e12c5d1SDavid du Colombier 	long	lnpcoff;	/* size of line number-pc table */
2253e12c5d1SDavid du Colombier } Fhdr;
2263e12c5d1SDavid du Colombier 
227219b2ee8SDavid du Colombier extern	int	asstype;		/* dissembler type - machdata.c */
228219b2ee8SDavid du Colombier extern	Machdata *machdata;		/* jump vector - machdata.c */
2293e12c5d1SDavid du Colombier 
2307dd7cddfSDavid du Colombier Map*		attachproc(int, int, int, Fhdr*);
231219b2ee8SDavid du Colombier int		beieee80ftos(char*, int, void*);
232219b2ee8SDavid du Colombier int		beieeesftos(char*, int, void*);
233219b2ee8SDavid du Colombier int		beieeedftos(char*, int, void*);
2343e12c5d1SDavid du Colombier ushort		beswab(ushort);
2353e12c5d1SDavid du Colombier long		beswal(long);
2367dd7cddfSDavid du Colombier vlong		beswav(vlong);
237219b2ee8SDavid du Colombier int		cisctrace(Map*, ulong, ulong, ulong, Tracer);
238219b2ee8SDavid du Colombier ulong		ciscframe(Map*, ulong, ulong, ulong, ulong);
239219b2ee8SDavid du Colombier int		crackhdr(int fd, Fhdr*);
2403e12c5d1SDavid du Colombier long		file2pc(char*, ulong);
2413e12c5d1SDavid du Colombier int		fileelem(Sym**, uchar *, char*, int);
2423e12c5d1SDavid du Colombier int		fileline(char*, int, ulong);
243bd389b36SDavid du Colombier int		filesym(int, char*, int);
2443e12c5d1SDavid du Colombier int		findlocal(Symbol*, char*, Symbol*);
245219b2ee8SDavid du Colombier int		findseg(Map*, char*);
2463e12c5d1SDavid du Colombier int		findsym(long, int, Symbol *);
247219b2ee8SDavid du Colombier int		fnbound(long, ulong*);
248219b2ee8SDavid du Colombier int		fpformat(Map*, Reglist*, char*, int, int);
249219b2ee8SDavid du Colombier int		get1(Map*, ulong, uchar*, int);
250219b2ee8SDavid du Colombier int		get2(Map*, ulong, ushort*);
251219b2ee8SDavid du Colombier int		get4(Map*, ulong, long*);
2527dd7cddfSDavid du Colombier int		get8(Map*, ulong, vlong*);
2533e12c5d1SDavid du Colombier int		getauto(Symbol*, int, int, Symbol*);
2543e12c5d1SDavid du Colombier Sym*		getsym(int);
2553e12c5d1SDavid du Colombier int		globalsym(Symbol *, int);
256219b2ee8SDavid du Colombier char*		_hexify(char*, ulong, int);
257219b2ee8SDavid du Colombier int		ieeesftos(char*, int, ulong);
258219b2ee8SDavid du Colombier int		ieeedftos(char*, int, ulong, ulong);
259bd389b36SDavid du Colombier int		isar(Biobuf*);
260219b2ee8SDavid du Colombier int		leieee80ftos(char*, int, void*);
261219b2ee8SDavid du Colombier int		leieeesftos(char*, int, void*);
262219b2ee8SDavid du Colombier int		leieeedftos(char*, int, void*);
2633e12c5d1SDavid du Colombier ushort		leswab(ushort);
2643e12c5d1SDavid du Colombier long		leswal(long);
2657dd7cddfSDavid du Colombier vlong		leswav(vlong);
266bd389b36SDavid du Colombier long		line2addr(ulong, ulong, ulong);
2673e12c5d1SDavid du Colombier Map*		loadmap(Map*, int, Fhdr*);
268219b2ee8SDavid du Colombier int		localaddr(Map*, char*, char*, long*, Rgetter);
2693e12c5d1SDavid du Colombier int		localsym(Symbol*, int);
2703e12c5d1SDavid du Colombier int		lookup(char*, char*, Symbol*);
2713e12c5d1SDavid du Colombier void		machbytype(int);
2723e12c5d1SDavid du Colombier int		machbyname(char*);
273bd389b36SDavid du Colombier int		nextar(Biobuf*, int, char*);
2747dd7cddfSDavid du Colombier Map*		newmap(Map*, int);
275219b2ee8SDavid du Colombier void		objtraverse(void(*)(Sym*, void*), void*);
276219b2ee8SDavid du Colombier int		objtype(Biobuf*, char**);
2773e12c5d1SDavid du Colombier long		pc2sp(ulong);
2783e12c5d1SDavid du Colombier long		pc2line(ulong);
279219b2ee8SDavid du Colombier int		put1(Map*, ulong, uchar*, int);
280219b2ee8SDavid du Colombier int		put2(Map*, ulong, ushort);
281219b2ee8SDavid du Colombier int		put4(Map*, ulong, long);
2827dd7cddfSDavid du Colombier int		put8(Map*, ulong, vlong);
283219b2ee8SDavid du Colombier int		readar(Biobuf*, int, int, int);
284bd389b36SDavid du Colombier int		readobj(Biobuf*, int);
285219b2ee8SDavid du Colombier ulong		riscframe(Map*, ulong, ulong, ulong, ulong);
286219b2ee8SDavid du Colombier int		risctrace(Map*, ulong, ulong, ulong, Tracer);
2877dd7cddfSDavid du Colombier int		setmap(Map*, int, ulong, ulong, ulong, char*);
2883e12c5d1SDavid du Colombier Sym*		symbase(long*);
2893e12c5d1SDavid du Colombier int		syminit(int, Fhdr*);
290219b2ee8SDavid du Colombier int		symoff(char*, int, long, int);
291219b2ee8SDavid du Colombier void		textseg(ulong, Fhdr*);
2923e12c5d1SDavid du Colombier int		textsym(Symbol*, int);
2933e12c5d1SDavid du Colombier void		unusemap(Map*, int);
294