]> git.lizzy.rs Git - plan9front.git/blob - sys/include/mach.h
merge
[plan9front.git] / sys / include / mach.h
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);