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