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