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 * sparc, 13 * i960 (limited) 14 * 3210DSP (limited) 15 */ 16 enum 17 { 18 MMIPS, /* machine types */ 19 MSPARC, 20 M68020, 21 MI386, 22 MI960, 23 M3210, 24 /* types of exectables */ 25 FNONE = 0, /* unidentified */ 26 FMIPS, /* v.out */ 27 FMIPSB, /* mips bootable */ 28 FSPARC, /* k.out */ 29 FSPARCB, /* Sparc bootable */ 30 F68020, /* 2.out */ 31 F68020B, /* 68020 bootable */ 32 FNEXTB, /* Next bootable */ 33 FI386, /* 8.out */ 34 FI386B, /* I386 bootable */ 35 FI960, /* 6.out */ 36 FI960B, /* I960 bootable */ 37 F3210, /* x.out */ 38 39 ANONE = 0, /* dissembler types */ 40 AMIPS, 41 AMIPSCO, /* native mips */ 42 ASPARC, 43 ASUNSPARC, /* native sun */ 44 A68020, 45 AI386, 46 AI8086, /* oh god */ 47 AI960, 48 /* object file types */ 49 Obj68020 = 0, /* .2 */ 50 ObjSparc, /* .k */ 51 ObjMips, /* .v */ 52 Obj386, /* .8 */ 53 Obj960, /* .6 */ 54 Obj3210, /* .x */ 55 Maxobjtype, 56 57 CNONE = 0, /* symbol table classes */ 58 CAUTO, 59 CPARAM, 60 CSTAB, 61 CTEXT, 62 CDATA, 63 CANY, /* to look for any class */ 64 }; 65 66 typedef struct Map Map; 67 typedef struct Symbol Symbol; 68 typedef struct Reglist Reglist; 69 typedef struct Mach Mach; 70 typedef struct Machdata Machdata; 71 72 /* 73 * Structure to map a segment to a position in a file 74 */ 75 struct Map { 76 int fd; /* file descriptor */ 77 int nsegs; /* number of segments */ 78 struct segment { /* per-segment map */ 79 char *name; /* the segment name */ 80 int inuse; /* in use - not in use */ 81 ulong b; /* base */ 82 ulong e; /* end */ 83 ulong f; /* offset within file */ 84 } seg[1]; /* actually n of these */ 85 }; 86 /* 87 * Internal structure describing a symbol table entry 88 */ 89 90 struct Symbol { 91 void *handle; /* used internally - owning func */ 92 struct { 93 char *name; 94 long value; /* address or stack offset */ 95 char type; /* as in a.out.h */ 96 char class; /* as above */ 97 }; 98 }; 99 /* 100 * machine register description 101 */ 102 103 struct Reglist { 104 char *rname; /* register name */ 105 short roffs; /* offset in u-block */ 106 char rflags; /* INTEGER/FLOAT, WRITABLE */ 107 char rformat; /* print format: 'x', 'X', 'f', '8' */ 108 ulong raddr; /* fixed-up register addr */ 109 long rdelta; /* fix-up to register value */ 110 }; 111 112 enum { /* bits in rflags field */ 113 RINT = (0<<0), 114 RFLT = (1<<0), 115 RRDONLY = (1<<1), 116 }; 117 /* 118 * Machine-dependent data is stored in two structures: 119 * Mach - miscellaneous general parameters 120 * Machdata - jump vector of service functions used by debuggers 121 * 122 * Mach is defined in 2.c, v.c, k.c, 8.c, 6.c and set in executable.c 123 * 124 * Machdata is defined in 68020.c, mips.c, sparc.c, 386.c, and 960.c 125 * and set in the debugger startup. 126 */ 127 128 129 struct Mach{ 130 char *name; 131 int mtype; /* machine type code */ 132 Reglist *reglist; /* register set */ 133 int minreg; /* minimum register */ 134 int maxreg; /* maximum register */ 135 char *pc; /* pc name */ 136 char *sp; /* sp name */ 137 char *link; /* link register name */ 138 ulong retreg; /* function return register */ 139 int pgsize; /* page size */ 140 ulong kbase; /* kernel base address: uarea */ 141 ulong ktmask; /* ktzero = kbase & ~ktmask */ 142 ulong kspoff; /* offset of ksp in /proc/proc */ 143 ulong kspdelta; /* correction to ksp value */ 144 ulong kpcoff; /* offset of kpc in /proc/proc */ 145 ulong kpcdelta; /* correction to kpc value */ 146 ulong scalloff; /* offset to sys call # in ublk */ 147 int pcquant; /* quantization of pc */ 148 char *sbreg; /* static base register name */ 149 ulong sb; /* value */ 150 int szaddr; /* sizeof(void*) */ 151 int szreg; /* sizeof(register) */ 152 int szfloat; /* sizeof(float) */ 153 int szdouble; /* sizeof(double) */ 154 }; 155 156 extern Mach *mach; /* Current machine */ 157 158 typedef ulong (*Rgetter)(Map*, char*); 159 typedef void (*Tracer)(Map*, ulong, ulong, Symbol*); 160 161 struct Machdata { /* Machine-dependent debugger support */ 162 uchar bpinst[4]; /* break point instr. */ 163 short bpsize; /* size of break point instr. */ 164 165 ushort (*swab)(ushort); /* short to local byte order */ 166 long (*swal)(long); /* long to local byte order */ 167 int (*ctrace)(Map*, ulong, ulong, ulong, Tracer); /* C traceback */ 168 ulong (*findframe)(Map*, ulong, ulong, ulong, ulong);/* frame finder */ 169 int (*ufixup)(Map*, long*); /* fixup to ublock base */ 170 char* (*excep)(Map*, Rgetter); /* last exception */ 171 ulong (*bpfix)(ulong); /* breakpoint fixup */ 172 int (*sftos)(char*, int, void*); /* single precision float */ 173 int (*dftos)(char*, int, void*); /* double precision float */ 174 int (*foll)(Map*, ulong, Rgetter, ulong*); /* follow set */ 175 int (*das)(Map*, ulong, char, char*, int); /* symbolic disassembly */ 176 int (*hexinst)(Map*, ulong, char*, int); /* hex disassembly */ 177 int (*instsize)(Map*, ulong); /* instruction size */ 178 }; 179 180 /* 181 * Common a.out header describing all architectures 182 */ 183 typedef struct Fhdr 184 { 185 char *name; /* identifier of executable */ 186 short type; /* file type - see codes above*/ 187 short hdrsz; /* size of this header */ 188 long magic; /* magic number */ 189 long txtaddr; /* text address */ 190 long entry; /* entry point */ 191 long txtsz; /* text size */ 192 long txtoff; /* start of text in file */ 193 long dataddr; /* start of data segment */ 194 long datsz; /* size of data seg */ 195 long datoff; /* offset to data seg in file */ 196 long bsssz; /* size of bss */ 197 long symsz; /* size of symbol table */ 198 long symoff; /* offset of symbol table in file */ 199 long sppcsz; /* size of sp-pc table */ 200 long sppcoff; /* offset of sp-pc table in file */ 201 long lnpcsz; /* size of line number-pc table */ 202 long lnpcoff; /* size of line number-pc table */ 203 } Fhdr; 204 205 extern int asstype; /* dissembler type - machdata.c */ 206 extern Machdata *machdata; /* jump vector - machdata.c */ 207 208 Map* attachremt(int, Fhdr*); 209 int beieee80ftos(char*, int, void*); 210 int beieeesftos(char*, int, void*); 211 int beieeedftos(char*, int, void*); 212 ushort beswab(ushort); 213 long beswal(long); 214 int cisctrace(Map*, ulong, ulong, ulong, Tracer); 215 ulong ciscframe(Map*, ulong, ulong, ulong, ulong); 216 int crackhdr(int fd, Fhdr*); 217 long file2pc(char*, ulong); 218 int fileelem(Sym**, uchar *, char*, int); 219 int fileline(char*, int, ulong); 220 int filesym(int, char*, int); 221 int findlocal(Symbol*, char*, Symbol*); 222 int findseg(Map*, char*); 223 int findsym(long, int, Symbol *); 224 int fnbound(long, ulong*); 225 int fpformat(Map*, Reglist*, char*, int, int); 226 int get1(Map*, ulong, uchar*, int); 227 int get2(Map*, ulong, ushort*); 228 int get4(Map*, ulong, long*); 229 int getauto(Symbol*, int, int, Symbol*); 230 Sym* getsym(int); 231 int globalsym(Symbol *, int); 232 char* _hexify(char*, ulong, int); 233 int ieeesftos(char*, int, ulong); 234 int ieeedftos(char*, int, ulong, ulong); 235 int isar(Biobuf*); 236 int leieee80ftos(char*, int, void*); 237 int leieeesftos(char*, int, void*); 238 int leieeedftos(char*, int, void*); 239 ushort leswab(ushort); 240 long leswal(long); 241 long line2addr(ulong, ulong, ulong); 242 Map* loadmap(Map*, int, Fhdr*); 243 int localaddr(Map*, char*, char*, long*, Rgetter); 244 int localsym(Symbol*, int); 245 int lookup(char*, char*, Symbol*); 246 void machbytype(int); 247 int machbyname(char*); 248 int nextar(Biobuf*, int, char*); 249 Map* newmap(Map*, int, int); 250 void objtraverse(void(*)(Sym*, void*), void*); 251 int objtype(Biobuf*, char**); 252 long pc2sp(ulong); 253 long pc2line(ulong); 254 int put1(Map*, ulong, uchar*, int); 255 int put2(Map*, ulong, ushort); 256 int put4(Map*, ulong, long); 257 int readar(Biobuf*, int, int, int); 258 int readobj(Biobuf*, int); 259 ulong riscframe(Map*, ulong, ulong, ulong, ulong); 260 int risctrace(Map*, ulong, ulong, ulong, Tracer); 261 int setmap(Map*, ulong, ulong, ulong, char*); 262 Sym* symbase(long*); 263 int syminit(int, Fhdr*); 264 int symoff(char*, int, long, int); 265 void textseg(ulong, Fhdr*); 266 int textsym(Symbol*, int); 267 void unusemap(Map*, int); 268