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