summaryrefslogtreecommitdiff
path: root/utils/include/mach.h
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2010-04-27 12:51:13 +0100
committerforsyth <forsyth@vitanuova.com>2010-04-27 12:51:13 +0100
commitd67b7dad77bb8aa973dad1f7c3ab0c309b114278 (patch)
tree6794120fb327d6de19cf05eed53f80d877781a3e /utils/include/mach.h
parent09da2e137d5eb0c940df35d989e4c31ec0654fc4 (diff)
20100427-1251
Diffstat (limited to 'utils/include/mach.h')
-rw-r--r--utils/include/mach.h221
1 files changed, 126 insertions, 95 deletions
diff --git a/utils/include/mach.h b/utils/include/mach.h
index f809aa2d..ea22b7e1 100644
--- a/utils/include/mach.h
+++ b/utils/include/mach.h
@@ -2,16 +2,21 @@
* Architecture-dependent application data
*/
#include "a.out.h"
+#pragma src "/usr/inferno/utils/libmach"
+#pragma lib "libmach.a"
/*
* Supported architectures:
* mips,
* 68020,
* i386,
+ * amd64,
* sparc,
- * i960 (limited)
- * 3210DSP (limited)
+ * sparc64,
* mips2 (R4000)
- * arm (limited)
+ * arm
+ * powerpc,
+ * powerpc64
+ * alpha
*/
enum
{
@@ -19,14 +24,19 @@ enum
MSPARC,
M68020,
MI386,
- MI960,
- M3210,
+ MI960, /* retired */
+ M3210, /* retired */
MMIPS2,
NMIPS2,
- M29000,
+ M29000, /* retired */
MARM,
MPOWER,
- /* types of exectables */
+ MALPHA,
+ NMIPS,
+ MSPARC64,
+ MAMD64,
+ MPOWER64,
+ /* types of executables */
FNONE = 0, /* unidentified */
FMIPS, /* v.out */
FMIPSB, /* mips bootable */
@@ -37,16 +47,24 @@ enum
FNEXTB, /* Next bootable */
FI386, /* 8.out */
FI386B, /* I386 bootable */
- FI960, /* 6.out */
- FI960B, /* I960 bootable */
- F3210, /* x.out */
- FMIPS2BE, /* 4.out */
- F29000, /* 9.out */
+ FI960, /* retired */
+ FI960B, /* retired */
+ F3210, /* retired */
+ FMIPS2BE, /* 4.out */
+ F29000, /* retired */
FARM, /* 5.out */
FARMB, /* ARM bootable */
FPOWER, /* q.out */
FPOWERB, /* power pc bootable */
- FMIPS2LE, /* 4k little endian */
+ FMIPS2LE, /* 0.out */
+ FALPHA, /* 7.out */
+ FALPHAB, /* DEC Alpha bootable */
+ FMIPSLE, /* 3k little endian */
+ FSPARC64, /* u.out */
+ FAMD64, /* 6.out */
+ FAMD64B, /* 6.out bootable */
+ FPOWER64, /* 9.out */
+ FPOWER64B, /* 9.out bootable */
ANONE = 0, /* dissembler types */
AMIPS,
@@ -56,22 +74,31 @@ enum
A68020,
AI386,
AI8086, /* oh god */
- AI960,
- A29000,
+ AI960, /* retired */
+ A29000, /* retired */
AARM,
APOWER,
+ AALPHA,
+ ASPARC64,
+ AAMD64,
+ APOWER64,
/* object file types */
Obj68020 = 0, /* .2 */
ObjSparc, /* .k */
ObjMips, /* .v */
Obj386, /* .8 */
- Obj960, /* .6 */
- Obj3210, /* .x */
+ Obj960, /* retired */
+ Obj3210, /* retired */
ObjMips2, /* .4 */
- Obj29000, /* .9 */
+ Obj29000, /* retired */
ObjArm, /* .5 */
ObjPower, /* .q */
ObjMips2le, /* .0 */
+ ObjAlpha, /* .7 */
+ ObjSparc64, /* .u */
+ ObjAmd64, /* .6 */
+ ObjSpim, /* .0 */
+ ObjPower64, /* .9 */
Maxobjtype,
CNONE = 0, /* symbol table classes */
@@ -80,7 +107,7 @@ enum
CSTAB,
CTEXT,
CDATA,
- CANY /* to look for any class */
+ CANY, /* to look for any class */
};
typedef struct Map Map;
@@ -88,6 +115,7 @@ typedef struct Symbol Symbol;
typedef struct Reglist Reglist;
typedef struct Mach Mach;
typedef struct Machdata Machdata;
+
typedef struct segment segment;
typedef int (*Rsegio)(segment*, ulong, long, char*, int);
@@ -101,27 +129,27 @@ struct Map {
char *name; /* the segment name */
int fd; /* file descriptor */
int inuse; /* in use - not in use */
- ulong b; /* base */
- ulong e; /* end */
- ulong f; /* offset within file */
- Rsegio mget; /* special get if not 0 */
- Rsegio mput; /* special put if not 0 */
+ int cache; /* should cache reads? */
+ uvlong b; /* base */
+ uvlong e; /* end */
+ vlong f; /* offset within file */
+ Rsegio mget; /* special get if not nil */
+ Rsegio mput; /* special put if not nil */
} seg[1]; /* actually n of these */
};
-
-
/*
* Internal structure describing a symbol table entry
*/
struct Symbol {
void *handle; /* used internally - owning func */
- /*struct {*/
+ struct {
char *name;
- long value; /* address or stack offset */
+ vlong value; /* address or stack offset */
char type; /* as in a.out.h */
char class; /* as above */
- /*};*/
+ int index; /* in findlocal, globalsym, textsym */
+ };
};
/*
@@ -131,40 +159,40 @@ struct Reglist {
char *rname; /* register name */
short roffs; /* offset in u-block */
char rflags; /* INTEGER/FLOAT, WRITABLE */
- char rformat; /* print format: 'x', 'X', 'f', '8' */
+ char rformat; /* print format: 'x', 'X', 'f', '8', '3', 'Y', 'W' */
};
-enum { /* bits in rflags field */
+enum { /* bits in rflags field */
RINT = (0<<0),
RFLT = (1<<0),
RRDONLY = (1<<1)
};
+
/*
* Machine-dependent data is stored in two structures:
* Mach - miscellaneous general parameters
* Machdata - jump vector of service functions used by debuggers
*
- * Mach is defined in 2.c, 4.c, v.c, k.c, 8.c, 6.c and set in executable.c
+ * Mach is defined in ?.c and set in executable.c
*
- * Machdata is defined in 2db.c, 4db.c, vdb.c, kdb.c, 8db.c, and 6db.c
+ * Machdata is defined in ?db.c
* and set in the debugger startup.
*/
-
-
struct Mach{
char *name;
int mtype; /* machine type code */
Reglist *reglist; /* register set */
- ulong regsize; /* sizeof registers in bytes*/
- ulong fpregsize; /* sizeof fp registers in bytes*/
+ ulong regsize; /* sizeof registers in bytes */
+ ulong fpregsize; /* sizeof fp registers in bytes */
char *pc; /* pc name */
char *sp; /* sp name */
char *link; /* link register name */
char *sbreg; /* static base register name */
- ulong sb; /* static base register value */
+ uvlong sb; /* static base register value */
int pgsize; /* page size */
- ulong kbase; /* kernel base address */
- ulong ktmask; /* ktzero = kbase & ~ktmask */
+ uvlong kbase; /* kernel base address */
+ uvlong ktmask; /* ktzero = kbase & ~ktmask */
+ uvlong utop; /* user stack top */
int pcquant; /* quantization of pc */
int szaddr; /* sizeof(void*) */
int szreg; /* sizeof(register) */
@@ -174,26 +202,26 @@ struct Mach{
extern Mach *mach; /* Current machine */
-typedef vlong (*Rgetter)(Map*, char*);
-typedef void (*Tracer)(Map*, ulong, ulong, Symbol*);
+typedef uvlong (*Rgetter)(Map*, char*);
+typedef void (*Tracer)(Map*, uvlong, uvlong, Symbol*);
struct Machdata { /* Machine-dependent debugger support */
uchar bpinst[4]; /* break point instr. */
short bpsize; /* size of break point instr. */
- ushort (*swab)(ushort); /* short to local byte order */
- long (*swal)(long); /* long to local byte order */
- vlong (*swav)(vlong); /* vlong to local byte order */
- int (*ctrace)(Map*, ulong, ulong, ulong, Tracer); /* C traceback */
- ulong (*findframe)(Map*, ulong, ulong, ulong, ulong);/* frame finder */
+ ushort (*swab)(ushort); /* ushort to local byte order */
+ ulong (*swal)(ulong); /* ulong to local byte order */
+ uvlong (*swav)(uvlong); /* uvlong to local byte order */
+ int (*ctrace)(Map*, uvlong, uvlong, uvlong, Tracer); /* C traceback */
+ uvlong (*findframe)(Map*, uvlong, uvlong, uvlong, uvlong);/* frame finder */
char* (*excep)(Map*, Rgetter); /* last exception */
- ulong (*bpfix)(ulong); /* breakpoint fixup */
+ ulong (*bpfix)(uvlong); /* breakpoint fixup */
int (*sftos)(char*, int, void*); /* single precision float */
int (*dftos)(char*, int, void*); /* double precision float */
- int (*foll)(Map*, ulong, Rgetter, ulong*); /* follow set */
- int (*das)(Map*, ulong, char, char*, int); /* symbolic disassembly */
- int (*hexinst)(Map*, ulong, char*, int); /* hex disassembly */
- int (*instsize)(Map*, ulong); /* instruction size */
+ int (*foll)(Map*, uvlong, Rgetter, uvlong*);/* follow set */
+ int (*das)(Map*, uvlong, char, char*, int); /* symbolic disassembly */
+ int (*hexinst)(Map*, uvlong, char*, int); /* hex disassembly */
+ int (*instsize)(Map*, uvlong); /* instruction size */
};
/*
@@ -202,27 +230,29 @@ struct Machdata { /* Machine-dependent debugger support */
typedef struct Fhdr
{
char *name; /* identifier of executable */
- short type; /* file type - see codes above*/
- short hdrsz; /* size of this header */
+ uchar type; /* file type - see codes above */
+ uchar hdrsz; /* header size */
+ uchar _magic; /* _MAGIC() magic */
+ uchar spare;
long magic; /* magic number */
- long txtaddr; /* text address */
- long entry; /* entry point */
+ uvlong txtaddr; /* text address */
+ vlong txtoff; /* start of text in file */
+ uvlong dataddr; /* start of data segment */
+ vlong datoff; /* offset to data seg in file */
+ vlong symoff; /* offset of symbol table in file */
+ uvlong entry; /* entry point */
+ vlong sppcoff; /* offset of sp-pc table in file */
+ vlong lnpcoff; /* offset of line number-pc table in file */
long txtsz; /* text size */
- long txtoff; /* start of text in file */
- long dataddr; /* start of data segment */
long datsz; /* size of data seg */
- long datoff; /* offset to data seg in file */
long bsssz; /* size of bss */
long symsz; /* size of symbol table */
- long symoff; /* offset of symbol table in file */
long sppcsz; /* size of sp-pc table */
- long sppcoff; /* offset of sp-pc table in file */
long lnpcsz; /* size of line number-pc table */
- long lnpcoff; /* size of line number-pc table */
} Fhdr;
-extern int asstype; /* dissembler type - machdata.c */
-extern Machdata *machdata; /* jump vector - machdata.c */
+extern int asstype; /* dissembler type - machdata.c */
+extern Machdata *machdata; /* jump vector - machdata.c */
Map* attachproc(int, int, int, Fhdr*);
Map* attachremt(int, Fhdr*);
@@ -230,28 +260,28 @@ int beieee80ftos(char*, int, void*);
int beieeesftos(char*, int, void*);
int beieeedftos(char*, int, void*);
ushort beswab(ushort);
-long beswal(long);
-vlong beswav(vlong);
-int cisctrace(Map*, ulong, ulong, ulong, Tracer);
-ulong ciscframe(Map*, ulong, ulong, ulong, ulong);
+ulong beswal(ulong);
+uvlong beswav(uvlong);
+uvlong ciscframe(Map*, uvlong, uvlong, uvlong, uvlong);
+int cisctrace(Map*, uvlong, uvlong, uvlong, Tracer);
int crackhdr(int fd, Fhdr*);
-long file2pc(char*, ulong);
+uvlong file2pc(char*, long);
int fileelem(Sym**, uchar *, char*, int);
-int fileline(char*, int, ulong);
+long fileline(char*, int, uvlong);
int filesym(int, char*, int);
int findlocal(Symbol*, char*, Symbol*);
int findseg(Map*, char*);
-int findsym(long, int, Symbol *);
-int fnbound(long, ulong*);
+int findsym(uvlong, int, Symbol *);
+int fnbound(uvlong, uvlong*);
int fpformat(Map*, Reglist*, char*, int, int);
-int get1(Map*, ulong, uchar*, int);
-int get2(Map*, ulong, ushort*);
-int get4(Map*, ulong, long*);
-int get8(Map*, ulong, vlong*);
+int get1(Map*, uvlong, uchar*, int);
+int get2(Map*, uvlong, ushort*);
+int get4(Map*, uvlong, ulong*);
+int get8(Map*, uvlong, uvlong*);
+int geta(Map*, uvlong, uvlong*);
int getauto(Symbol*, int, int, Symbol*);
Sym* getsym(int);
int globalsym(Symbol *, int);
-int gsymoff(char*, int, long, int);
char* _hexify(char*, ulong, int);
int ieeesftos(char*, int, ulong);
int ieeedftos(char*, int, ulong, ulong);
@@ -260,11 +290,11 @@ int leieee80ftos(char*, int, void*);
int leieeesftos(char*, int, void*);
int leieeedftos(char*, int, void*);
ushort leswab(ushort);
-long leswal(long);
-vlong leswav(vlong);
-long line2addr(ulong, ulong, ulong);
+ulong leswal(ulong);
+uvlong leswav(uvlong);
+uvlong line2addr(long, uvlong, uvlong);
Map* loadmap(Map*, int, Fhdr*);
-int localaddr(Map*, char*, char*, long*, Rgetter);
+int localaddr(Map*, char*, char*, uvlong*, Rgetter);
int localsym(Symbol*, int);
int lookup(char*, char*, Symbol*);
void machbytype(int);
@@ -273,23 +303,24 @@ int nextar(Biobuf*, int, char*);
Map* newmap(Map*, int);
void objtraverse(void(*)(Sym*, void*), void*);
int objtype(Biobuf*, char**);
-long pc2sp(ulong);
-long pc2line(ulong);
-int put1(Map*, ulong, uchar*, int);
-int put2(Map*, ulong, ushort);
-int put4(Map*, ulong, long);
-int put8(Map*, ulong, vlong);
-int readar(Biobuf*, int, int, int);
+uvlong pc2sp(uvlong);
+long pc2line(uvlong);
+int put1(Map*, uvlong, uchar*, int);
+int put2(Map*, uvlong, ushort);
+int put4(Map*, uvlong, ulong);
+int put8(Map*, uvlong, uvlong);
+int puta(Map*, uvlong, uvlong);
+int readar(Biobuf*, int, vlong, int);
int readobj(Biobuf*, int);
-struct segment* reloc(Map*, ulong, long*);
-ulong riscframe(Map*, ulong, ulong, ulong, ulong);
-int risctrace(Map*, ulong, ulong, ulong, Tracer);
-int setmap(Map*, int, ulong, ulong, ulong, char*);
+uvlong riscframe(Map*, uvlong, uvlong, uvlong, uvlong);
+int risctrace(Map*, uvlong, uvlong, uvlong, Tracer);
+int setmap(Map*, int, uvlong, uvlong, vlong, char*);
void setmapio(Map*, int, Rsegio, Rsegio);
Sym* symbase(long*);
int syminit(int, Fhdr*);
-int symoff(char*, int, long, int);
-void textseg(ulong, Fhdr*);
+int symoff(char*, int, uvlong, int);
+void textseg(uvlong, Fhdr*);
int textsym(Symbol*, int);
+void thumbpctab(Biobuf*, Fhdr*);
+int thumbpclookup(uvlong);
void unusemap(Map*, int);
-