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