]> git.lizzy.rs Git - plan9front.git/blob - sys/include/mach.h
libc, seconds: new time and date apis (try 2)
[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                 long    (*read)(int, void *, long, vlong);
134                 int     inuse;          /* in use - not in use */
135                 int     cache;          /* should cache reads? */
136                 uvlong  b;              /* base */
137                 uvlong  e;              /* end */
138                 vlong   f;              /* offset within file */
139         } seg[1];                       /* actually n of these */
140 };
141
142 /*
143  *      Internal structure describing a symbol table entry
144  */
145 struct Symbol {
146         void    *handle;                /* used internally - owning func */
147         struct {
148                 char    *name;
149                 vlong   value;          /* address or stack offset */
150                 char    type;           /* as in a.out.h */
151                 char    class;          /* as above */
152                 int     index;          /* in findlocal, globalsym, textsym */
153         };
154 };
155
156 /*
157  *      machine register description
158  */
159 struct Reglist {
160         char    *rname;                 /* register name */
161         short   roffs;                  /* offset in u-block */
162         char    rflags;                 /* INTEGER/FLOAT, WRITABLE */
163         char    rformat;                /* print format: 'x', 'X', 'f', '8', '3', 'Y', 'W' */
164 };
165
166 enum {                                  /* bits in rflags field */
167         RINT    = (0<<0),
168         RFLT    = (1<<0),
169         RRDONLY = (1<<1),
170 };
171
172 /*
173  *      Machine-dependent data is stored in two structures:
174  *              Mach  - miscellaneous general parameters
175  *              Machdata - jump vector of service functions used by debuggers
176  *
177  *      Mach is defined in ?.c and set in executable.c
178  *
179  *      Machdata is defined in ?db.c
180  *              and set in the debugger startup.
181  */
182 struct Mach{
183         char    *name;
184         int     mtype;                  /* machine type code */
185         Reglist *reglist;               /* register set */
186         long    regsize;                /* sizeof registers in bytes */
187         long    fpregsize;              /* sizeof fp registers in bytes */
188         char    *pc;                    /* pc name */
189         char    *sp;                    /* sp name */
190         char    *link;                  /* link register name */
191         char    *sbreg;                 /* static base register name */
192         uvlong  sb;                     /* static base register value */
193         int     pgsize;                 /* page size */
194         uvlong  kbase;                  /* kernel base address */
195         uvlong  ktmask;                 /* ktzero = kbase & ~ktmask */
196         uvlong  utop;                   /* user stack top */
197         int     pcquant;                /* quantization of pc */
198         int     szaddr;                 /* sizeof(void*) */
199         int     szreg;                  /* sizeof(register) */
200         int     szfloat;                /* sizeof(float) */
201         int     szdouble;               /* sizeof(double) */
202 };
203
204 extern  Mach    *mach;                  /* Current machine */
205
206 typedef uvlong  (*Rgetter)(Map*, char*);
207 typedef void    (*Tracer)(Map*, uvlong, uvlong, Symbol*);
208
209 struct  Machdata {              /* Machine-dependent debugger support */
210         uchar   bpinst[4];                      /* break point instr. */
211         short   bpsize;                         /* size of break point instr. */
212
213         ushort  (*swab)(ushort);                /* ushort to local byte order */
214         ulong   (*swal)(ulong);                 /* ulong to local byte order */
215         uvlong  (*swav)(uvlong);                /* uvlong to local byte order */
216         int     (*ctrace)(Map*, uvlong, uvlong, uvlong, Tracer); /* C traceback */
217         uvlong  (*findframe)(Map*, uvlong, uvlong, uvlong, uvlong);/* frame finder */
218         char*   (*excep)(Map*, Rgetter);        /* last exception */
219         ulong   (*bpfix)(uvlong);               /* breakpoint fixup */
220         int     (*sftos)(char*, int, void*);    /* single precision float */
221         int     (*dftos)(char*, int, void*);    /* double precision float */
222         int     (*foll)(Map*, uvlong, Rgetter, uvlong*);/* follow set */
223         int     (*das)(Map*, uvlong, char, char*, int); /* symbolic disassembly */
224         int     (*hexinst)(Map*, uvlong, char*, int);   /* hex disassembly */
225         int     (*instsize)(Map*, uvlong);      /* instruction size */
226 };
227
228 /*
229  *      Common a.out header describing all architectures
230  */
231 typedef struct Fhdr
232 {
233         char    *name;          /* identifier of executable */
234         uchar   type;           /* file type - see codes above */
235         uchar   hdrsz;          /* header size */
236         uchar   _magic;         /* _MAGIC() magic */
237         uchar   spare;
238         long    magic;          /* magic number */
239         uvlong  txtaddr;        /* text address */
240         vlong   txtoff;         /* start of text in file */
241         uvlong  dataddr;        /* start of data segment */
242         vlong   datoff;         /* offset to data seg in file */
243         vlong   symoff;         /* offset of symbol table in file */
244         uvlong  entry;          /* entry point */
245         vlong   sppcoff;        /* offset of sp-pc table in file */
246         vlong   lnpcoff;        /* offset of line number-pc table in file */
247         long    txtsz;          /* text size */
248         long    datsz;          /* size of data seg */
249         long    bsssz;          /* size of bss */
250         long    symsz;          /* size of symbol table */
251         long    sppcsz;         /* size of sp-pc table */
252         long    lnpcsz;         /* size of line number-pc table */
253 } Fhdr;
254
255 extern  int     asstype;        /* dissembler type - machdata.c */
256 extern  Machdata *machdata;     /* jump vector - machdata.c */
257
258 Map*            attachproc(int, int, int, Fhdr*);
259 int             beieee80ftos(char*, int, void*);
260 int             beieeesftos(char*, int, void*);
261 int             beieeedftos(char*, int, void*);
262 ushort          beswab(ushort);
263 ulong           beswal(ulong);
264 uvlong          beswav(uvlong);
265 uvlong          ciscframe(Map*, uvlong, uvlong, uvlong, uvlong);
266 int             cisctrace(Map*, uvlong, uvlong, uvlong, Tracer);
267 int             crackhdr(int fd, Fhdr*);
268 uvlong          file2pc(char*, long);
269 int             fileelem(Sym**, uchar *, char*, int);
270 long            fileline(char*, int, uvlong);
271 int             filesym(int, char*, int);
272 int             findlocal(Symbol*, char*, Symbol*);
273 int             findseg(Map*, char*);
274 int             findsym(uvlong, int, Symbol *);
275 int             fnbound(uvlong, uvlong*);
276 int             fpformat(Map*, Reglist*, char*, int, int);
277 int             get1(Map*, uvlong, uchar*, int);
278 int             get2(Map*, uvlong, ushort*);
279 int             get4(Map*, uvlong, ulong*);
280 int             get8(Map*, uvlong, uvlong*);
281 int             geta(Map*, uvlong, uvlong*);
282 int             getauto(Symbol*, int, int, Symbol*);
283 Sym*            getsym(int);
284 int             globalsym(Symbol *, int);
285 char*           _hexify(char*, ulong, int);
286 int             ieeesftos(char*, int, ulong);
287 int             ieeedftos(char*, int, ulong, ulong);
288 int             isar(Biobuf*);
289 int             leieee80ftos(char*, int, void*);
290 int             leieeesftos(char*, int, void*);
291 int             leieeedftos(char*, int, void*);
292 ushort          leswab(ushort);
293 ulong           leswal(ulong);
294 uvlong          leswav(uvlong);
295 uvlong          line2addr(long, uvlong, uvlong);
296 Map*            loadmap(Map*, int, Fhdr*);
297 int             localaddr(Map*, char*, char*, uvlong*, Rgetter);
298 int             localsym(Symbol*, int);
299 int             lookup(char*, char*, Symbol*);
300 void            machbytype(int);
301 int             machbyname(char*);
302 int             nextar(Biobuf*, int, char*);
303 Map*            newmap(Map*, int);
304 void            objtraverse(void(*)(Sym*, void*), void*);
305 int             objtype(Biobuf*, char**);
306 uvlong          pc2sp(uvlong);
307 long            pc2line(uvlong);
308 int             put1(Map*, uvlong, uchar*, int);
309 int             put2(Map*, uvlong, ushort);
310 int             put4(Map*, uvlong, ulong);
311 int             put8(Map*, uvlong, uvlong);
312 int             puta(Map*, uvlong, uvlong);
313 int             readar(Biobuf*, int, vlong, int);
314 int             readobj(Biobuf*, int);
315 uvlong          riscframe(Map*, uvlong, uvlong, uvlong, uvlong);
316 int             risctrace(Map*, uvlong, uvlong, uvlong, Tracer);
317 int             setmap(Map*, int, uvlong, uvlong, vlong, char*);
318 Sym*            symbase(long*);
319 int             syminit(int, Fhdr*);
320 int             symoff(char*, int, uvlong, int);
321 void            textseg(uvlong, Fhdr*);
322 int             textsym(Symbol*, int);
323 void            unusemap(Map*, int);