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