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