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