Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 *      Architecture-dependent application data
 */
#include "a.out.h"
#pragma src     "/sys/src/libmach"
#pragma lib     "libmach.a"
/*
 *      Supported architectures:
 *              mips,
 *              68020,
 *              i386,
 *              amd64,
 *              sparc,
 *              mips2 (R4000)
 *              arm
 *              powerpc,
 *              powerpc64
 *              arm64
 */
enum
{
        MMIPS,                  /* machine types */
        MSPARC,
        M68020,
        MI386,
        MI960,                  /* retired */
        M3210,                  /* retired */
        MMIPS2,
        NMIPS2,
        M29000,                 /* retired */
        MARM,
        MPOWER,
        MALPHA,                 /* retired */
        NMIPS,
        MSPARC64,               /* retired */
        MAMD64,
        MPOWER64,
        MARM64,
                                /* types of executables */
        FNONE = 0,              /* unidentified */
        FMIPS,                  /* v.out */
        FMIPSB,                 /* mips bootable */
        FSPARC,                 /* k.out */
        FSPARCB,                /* Sparc bootable */
        F68020,                 /* 2.out */
        F68020B,                /* 68020 bootable */
        FNEXTB,                 /* Next bootable */
        FI386,                  /* 8.out */
        FI386B,                 /* I386 bootable */
        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,               /* 0.out */
        FALPHA,                 /* retired */
        FALPHAB,                /* retired DEC Alpha bootable */
        FMIPSLE,                /* 3k little endian */
        FSPARC64,               /* retired */
        FAMD64,                 /* 6.out */
        FAMD64B,                /* 6.out bootable */
        FPOWER64,               /* 9.out */
        FPOWER64B,              /* 9.out bootable */
        FARM64,                 /* arm64 */
        FARM64B,                /* arm64 bootable */

        ANONE = 0,              /* dissembler types */
        AMIPS,
        AMIPSCO,                /* native mips */
        ASPARC,
        ASUNSPARC,              /* native sun */
        A68020,
        AI386,
        AI8086,                 /* oh god */
        AI960,                  /* retired */
        A29000,                 /* retired */
        AARM,
        APOWER,
        AALPHA,                 /* retired */
        ASPARC64,               /* retired */
        AAMD64,
        APOWER64,
        AARM64,
                                /* object file types */
        Obj68020 = 0,           /* .2 */
        ObjSparc,               /* .k */
        ObjMips,                /* .v */
        Obj386,                 /* .8 */
        Obj960,                 /* retired */
        Obj3210,                /* retired */
        ObjMips2,               /* .4 */
        Obj29000,               /* retired */
        ObjArm,                 /* .5 */
        ObjPower,               /* .q */
        ObjMips2le,             /* .0 */
        ObjAlpha,               /* retired */
        ObjSparc64,             /* retired */
        ObjAmd64,               /* .6 */
        ObjSpim,                /* .0 */
        ObjPower64,             /* .9 */
        ObjArm64,               /* .4? */
        Maxobjtype,

        CNONE  = 0,             /* symbol table classes */
        CAUTO,
        CPARAM,
        CSTAB,
        CTEXT,
        CDATA,
        CANY,                   /* to look for any class */
};

typedef struct  Map     Map;
typedef struct  Symbol  Symbol;
typedef struct  Reglist Reglist;
typedef struct  Mach    Mach;
typedef struct  Machdata Machdata;

/*
 *      Structure to map a segment to a position in a file
 */
struct Map {
        int     nsegs;                  /* number of segments */
        struct segment {                /* per-segment map */
                char    *name;          /* the segment name */
                int     fd;             /* file descriptor */
                int     inuse;          /* in use - not in use */
                int     cache;          /* should cache reads? */
                uvlong  b;              /* base */
                uvlong  e;              /* end */
                vlong   f;              /* offset within file */
        } seg[1];                       /* actually n of these */
};

/*
 *      Internal structure describing a symbol table entry
 */
struct Symbol {
        void    *handle;                /* used internally - owning func */
        struct {
                char    *name;
                vlong   value;          /* address or stack offset */
                char    type;           /* as in a.out.h */
                char    class;          /* as above */
                int     index;          /* in findlocal, globalsym, textsym */
        };
};

/*
 *      machine register description
 */
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', '3', 'Y', 'W' */
};

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 ?.c and set in executable.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 */
        long    regsize;                /* sizeof registers in bytes */
        long    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 */
        uvlong  sb;                     /* static base register value */
        int     pgsize;                 /* page size */
        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) */
        int     szfloat;                /* sizeof(float) */
        int     szdouble;               /* sizeof(double) */
};

extern  Mach    *mach;                  /* Current machine */

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);                /* 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)(uvlong);               /* breakpoint fixup */
        int     (*sftos)(char*, int, void*);    /* single precision float */
        int     (*dftos)(char*, int, void*);    /* double precision float */
        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 */
};

/*
 *      Common a.out header describing all architectures
 */
typedef struct Fhdr
{
        char    *name;          /* identifier of executable */
        uchar   type;           /* file type - see codes above */
        uchar   hdrsz;          /* header size */
        uchar   _magic;         /* _MAGIC() magic */
        uchar   spare;
        long    magic;          /* magic number */
        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    datsz;          /* size of data seg */
        long    bsssz;          /* size of bss */
        long    symsz;          /* size of symbol table */
        long    sppcsz;         /* size of sp-pc table */
        long    lnpcsz;         /* size of line number-pc table */
} Fhdr;

extern  int     asstype;        /* dissembler type - machdata.c */
extern  Machdata *machdata;     /* jump vector - machdata.c */

Map*            attachproc(int, int, int, Fhdr*);
int             beieee80ftos(char*, int, void*);
int             beieeesftos(char*, int, void*);
int             beieeedftos(char*, int, void*);
ushort          beswab(ushort);
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*);
uvlong          file2pc(char*, long);
int             fileelem(Sym**, uchar *, char*, int);
long            fileline(char*, int, uvlong);
int             filesym(int, char*, int);
int             findlocal(Symbol*, char*, Symbol*);
int             findseg(Map*, char*);
int             findsym(uvlong, int, Symbol *);
int             fnbound(uvlong, uvlong*);
int             fpformat(Map*, Reglist*, char*, int, int);
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);
char*           _hexify(char*, ulong, int);
int             ieeesftos(char*, int, ulong);
int             ieeedftos(char*, int, ulong, ulong);
int             isar(Biobuf*);
int             leieee80ftos(char*, int, void*);
int             leieeesftos(char*, int, void*);
int             leieeedftos(char*, int, void*);
ushort          leswab(ushort);
ulong           leswal(ulong);
uvlong          leswav(uvlong);
uvlong          line2addr(long, uvlong, uvlong);
Map*            loadmap(Map*, int, Fhdr*);
int             localaddr(Map*, char*, char*, uvlong*, Rgetter);
int             localsym(Symbol*, int);
int             lookup(char*, char*, Symbol*);
void            machbytype(int);
int             machbyname(char*);
int             nextar(Biobuf*, int, char*);
Map*            newmap(Map*, int);
void            objtraverse(void(*)(Sym*, void*), void*);
int             objtype(Biobuf*, char**);
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);
uvlong          riscframe(Map*, uvlong, uvlong, uvlong, uvlong);
int             risctrace(Map*, uvlong, uvlong, uvlong, Tracer);
int             setmap(Map*, int, uvlong, uvlong, vlong, char*);
Sym*            symbase(long*);
int             syminit(int, Fhdr*);
int             symoff(char*, int, uvlong, int);
void            textseg(uvlong, Fhdr*);
int             textsym(Symbol*, int);
void            unusemap(Map*, int);