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