2 * Architecture-dependent application data
5 #pragma src "/sys/src/libmach"
6 #pragma lib "libmach.a"
8 * Supported architectures:
24 MMIPS, /* machine types */
41 /* types of executables */
42 FNONE = 0, /* unidentified */
44 FMIPSB, /* mips bootable */
46 FSPARCB, /* Sparc bootable */
48 F68020B, /* 68020 bootable */
49 FNEXTB, /* Next bootable */
51 FI386B, /* I386 bootable */
58 FARMB, /* ARM bootable */
60 FPOWERB, /* power pc bootable */
63 FALPHAB, /* DEC Alpha bootable */
64 FMIPSLE, /* 3k little endian */
67 FAMD64B, /* 6.out bootable */
69 FPOWER64B, /* 9.out bootable */
71 FARM64B, /* arm64 bootable */
73 ANONE = 0, /* dissembler types */
75 AMIPSCO, /* native mips */
77 ASUNSPARC, /* native sun */
90 /* object file types */
91 Obj68020 = 0, /* .2 */
96 Obj3210, /* retired */
98 Obj29000, /* retired */
110 CNONE = 0, /* symbol table classes */
116 CANY, /* to look for any class */
119 typedef struct Map Map;
120 typedef struct Symbol Symbol;
121 typedef struct Reglist Reglist;
122 typedef struct Mach Mach;
123 typedef struct Machdata Machdata;
126 * Structure to map a segment to a position in a file
129 int nsegs; /* number of segments */
130 struct segment { /* per-segment map */
131 char *name; /* the segment name */
132 int fd; /* file descriptor */
133 long (*read)(int, void *, long, vlong);
134 int inuse; /* in use - not in use */
135 int cache; /* should cache reads? */
138 vlong f; /* offset within file */
139 } seg[1]; /* actually n of these */
143 * Internal structure describing a symbol table entry
146 void *handle; /* used internally - owning func */
149 vlong value; /* address or stack offset */
150 char type; /* as in a.out.h */
151 char class; /* as above */
152 int index; /* in findlocal, globalsym, textsym */
157 * machine register description
160 char *rname; /* register name */
161 short roffs; /* offset in u-block */
162 char rflags; /* INTEGER/FLOAT, WRITABLE */
163 char rformat; /* print format: 'x', 'X', 'f', '8', '3', 'Y', 'W' */
166 enum { /* bits in rflags field */
173 * Machine-dependent data is stored in two structures:
174 * Mach - miscellaneous general parameters
175 * Machdata - jump vector of service functions used by debuggers
177 * Mach is defined in ?.c and set in executable.c
179 * Machdata is defined in ?db.c
180 * and set in the debugger startup.
184 int mtype; /* machine type code */
185 Reglist *reglist; /* register set */
186 long regsize; /* sizeof registers in bytes */
187 long fpregsize; /* sizeof fp registers in bytes */
188 char *pc; /* pc name */
189 char *sp; /* sp name */
190 char *link; /* link register name */
191 char *sbreg; /* static base register name */
192 uvlong sb; /* static base register value */
193 int pgsize; /* page size */
194 uvlong kbase; /* kernel base address */
195 uvlong ktmask; /* ktzero = kbase & ~ktmask */
196 uvlong utop; /* user stack top */
197 int pcquant; /* quantization of pc */
198 int szaddr; /* sizeof(void*) */
199 int szreg; /* sizeof(register) */
200 int szfloat; /* sizeof(float) */
201 int szdouble; /* sizeof(double) */
204 extern Mach *mach; /* Current machine */
206 typedef uvlong (*Rgetter)(Map*, char*);
207 typedef void (*Tracer)(Map*, uvlong, uvlong, Symbol*);
209 struct Machdata { /* Machine-dependent debugger support */
210 uchar bpinst[4]; /* break point instr. */
211 short bpsize; /* size of break point instr. */
213 ushort (*swab)(ushort); /* ushort to local byte order */
214 ulong (*swal)(ulong); /* ulong to local byte order */
215 uvlong (*swav)(uvlong); /* uvlong to local byte order */
216 int (*ctrace)(Map*, uvlong, uvlong, uvlong, Tracer); /* C traceback */
217 uvlong (*findframe)(Map*, uvlong, uvlong, uvlong, uvlong);/* frame finder */
218 char* (*excep)(Map*, Rgetter); /* last exception */
219 ulong (*bpfix)(uvlong); /* breakpoint fixup */
220 int (*sftos)(char*, int, void*); /* single precision float */
221 int (*dftos)(char*, int, void*); /* double precision float */
222 int (*foll)(Map*, uvlong, Rgetter, uvlong*);/* follow set */
223 int (*das)(Map*, uvlong, char, char*, int); /* symbolic disassembly */
224 int (*hexinst)(Map*, uvlong, char*, int); /* hex disassembly */
225 int (*instsize)(Map*, uvlong); /* instruction size */
229 * Common a.out header describing all architectures
233 char *name; /* identifier of executable */
234 uchar type; /* file type - see codes above */
235 uchar hdrsz; /* header size */
236 uchar _magic; /* _MAGIC() magic */
238 long magic; /* magic number */
239 uvlong txtaddr; /* text address */
240 vlong txtoff; /* start of text in file */
241 uvlong dataddr; /* start of data segment */
242 vlong datoff; /* offset to data seg in file */
243 vlong symoff; /* offset of symbol table in file */
244 uvlong entry; /* entry point */
245 vlong sppcoff; /* offset of sp-pc table in file */
246 vlong lnpcoff; /* offset of line number-pc table in file */
247 long txtsz; /* text size */
248 long datsz; /* size of data seg */
249 long bsssz; /* size of bss */
250 long symsz; /* size of symbol table */
251 long sppcsz; /* size of sp-pc table */
252 long lnpcsz; /* size of line number-pc table */
255 extern int asstype; /* dissembler type - machdata.c */
256 extern Machdata *machdata; /* jump vector - machdata.c */
258 Map* attachproc(int, int, int, Fhdr*);
259 int beieee80ftos(char*, int, void*);
260 int beieeesftos(char*, int, void*);
261 int beieeedftos(char*, int, void*);
262 ushort beswab(ushort);
264 uvlong beswav(uvlong);
265 uvlong ciscframe(Map*, uvlong, uvlong, uvlong, uvlong);
266 int cisctrace(Map*, uvlong, uvlong, uvlong, Tracer);
267 int crackhdr(int fd, Fhdr*);
268 uvlong file2pc(char*, long);
269 int fileelem(Sym**, uchar *, char*, int);
270 long fileline(char*, int, uvlong);
271 int filesym(int, char*, int);
272 int findlocal(Symbol*, char*, Symbol*);
273 int findseg(Map*, char*);
274 int findsym(uvlong, int, Symbol *);
275 int fnbound(uvlong, uvlong*);
276 int fpformat(Map*, Reglist*, char*, int, int);
277 int get1(Map*, uvlong, uchar*, int);
278 int get2(Map*, uvlong, ushort*);
279 int get4(Map*, uvlong, ulong*);
280 int get8(Map*, uvlong, uvlong*);
281 int geta(Map*, uvlong, uvlong*);
282 int getauto(Symbol*, int, int, Symbol*);
284 int globalsym(Symbol *, int);
285 char* _hexify(char*, ulong, int);
286 int ieeesftos(char*, int, ulong);
287 int ieeedftos(char*, int, ulong, ulong);
289 int leieee80ftos(char*, int, void*);
290 int leieeesftos(char*, int, void*);
291 int leieeedftos(char*, int, void*);
292 ushort leswab(ushort);
294 uvlong leswav(uvlong);
295 uvlong line2addr(long, uvlong, uvlong);
296 Map* loadmap(Map*, int, Fhdr*);
297 int localaddr(Map*, char*, char*, uvlong*, Rgetter);
298 int localsym(Symbol*, int);
299 int lookup(char*, char*, Symbol*);
300 void machbytype(int);
301 int machbyname(char*);
302 int nextar(Biobuf*, int, char*);
303 Map* newmap(Map*, int);
304 void objtraverse(void(*)(Sym*, void*), void*);
305 int objtype(Biobuf*, char**);
306 uvlong pc2sp(uvlong);
307 long pc2line(uvlong);
308 int put1(Map*, uvlong, uchar*, int);
309 int put2(Map*, uvlong, ushort);
310 int put4(Map*, uvlong, ulong);
311 int put8(Map*, uvlong, uvlong);
312 int puta(Map*, uvlong, uvlong);
313 int readar(Biobuf*, int, vlong, int);
314 int readobj(Biobuf*, int);
315 uvlong riscframe(Map*, uvlong, uvlong, uvlong, uvlong);
316 int risctrace(Map*, uvlong, uvlong, uvlong, Tracer);
317 int setmap(Map*, int, uvlong, uvlong, vlong, char*);
319 int syminit(int, Fhdr*);
320 int symoff(char*, int, uvlong, int);
321 void textseg(uvlong, Fhdr*);
322 int textsym(Symbol*, int);
323 void unusemap(Map*, int);