xref: /inferno-os/utils/include/mach.h (revision 2a571cc0ece4073eb56d5ccfc3e061a09a353e13)
1 /*
2  *	Architecture-dependent application data
3  */
4 #include "a.out.h"
5 #pragma	src	"/sys/src/libmach"
6 #pragma	lib	"libmach.a"
7 /*
8  *	Supported architectures:
9  *		mips,
10  *		68020,
11  *		i386,
12  *		amd64,
13  *		sparc,
14  *		mips2 (R4000)
15  *		arm
16  *		powerpc,
17  *		powerpc64
18  *		arm64
19  *		riscv
20  *		riscv64
21  */
22 enum
23 {
24 	MMIPS,			/* machine types */
25 	MSPARC,
26 	M68020,
27 	MI386,
28 	MI960,			/* retired */
29 	M3210,			/* retired */
30 	MMIPS2,
31 	NMIPS2,
32 	M29000,			/* retired */
33 	MARM,
34 	MPOWER,
35 	MALPHA,			/* retired */
36 	NMIPS,
37 	MSPARC64,		/* retired */
38 	MAMD64,
39 	MPOWER64,
40 	MARM64,
41 	MRISCV,
42 	MRISCV64,
43 				/* types of executables */
44 	FNONE = 0,		/* unidentified */
45 	FMIPS,			/* v.out */
46 	FMIPSB,			/* mips bootable */
47 	FSPARC,			/* k.out */
48 	FSPARCB,		/* Sparc bootable */
49 	F68020,			/* 2.out */
50 	F68020B,		/* 68020 bootable */
51 	FNEXTB,			/* Next bootable */
52 	FI386,			/* 8.out */
53 	FI386B,			/* I386 bootable */
54 	FI960,			/* retired */
55 	FI960B,			/* retired */
56 	F3210,			/* retired */
57 	FMIPS2BE,		/* 4.out */
58 	F29000,			/* retired */
59 	FARM,			/* 5.out */
60 	FARMB,			/* ARM bootable */
61 	FPOWER,			/* q.out */
62 	FPOWERB,		/* power pc bootable */
63 	FMIPS2LE,		/* 0.out */
64 	FALPHA,			/* retired */
65 	FALPHAB,		/* retired DEC Alpha bootable */
66 	FMIPSLE,		/* 3k little endian */
67 	FSPARC64,		/* retired */
68 	FAMD64,			/* 6.out */
69 	FAMD64B,		/* 6.out bootable */
70 	FPOWER64,		/* 9.out */
71 	FPOWER64B,		/* 9.out bootable */
72 	FARM64,			/* arm64 */
73 	FARM64B,		/* arm64 bootable */
74 	FRISCV,			/* riscv */
75 	FRISCVB,		/* riscv bootable */
76 	FRISCV64,		/* riscv64 */
77 	FRISCV64B,		/* riscv64 bootable */
78 
79 	ANONE = 0,		/* dissembler types */
80 	AMIPS,
81 	AMIPSCO,		/* native mips */
82 	ASPARC,
83 	ASUNSPARC,		/* native sun */
84 	A68020,
85 	AI386,
86 	AI8086,			/* oh god */
87 	AI960,			/* retired */
88 	A29000,			/* retired */
89 	AARM,
90 	APOWER,
91 	AALPHA,			/* retired */
92 	ASPARC64,		/* retired */
93 	AAMD64,
94 	APOWER64,
95 	AARM64,
96 	ARISCV,
97 	ARISCV64,
98 				/* object file types */
99 	Obj68020 = 0,		/* .2 */
100 	ObjSparc,		/* .k */
101 	ObjMips,		/* .v */
102 	Obj386,			/* .8 */
103 	Obj960,			/* retired */
104 	Obj3210,		/* retired */
105 	ObjMips2,		/* .4 */
106 	Obj29000,		/* retired */
107 	ObjArm,			/* .5 */
108 	ObjPower,		/* .q */
109 	ObjMips2le,		/* .0 */
110 	ObjAlpha,		/* retired */
111 	ObjSparc64,		/* retired */
112 	ObjAmd64,		/* .6 */
113 	ObjSpim,		/* .0 */
114 	ObjPower64,		/* .9 */
115 	ObjArm64,		/* .4? */
116 	ObjRiscv,		/* .i */
117 	ObjRiscv64,		/* .j */
118 	Maxobjtype,
119 
120 	CNONE  = 0,		/* symbol table classes */
121 	CAUTO,
122 	CPARAM,
123 	CSTAB,
124 	CTEXT,
125 	CDATA,
126 	CANY,			/* to look for any class */
127 };
128 
129 typedef	struct	Map	Map;
130 typedef struct	Symbol	Symbol;
131 typedef	struct	Reglist	Reglist;
132 typedef struct	segment	segment;
133 
134 typedef	struct	Mach	Mach;
135 typedef	struct	Machdata Machdata;
136 typedef	int	(*Rsegio)(segment*, ulong, long, char*, int);
137 
138 /*
139  * 	Structure to map a segment to a position in a file
140  */
141 struct Map {
142 	int	nsegs;			/* number of segments */
143 	struct segment {		/* per-segment map */
144 		char	*name;		/* the segment name */
145 		int	fd;		/* file descriptor */
146 		int	inuse;		/* in use - not in use */
147 		int	cache;		/* should cache reads? */
148 		uvlong	b;		/* base */
149 		uvlong	e;		/* end */
150 		vlong	f;		/* offset within file */
151 		Rsegio	mget;	/* special get if not nil */
152 		Rsegio	mput;	/* special put if not nil */
153 	} seg[1];			/* actually n of these */
154 };
155 
156 /*
157  *	Internal structure describing a symbol table entry
158  */
159 struct Symbol {
160 	void 	*handle;		/* used internally - owning func */
161 	struct {
162 		char	*name;
163 		vlong	value;		/* address or stack offset */
164 		char	type;		/* as in a.out.h */
165 		char	class;		/* as above */
166 		int	index;		/* in findlocal, globalsym, textsym */
167 	};
168 };
169 
170 /*
171  *	machine register description
172  */
173 struct Reglist {
174 	char	*rname;			/* register name */
175 	short	roffs;			/* offset in u-block */
176 	char	rflags;			/* INTEGER/FLOAT, WRITABLE */
177 	char	rformat;		/* print format: 'x', 'X', 'f', '8', '3', 'Y', 'W' */
178 };
179 
180 enum {					/* bits in rflags field */
181 	RINT	= (0<<0),
182 	RFLT	= (1<<0),
183 	RRDONLY	= (1<<1)
184 };
185 
186 /*
187  *	Machine-dependent data is stored in two structures:
188  *		Mach  - miscellaneous general parameters
189  *		Machdata - jump vector of service functions used by debuggers
190  *
191  *	Mach is defined in ?.c and set in executable.c
192  *
193  *	Machdata is defined in ?db.c
194  *		and set in the debugger startup.
195  */
196 struct Mach{
197 	char	*name;
198 	int	mtype;			/* machine type code */
199 	Reglist *reglist;		/* register set */
200 	ulong	regsize;		/* sizeof registers in bytes */
201 	ulong	fpregsize;		/* sizeof fp registers in bytes */
202 	char	*pc;			/* pc name */
203 	char	*sp;			/* sp name */
204 	char	*link;			/* link register name */
205 	char	*sbreg;			/* static base register name */
206 	uvlong	sb;			/* static base register value */
207 	int	pgsize;			/* page size */
208 	uvlong	kbase;			/* kernel base address */
209 	uvlong	ktmask;			/* ktzero = kbase & ~ktmask */
210 	uvlong	utop;			/* user stack top */
211 	int	pcquant;		/* quantization of pc */
212 	int	szaddr;			/* sizeof(void*) */
213 	int	szreg;			/* sizeof(register) */
214 	int	szfloat;		/* sizeof(float) */
215 	int	szdouble;		/* sizeof(double) */
216 };
217 
218 extern	Mach	*mach;			/* Current machine */
219 
220 typedef uvlong	(*Rgetter)(Map*, char*);
221 typedef	void	(*Tracer)(Map*, uvlong, uvlong, Symbol*);
222 
223 struct	Machdata {		/* Machine-dependent debugger support */
224 	uchar	bpinst[4];			/* break point instr. */
225 	short	bpsize;				/* size of break point instr. */
226 
227 	ushort	(*swab)(ushort);		/* ushort to local byte order */
228 	ulong	(*swal)(ulong);			/* ulong to local byte order */
229 	uvlong	(*swav)(uvlong);		/* uvlong to local byte order */
230 	int	(*ctrace)(Map*, uvlong, uvlong, uvlong, Tracer); /* C traceback */
231 	uvlong	(*findframe)(Map*, uvlong, uvlong, uvlong, uvlong);/* frame finder */
232 	char*	(*excep)(Map*, Rgetter);	/* last exception */
233 	ulong	(*bpfix)(uvlong);		/* breakpoint fixup */
234 	int	(*sftos)(char*, int, void*);	/* single precision float */
235 	int	(*dftos)(char*, int, void*);	/* double precision float */
236 	int	(*foll)(Map*, uvlong, Rgetter, uvlong*);/* follow set */
237 	int	(*das)(Map*, uvlong, char, char*, int);	/* symbolic disassembly */
238 	int	(*hexinst)(Map*, uvlong, char*, int); 	/* hex disassembly */
239 	int	(*instsize)(Map*, uvlong);	/* instruction size */
240 };
241 
242 /*
243  *	Common a.out header describing all architectures
244  */
245 typedef struct Fhdr
246 {
247 	char	*name;		/* identifier of executable */
248 	uchar	type;		/* file type - see codes above */
249 	uchar	hdrsz;		/* header size */
250 	uchar	_magic;		/* _MAGIC() magic */
251 	uchar	spare;
252 	long	magic;		/* magic number */
253 	uvlong	txtaddr;	/* text address */
254 	vlong	txtoff;		/* start of text in file */
255 	uvlong	dataddr;	/* start of data segment */
256 	vlong	datoff;		/* offset to data seg in file */
257 	vlong	symoff;		/* offset of symbol table in file */
258 	uvlong	entry;		/* entry point */
259 	vlong	sppcoff;	/* offset of sp-pc table in file */
260 	vlong	lnpcoff;	/* offset of line number-pc table in file */
261 	long	txtsz;		/* text size */
262 	long	datsz;		/* size of data seg */
263 	long	bsssz;		/* size of bss */
264 	long	symsz;		/* size of symbol table */
265 	long	sppcsz;		/* size of sp-pc table */
266 	long	lnpcsz;		/* size of line number-pc table */
267 } Fhdr;
268 
269 extern	int	asstype;	/* dissembler type - machdata.c */
270 extern	Machdata *machdata;	/* jump vector - machdata.c */
271 
272 Map*		attachproc(int, int, int, Fhdr*);
273 Map*		attachremt(int, Fhdr*);
274 int		beieee80ftos(char*, int, void*);
275 int		beieeesftos(char*, int, void*);
276 int		beieeedftos(char*, int, void*);
277 ushort		beswab(ushort);
278 ulong		beswal(ulong);
279 uvlong		beswav(uvlong);
280 uvlong		ciscframe(Map*, uvlong, uvlong, uvlong, uvlong);
281 int		cisctrace(Map*, uvlong, uvlong, uvlong, Tracer);
282 int		crackhdr(int fd, Fhdr*);
283 uvlong		file2pc(char*, long);
284 int		fileelem(Sym**, uchar *, char*, int);
285 long		fileline(char*, int, uvlong);
286 int		filesym(int, char*, int);
287 int		findlocal(Symbol*, char*, Symbol*);
288 int		findseg(Map*, char*);
289 int		findsym(uvlong, int, Symbol *);
290 int		fnbound(uvlong, uvlong*);
291 int		fpformat(Map*, Reglist*, char*, int, int);
292 int		get1(Map*, uvlong, uchar*, int);
293 int		get2(Map*, uvlong, ushort*);
294 int		get4(Map*, uvlong, ulong*);
295 int		get8(Map*, uvlong, uvlong*);
296 int		geta(Map*, uvlong, uvlong*);
297 int		getauto(Symbol*, int, int, Symbol*);
298 Sym*		getsym(int);
299 int		globalsym(Symbol *, int);
300 char*		_hexify(char*, ulong, int);
301 int		ieeesftos(char*, int, ulong);
302 int		ieeedftos(char*, int, ulong, ulong);
303 int		isar(Biobuf*);
304 int		leieee80ftos(char*, int, void*);
305 int		leieeesftos(char*, int, void*);
306 int		leieeedftos(char*, int, void*);
307 ushort		leswab(ushort);
308 ulong		leswal(ulong);
309 uvlong		leswav(uvlong);
310 uvlong		line2addr(long, uvlong, uvlong);
311 Map*		loadmap(Map*, int, Fhdr*);
312 int		localaddr(Map*, char*, char*, uvlong*, Rgetter);
313 int		localsym(Symbol*, int);
314 int		lookup(char*, char*, Symbol*);
315 void		machbytype(int);
316 int		machbyname(char*);
317 int		nextar(Biobuf*, int, char*);
318 Map*		newmap(Map*, int);
319 void		objtraverse(void(*)(Sym*, void*), void*);
320 int		objtype(Biobuf*, char**);
321 uvlong		pc2sp(uvlong);
322 long		pc2line(uvlong);
323 int		put1(Map*, uvlong, uchar*, int);
324 int		put2(Map*, uvlong, ushort);
325 int		put4(Map*, uvlong, ulong);
326 int		put8(Map*, uvlong, uvlong);
327 int		puta(Map*, uvlong, uvlong);
328 int		readar(Biobuf*, int, vlong, int);
329 int		readobj(Biobuf*, int);
330 uvlong		riscframe(Map*, uvlong, uvlong, uvlong, uvlong);
331 int		risctrace(Map*, uvlong, uvlong, uvlong, Tracer);
332 int		setmap(Map*, int, uvlong, uvlong, vlong, char*);
333 void		setmapio(Map*, int, Rsegio, Rsegio);
334 Sym*		symbase(long*);
335 int		syminit(int, Fhdr*);
336 int		symoff(char*, int, uvlong, int);
337 void		textseg(uvlong, Fhdr*);
338 int		textsym(Symbol*, int);
339 void		unusemap(Map*, int);
340