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