Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_unix/sys/include/mach.h – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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