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 int inuse; /* in use - not in use */
134 int cache; /* should cache reads? */
137 vlong f; /* offset within file */
138 } seg[1]; /* actually n of these */
142 * Internal structure describing a symbol table entry
145 void *handle; /* used internally - owning func */
148 vlong value; /* address or stack offset */
149 char type; /* as in a.out.h */
150 char class; /* as above */
151 int index; /* in findlocal, globalsym, textsym */
156 * machine register description
159 char *rname; /* register name */
160 short roffs; /* offset in u-block */
161 char rflags; /* INTEGER/FLOAT, WRITABLE */
162 char rformat; /* print format: 'x', 'X', 'f', '8', '3', 'Y', 'W' */
165 enum { /* bits in rflags field */
172 * Machine-dependent data is stored in two structures:
173 * Mach - miscellaneous general parameters
174 * Machdata - jump vector of service functions used by debuggers
176 * Mach is defined in ?.c and set in executable.c
178 * Machdata is defined in ?db.c
179 * and set in the debugger startup.
183 int mtype; /* machine type code */
184 Reglist *reglist; /* register set */
185 long regsize; /* sizeof registers in bytes */
186 long fpregsize; /* sizeof fp registers in bytes */
187 char *pc; /* pc name */
188 char *sp; /* sp name */
189 char *link; /* link register name */
190 char *sbreg; /* static base register name */
191 uvlong sb; /* static base register value */
192 int pgsize; /* page size */
193 uvlong kbase; /* kernel base address */
194 uvlong ktmask; /* ktzero = kbase & ~ktmask */
195 uvlong utop; /* user stack top */
196 int pcquant; /* quantization of pc */
197 int szaddr; /* sizeof(void*) */
198 int szreg; /* sizeof(register) */
199 int szfloat; /* sizeof(float) */
200 int szdouble; /* sizeof(double) */
203 extern Mach *mach; /* Current machine */
205 typedef uvlong (*Rgetter)(Map*, char*);
206 typedef void (*Tracer)(Map*, uvlong, uvlong, Symbol*);
208 struct Machdata { /* Machine-dependent debugger support */
209 uchar bpinst[4]; /* break point instr. */
210 short bpsize; /* size of break point instr. */
212 ushort (*swab)(ushort); /* ushort to local byte order */
213 ulong (*swal)(ulong); /* ulong to local byte order */
214 uvlong (*swav)(uvlong); /* uvlong to local byte order */
215 int (*ctrace)(Map*, uvlong, uvlong, uvlong, Tracer); /* C traceback */
216 uvlong (*findframe)(Map*, uvlong, uvlong, uvlong, uvlong);/* frame finder */
217 char* (*excep)(Map*, Rgetter); /* last exception */
218 ulong (*bpfix)(uvlong); /* breakpoint fixup */
219 int (*sftos)(char*, int, void*); /* single precision float */
220 int (*dftos)(char*, int, void*); /* double precision float */
221 int (*foll)(Map*, uvlong, Rgetter, uvlong*);/* follow set */
222 int (*das)(Map*, uvlong, char, char*, int); /* symbolic disassembly */
223 int (*hexinst)(Map*, uvlong, char*, int); /* hex disassembly */
224 int (*instsize)(Map*, uvlong); /* instruction size */
228 * Common a.out header describing all architectures
232 char *name; /* identifier of executable */
233 uchar type; /* file type - see codes above */
234 uchar hdrsz; /* header size */
235 uchar _magic; /* _MAGIC() magic */
237 long magic; /* magic number */
238 uvlong txtaddr; /* text address */
239 vlong txtoff; /* start of text in file */
240 uvlong dataddr; /* start of data segment */
241 vlong datoff; /* offset to data seg in file */
242 vlong symoff; /* offset of symbol table in file */
243 uvlong entry; /* entry point */
244 vlong sppcoff; /* offset of sp-pc table in file */
245 vlong lnpcoff; /* offset of line number-pc table in file */
246 long txtsz; /* text size */
247 long datsz; /* size of data seg */
248 long bsssz; /* size of bss */
249 long symsz; /* size of symbol table */
250 long sppcsz; /* size of sp-pc table */
251 long lnpcsz; /* size of line number-pc table */
254 extern int asstype; /* dissembler type - machdata.c */
255 extern Machdata *machdata; /* jump vector - machdata.c */
257 Map* attachproc(int, int, int, Fhdr*);
258 int beieee80ftos(char*, int, void*);
259 int beieeesftos(char*, int, void*);
260 int beieeedftos(char*, int, void*);
261 ushort beswab(ushort);
263 uvlong beswav(uvlong);
264 uvlong ciscframe(Map*, uvlong, uvlong, uvlong, uvlong);
265 int cisctrace(Map*, uvlong, uvlong, uvlong, Tracer);
266 int crackhdr(int fd, Fhdr*);
267 uvlong file2pc(char*, long);
268 int fileelem(Sym**, uchar *, char*, int);
269 long fileline(char*, int, uvlong);
270 int filesym(int, char*, int);
271 int findlocal(Symbol*, char*, Symbol*);
272 int findseg(Map*, char*);
273 int findsym(uvlong, int, Symbol *);
274 int fnbound(uvlong, uvlong*);
275 int fpformat(Map*, Reglist*, char*, int, int);
276 int get1(Map*, uvlong, uchar*, int);
277 int get2(Map*, uvlong, ushort*);
278 int get4(Map*, uvlong, ulong*);
279 int get8(Map*, uvlong, uvlong*);
280 int geta(Map*, uvlong, uvlong*);
281 int getauto(Symbol*, int, int, Symbol*);
283 int globalsym(Symbol *, int);
284 char* _hexify(char*, ulong, int);
285 int ieeesftos(char*, int, ulong);
286 int ieeedftos(char*, int, ulong, ulong);
288 int leieee80ftos(char*, int, void*);
289 int leieeesftos(char*, int, void*);
290 int leieeedftos(char*, int, void*);
291 ushort leswab(ushort);
293 uvlong leswav(uvlong);
294 uvlong line2addr(long, uvlong, uvlong);
295 Map* loadmap(Map*, int, Fhdr*);
296 int localaddr(Map*, char*, char*, uvlong*, Rgetter);
297 int localsym(Symbol*, int);
298 int lookup(char*, char*, Symbol*);
299 void machbytype(int);
300 int machbyname(char*);
301 int nextar(Biobuf*, int, char*);
302 Map* newmap(Map*, int);
303 void objtraverse(void(*)(Sym*, void*), void*);
304 int objtype(Biobuf*, char**);
305 uvlong pc2sp(uvlong);
306 long pc2line(uvlong);
307 int put1(Map*, uvlong, uchar*, int);
308 int put2(Map*, uvlong, ushort);
309 int put4(Map*, uvlong, ulong);
310 int put8(Map*, uvlong, uvlong);
311 int puta(Map*, uvlong, uvlong);
312 int readar(Biobuf*, int, vlong, int);
313 int readobj(Biobuf*, int);
314 uvlong riscframe(Map*, uvlong, uvlong, uvlong, uvlong);
315 int risctrace(Map*, uvlong, uvlong, uvlong, Tracer);
316 int setmap(Map*, int, uvlong, uvlong, vlong, char*);
318 int syminit(int, Fhdr*);
319 int symoff(char*, int, uvlong, int);
320 void textseg(uvlong, Fhdr*);
321 int textsym(Symbol*, int);
322 void unusemap(Map*, int);