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