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