13e12c5d1SDavid du Colombier /* 2219b2ee8SDavid du Colombier * Architecture-dependent application data 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier #include "a.out.h" 5219b2ee8SDavid du Colombier #pragma src "/sys/src/libmach" 63e12c5d1SDavid du Colombier #pragma lib "libmach.a" 73e12c5d1SDavid du Colombier /* 8bd389b36SDavid du Colombier * Supported architectures: 9bd389b36SDavid du Colombier * mips, 10bd389b36SDavid du Colombier * 68020, 11bd389b36SDavid du Colombier * i386, 12bd389b36SDavid du Colombier * sparc, 13bd389b36SDavid du Colombier * i960 (limited) 14219b2ee8SDavid du Colombier * 3210DSP (limited) 157dd7cddfSDavid du Colombier * mips2 (R4000) 167dd7cddfSDavid du Colombier * arm (limited) 177dd7cddfSDavid du Colombier * power pc (limited) 183e12c5d1SDavid du Colombier */ 193e12c5d1SDavid du Colombier enum 203e12c5d1SDavid du Colombier { 213e12c5d1SDavid du Colombier MMIPS, /* machine types */ 223e12c5d1SDavid du Colombier MSPARC, 233e12c5d1SDavid du Colombier M68020, 243e12c5d1SDavid du Colombier MI386, 253e12c5d1SDavid du Colombier MI960, 26219b2ee8SDavid du Colombier M3210, 277dd7cddfSDavid du Colombier MMIPS2, 287dd7cddfSDavid du Colombier NMIPS2, 297dd7cddfSDavid du Colombier M29000, 307dd7cddfSDavid du Colombier MARM, 317dd7cddfSDavid du Colombier MPOWER, 327dd7cddfSDavid du Colombier MALPHA, 33*3ff48bf5SDavid du Colombier NMIPS, 347dd7cddfSDavid du Colombier /* types of executables */ 35219b2ee8SDavid du Colombier FNONE = 0, /* unidentified */ 363e12c5d1SDavid du Colombier FMIPS, /* v.out */ 373e12c5d1SDavid du Colombier FMIPSB, /* mips bootable */ 383e12c5d1SDavid du Colombier FSPARC, /* k.out */ 393e12c5d1SDavid du Colombier FSPARCB, /* Sparc bootable */ 403e12c5d1SDavid du Colombier F68020, /* 2.out */ 413e12c5d1SDavid du Colombier F68020B, /* 68020 bootable */ 423e12c5d1SDavid du Colombier FNEXTB, /* Next bootable */ 433e12c5d1SDavid du Colombier FI386, /* 8.out */ 443e12c5d1SDavid du Colombier FI386B, /* I386 bootable */ 453e12c5d1SDavid du Colombier FI960, /* 6.out */ 463e12c5d1SDavid du Colombier FI960B, /* I960 bootable */ 47219b2ee8SDavid du Colombier F3210, /* x.out */ 487dd7cddfSDavid du Colombier FMIPS2BE, /* 4.out */ 497dd7cddfSDavid du Colombier F29000, /* 9.out */ 507dd7cddfSDavid du Colombier FARM, /* 5.out */ 517dd7cddfSDavid du Colombier FARMB, /* ARM bootable */ 527dd7cddfSDavid du Colombier FPOWER, /* q.out */ 537dd7cddfSDavid du Colombier FPOWERB, /* power pc bootable */ 547dd7cddfSDavid du Colombier FMIPS2LE, /* 4k little endian */ 557dd7cddfSDavid du Colombier FALPHA, /* 7.out */ 567dd7cddfSDavid du Colombier FALPHAB, /* DEC Alpha bootable */ 57*3ff48bf5SDavid du Colombier FMIPSLE, /* 3k little endian */ 583e12c5d1SDavid du Colombier 59219b2ee8SDavid du Colombier ANONE = 0, /* dissembler types */ 603e12c5d1SDavid du Colombier AMIPS, 613e12c5d1SDavid du Colombier AMIPSCO, /* native mips */ 623e12c5d1SDavid du Colombier ASPARC, 633e12c5d1SDavid du Colombier ASUNSPARC, /* native sun */ 643e12c5d1SDavid du Colombier A68020, 653e12c5d1SDavid du Colombier AI386, 663e12c5d1SDavid du Colombier AI8086, /* oh god */ 673e12c5d1SDavid du Colombier AI960, 687dd7cddfSDavid du Colombier A29000, 697dd7cddfSDavid du Colombier AARM, 707dd7cddfSDavid du Colombier APOWER, 717dd7cddfSDavid du Colombier AALPHA, 72bd389b36SDavid du Colombier /* object file types */ 73bd389b36SDavid du Colombier Obj68020 = 0, /* .2 */ 74219b2ee8SDavid du Colombier ObjSparc, /* .k */ 75219b2ee8SDavid du Colombier ObjMips, /* .v */ 76219b2ee8SDavid du Colombier Obj386, /* .8 */ 77219b2ee8SDavid du Colombier Obj960, /* .6 */ 78219b2ee8SDavid du Colombier Obj3210, /* .x */ 797dd7cddfSDavid du Colombier ObjMips2, /* .4 */ 807dd7cddfSDavid du Colombier Obj29000, /* .9 */ 817dd7cddfSDavid du Colombier ObjArm, /* .5 */ 827dd7cddfSDavid du Colombier ObjPower, /* .q */ 837dd7cddfSDavid du Colombier ObjMips2le, /* .0 */ 847dd7cddfSDavid du Colombier ObjAlpha, /* .7 */ 85219b2ee8SDavid du Colombier Maxobjtype, 863e12c5d1SDavid du Colombier 873e12c5d1SDavid du Colombier CNONE = 0, /* symbol table classes */ 88219b2ee8SDavid du Colombier CAUTO, 89219b2ee8SDavid du Colombier CPARAM, 90219b2ee8SDavid du Colombier CSTAB, 91219b2ee8SDavid du Colombier CTEXT, 92219b2ee8SDavid du Colombier CDATA, 93219b2ee8SDavid du Colombier CANY, /* to look for any class */ 943e12c5d1SDavid du Colombier }; 95219b2ee8SDavid du Colombier 96219b2ee8SDavid du Colombier typedef struct Map Map; 97219b2ee8SDavid du Colombier typedef struct Symbol Symbol; 98219b2ee8SDavid du Colombier typedef struct Reglist Reglist; 99219b2ee8SDavid du Colombier typedef struct Mach Mach; 100219b2ee8SDavid du Colombier typedef struct Machdata Machdata; 101219b2ee8SDavid du Colombier 1023e12c5d1SDavid du Colombier /* 103bd389b36SDavid du Colombier * Structure to map a segment to a position in a file 1043e12c5d1SDavid du Colombier */ 105219b2ee8SDavid du Colombier struct Map { 106219b2ee8SDavid du Colombier int nsegs; /* number of segments */ 107219b2ee8SDavid du Colombier struct segment { /* per-segment map */ 1083e12c5d1SDavid du Colombier char *name; /* the segment name */ 1097dd7cddfSDavid du Colombier int fd; /* file descriptor */ 110bd389b36SDavid du Colombier int inuse; /* in use - not in use */ 1113e12c5d1SDavid du Colombier ulong b; /* base */ 1123e12c5d1SDavid du Colombier ulong e; /* end */ 1133e12c5d1SDavid du Colombier ulong f; /* offset within file */ 114219b2ee8SDavid du Colombier } seg[1]; /* actually n of these */ 115219b2ee8SDavid du Colombier }; 1167dd7cddfSDavid du Colombier 117219b2ee8SDavid du Colombier /* 118219b2ee8SDavid du Colombier * Internal structure describing a symbol table entry 119219b2ee8SDavid du Colombier */ 120219b2ee8SDavid du Colombier struct Symbol { 121219b2ee8SDavid du Colombier void *handle; /* used internally - owning func */ 122219b2ee8SDavid du Colombier struct { 123219b2ee8SDavid du Colombier char *name; 124219b2ee8SDavid du Colombier long value; /* address or stack offset */ 125219b2ee8SDavid du Colombier char type; /* as in a.out.h */ 126219b2ee8SDavid du Colombier char class; /* as above */ 127219b2ee8SDavid du Colombier }; 1283e12c5d1SDavid du Colombier }; 1297dd7cddfSDavid du Colombier 1303e12c5d1SDavid du Colombier /* 1313e12c5d1SDavid du Colombier * machine register description 1323e12c5d1SDavid du Colombier */ 133219b2ee8SDavid du Colombier struct Reglist { 1343e12c5d1SDavid du Colombier char *rname; /* register name */ 1353e12c5d1SDavid du Colombier short roffs; /* offset in u-block */ 136219b2ee8SDavid du Colombier char rflags; /* INTEGER/FLOAT, WRITABLE */ 137bd389b36SDavid du Colombier char rformat; /* print format: 'x', 'X', 'f', '8' */ 138219b2ee8SDavid du Colombier }; 139219b2ee8SDavid du Colombier 140219b2ee8SDavid du Colombier enum { /* bits in rflags field */ 141219b2ee8SDavid du Colombier RINT = (0<<0), 142219b2ee8SDavid du Colombier RFLT = (1<<0), 143219b2ee8SDavid du Colombier RRDONLY = (1<<1), 1443e12c5d1SDavid du Colombier }; 1453e12c5d1SDavid du Colombier /* 146219b2ee8SDavid du Colombier * Machine-dependent data is stored in two structures: 147219b2ee8SDavid du Colombier * Mach - miscellaneous general parameters 148219b2ee8SDavid du Colombier * Machdata - jump vector of service functions used by debuggers 149219b2ee8SDavid du Colombier * 1507dd7cddfSDavid du Colombier * Mach is defined in 2.c, 4.c, v.c, k.c, 8.c, 6.c and set in executable.c 151219b2ee8SDavid du Colombier * 1527dd7cddfSDavid du Colombier * Machdata is defined in 2db.c, 4db.c, vdb.c, kdb.c, 8db.c, and 6db.c 153219b2ee8SDavid du Colombier * and set in the debugger startup. 1543e12c5d1SDavid du Colombier */ 155219b2ee8SDavid du Colombier 156219b2ee8SDavid du Colombier 1573e12c5d1SDavid du Colombier struct Mach{ 1583e12c5d1SDavid du Colombier char *name; 159219b2ee8SDavid du Colombier int mtype; /* machine type code */ 1603e12c5d1SDavid du Colombier Reglist *reglist; /* register set */ 1617dd7cddfSDavid du Colombier ulong regsize; /* sizeof registers in bytes*/ 1627dd7cddfSDavid du Colombier ulong fpregsize; /* sizeof fp registers in bytes*/ 163219b2ee8SDavid du Colombier char *pc; /* pc name */ 164219b2ee8SDavid du Colombier char *sp; /* sp name */ 165219b2ee8SDavid du Colombier char *link; /* link register name */ 1663e12c5d1SDavid du Colombier char *sbreg; /* static base register name */ 1677dd7cddfSDavid du Colombier ulong sb; /* static base register value */ 1687dd7cddfSDavid du Colombier int pgsize; /* page size */ 1697dd7cddfSDavid du Colombier ulong kbase; /* kernel base address */ 1707dd7cddfSDavid du Colombier ulong ktmask; /* ktzero = kbase & ~ktmask */ 1717dd7cddfSDavid du Colombier int pcquant; /* quantization of pc */ 1723e12c5d1SDavid du Colombier int szaddr; /* sizeof(void*) */ 1733e12c5d1SDavid du Colombier int szreg; /* sizeof(register) */ 1743e12c5d1SDavid du Colombier int szfloat; /* sizeof(float) */ 1753e12c5d1SDavid du Colombier int szdouble; /* sizeof(double) */ 1763e12c5d1SDavid du Colombier }; 1773e12c5d1SDavid du Colombier 1783e12c5d1SDavid du Colombier extern Mach *mach; /* Current machine */ 1793e12c5d1SDavid du Colombier 1807dd7cddfSDavid du Colombier typedef vlong (*Rgetter)(Map*, char*); 181219b2ee8SDavid du Colombier typedef void (*Tracer)(Map*, ulong, ulong, Symbol*); 1823e12c5d1SDavid du Colombier 183219b2ee8SDavid du Colombier struct Machdata { /* Machine-dependent debugger support */ 1843e12c5d1SDavid du Colombier uchar bpinst[4]; /* break point instr. */ 1853e12c5d1SDavid du Colombier short bpsize; /* size of break point instr. */ 1863e12c5d1SDavid du Colombier 187219b2ee8SDavid du Colombier ushort (*swab)(ushort); /* short to local byte order */ 188219b2ee8SDavid du Colombier long (*swal)(long); /* long to local byte order */ 1897dd7cddfSDavid du Colombier vlong (*swav)(vlong); /* vlong to local byte order */ 190219b2ee8SDavid du Colombier int (*ctrace)(Map*, ulong, ulong, ulong, Tracer); /* C traceback */ 191219b2ee8SDavid du Colombier ulong (*findframe)(Map*, ulong, ulong, ulong, ulong);/* frame finder */ 192219b2ee8SDavid du Colombier char* (*excep)(Map*, Rgetter); /* last exception */ 1933e12c5d1SDavid du Colombier ulong (*bpfix)(ulong); /* breakpoint fixup */ 194219b2ee8SDavid du Colombier int (*sftos)(char*, int, void*); /* single precision float */ 195219b2ee8SDavid du Colombier int (*dftos)(char*, int, void*); /* double precision float */ 196219b2ee8SDavid du Colombier int (*foll)(Map*, ulong, Rgetter, ulong*); /* follow set */ 197219b2ee8SDavid du Colombier int (*das)(Map*, ulong, char, char*, int); /* symbolic disassembly */ 198219b2ee8SDavid du Colombier int (*hexinst)(Map*, ulong, char*, int); /* hex disassembly */ 199219b2ee8SDavid du Colombier int (*instsize)(Map*, ulong); /* instruction size */ 2003e12c5d1SDavid du Colombier }; 2013e12c5d1SDavid du Colombier 2023e12c5d1SDavid du Colombier /* 203bd389b36SDavid du Colombier * Common a.out header describing all architectures 2043e12c5d1SDavid du Colombier */ 2053e12c5d1SDavid du Colombier typedef struct Fhdr 2063e12c5d1SDavid du Colombier { 2073e12c5d1SDavid du Colombier char *name; /* identifier of executable */ 2083e12c5d1SDavid du Colombier short type; /* file type - see codes above*/ 2093e12c5d1SDavid du Colombier short hdrsz; /* size of this header */ 2103e12c5d1SDavid du Colombier long magic; /* magic number */ 2113e12c5d1SDavid du Colombier long txtaddr; /* text address */ 2123e12c5d1SDavid du Colombier long entry; /* entry point */ 2133e12c5d1SDavid du Colombier long txtsz; /* text size */ 2143e12c5d1SDavid du Colombier long txtoff; /* start of text in file */ 2153e12c5d1SDavid du Colombier long dataddr; /* start of data segment */ 2163e12c5d1SDavid du Colombier long datsz; /* size of data seg */ 2173e12c5d1SDavid du Colombier long datoff; /* offset to data seg in file */ 2183e12c5d1SDavid du Colombier long bsssz; /* size of bss */ 2193e12c5d1SDavid du Colombier long symsz; /* size of symbol table */ 2203e12c5d1SDavid du Colombier long symoff; /* offset of symbol table in file */ 2213e12c5d1SDavid du Colombier long sppcsz; /* size of sp-pc table */ 2223e12c5d1SDavid du Colombier long sppcoff; /* offset of sp-pc table in file */ 2233e12c5d1SDavid du Colombier long lnpcsz; /* size of line number-pc table */ 2243e12c5d1SDavid du Colombier long lnpcoff; /* size of line number-pc table */ 2253e12c5d1SDavid du Colombier } Fhdr; 2263e12c5d1SDavid du Colombier 227219b2ee8SDavid du Colombier extern int asstype; /* dissembler type - machdata.c */ 228219b2ee8SDavid du Colombier extern Machdata *machdata; /* jump vector - machdata.c */ 2293e12c5d1SDavid du Colombier 2307dd7cddfSDavid du Colombier Map* attachproc(int, int, int, Fhdr*); 231219b2ee8SDavid du Colombier int beieee80ftos(char*, int, void*); 232219b2ee8SDavid du Colombier int beieeesftos(char*, int, void*); 233219b2ee8SDavid du Colombier int beieeedftos(char*, int, void*); 2343e12c5d1SDavid du Colombier ushort beswab(ushort); 2353e12c5d1SDavid du Colombier long beswal(long); 2367dd7cddfSDavid du Colombier vlong beswav(vlong); 237219b2ee8SDavid du Colombier int cisctrace(Map*, ulong, ulong, ulong, Tracer); 238219b2ee8SDavid du Colombier ulong ciscframe(Map*, ulong, ulong, ulong, ulong); 239219b2ee8SDavid du Colombier int crackhdr(int fd, Fhdr*); 2403e12c5d1SDavid du Colombier long file2pc(char*, ulong); 2413e12c5d1SDavid du Colombier int fileelem(Sym**, uchar *, char*, int); 2423e12c5d1SDavid du Colombier int fileline(char*, int, ulong); 243bd389b36SDavid du Colombier int filesym(int, char*, int); 2443e12c5d1SDavid du Colombier int findlocal(Symbol*, char*, Symbol*); 245219b2ee8SDavid du Colombier int findseg(Map*, char*); 2463e12c5d1SDavid du Colombier int findsym(long, int, Symbol *); 247219b2ee8SDavid du Colombier int fnbound(long, ulong*); 248219b2ee8SDavid du Colombier int fpformat(Map*, Reglist*, char*, int, int); 249219b2ee8SDavid du Colombier int get1(Map*, ulong, uchar*, int); 250219b2ee8SDavid du Colombier int get2(Map*, ulong, ushort*); 251219b2ee8SDavid du Colombier int get4(Map*, ulong, long*); 2527dd7cddfSDavid du Colombier int get8(Map*, ulong, vlong*); 2533e12c5d1SDavid du Colombier int getauto(Symbol*, int, int, Symbol*); 2543e12c5d1SDavid du Colombier Sym* getsym(int); 2553e12c5d1SDavid du Colombier int globalsym(Symbol *, int); 256219b2ee8SDavid du Colombier char* _hexify(char*, ulong, int); 257219b2ee8SDavid du Colombier int ieeesftos(char*, int, ulong); 258219b2ee8SDavid du Colombier int ieeedftos(char*, int, ulong, ulong); 259bd389b36SDavid du Colombier int isar(Biobuf*); 260219b2ee8SDavid du Colombier int leieee80ftos(char*, int, void*); 261219b2ee8SDavid du Colombier int leieeesftos(char*, int, void*); 262219b2ee8SDavid du Colombier int leieeedftos(char*, int, void*); 2633e12c5d1SDavid du Colombier ushort leswab(ushort); 2643e12c5d1SDavid du Colombier long leswal(long); 2657dd7cddfSDavid du Colombier vlong leswav(vlong); 266bd389b36SDavid du Colombier long line2addr(ulong, ulong, ulong); 2673e12c5d1SDavid du Colombier Map* loadmap(Map*, int, Fhdr*); 268219b2ee8SDavid du Colombier int localaddr(Map*, char*, char*, long*, Rgetter); 2693e12c5d1SDavid du Colombier int localsym(Symbol*, int); 2703e12c5d1SDavid du Colombier int lookup(char*, char*, Symbol*); 2713e12c5d1SDavid du Colombier void machbytype(int); 2723e12c5d1SDavid du Colombier int machbyname(char*); 273bd389b36SDavid du Colombier int nextar(Biobuf*, int, char*); 2747dd7cddfSDavid du Colombier Map* newmap(Map*, int); 275219b2ee8SDavid du Colombier void objtraverse(void(*)(Sym*, void*), void*); 276219b2ee8SDavid du Colombier int objtype(Biobuf*, char**); 2773e12c5d1SDavid du Colombier long pc2sp(ulong); 2783e12c5d1SDavid du Colombier long pc2line(ulong); 279219b2ee8SDavid du Colombier int put1(Map*, ulong, uchar*, int); 280219b2ee8SDavid du Colombier int put2(Map*, ulong, ushort); 281219b2ee8SDavid du Colombier int put4(Map*, ulong, long); 2827dd7cddfSDavid du Colombier int put8(Map*, ulong, vlong); 283219b2ee8SDavid du Colombier int readar(Biobuf*, int, int, int); 284bd389b36SDavid du Colombier int readobj(Biobuf*, int); 285219b2ee8SDavid du Colombier ulong riscframe(Map*, ulong, ulong, ulong, ulong); 286219b2ee8SDavid du Colombier int risctrace(Map*, ulong, ulong, ulong, Tracer); 2877dd7cddfSDavid du Colombier int setmap(Map*, int, ulong, ulong, ulong, char*); 2883e12c5d1SDavid du Colombier Sym* symbase(long*); 2893e12c5d1SDavid du Colombier int syminit(int, Fhdr*); 290219b2ee8SDavid du Colombier int symoff(char*, int, long, int); 291219b2ee8SDavid du Colombier void textseg(ulong, Fhdr*); 2923e12c5d1SDavid du Colombier int textsym(Symbol*, int); 2933e12c5d1SDavid du Colombier void unusemap(Map*, int); 294