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