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