]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libmach/8.c
merge
[plan9front.git] / sys / src / libmach / 8.c
1 /*
2  * 386 definition
3  */
4 #include <u.h>
5 #include <libc.h>
6 #include <bio.h>
7 #include "/386/include/ureg.h"
8 #include <mach.h>
9
10 #define REGOFF(x)       (ulong)(&((struct Ureg *) 0)->x)
11
12 #define PC              REGOFF(pc)
13 #define SP              REGOFF(sp)
14 #define AX              REGOFF(ax)
15
16 #define REGSIZE         sizeof(struct Ureg)
17 #define FP_CTLS(x)      (REGSIZE+2*(x))
18 #define FP_CTL(x)       (REGSIZE+4*(x))
19 #define FP_REG(x)       (FP_CTL(8)+16*(x))
20 #define XM_REG(x)       (FP_CTL(8)+8*16+16*(x))
21 #define FPREGSIZE       512
22
23 Reglist i386reglist[] = {
24         {"DI",          REGOFF(di),     RINT, 'X'},
25         {"SI",          REGOFF(si),     RINT, 'X'},
26         {"BP",          REGOFF(bp),     RINT, 'X'},
27         {"BX",          REGOFF(bx),     RINT, 'X'},
28         {"DX",          REGOFF(dx),     RINT, 'X'},
29         {"CX",          REGOFF(cx),     RINT, 'X'},
30         {"AX",          REGOFF(ax),     RINT, 'X'},
31         {"GS",          REGOFF(gs),     RINT, 'X'},
32         {"FS",          REGOFF(fs),     RINT, 'X'},
33         {"ES",          REGOFF(es),     RINT, 'X'},
34         {"DS",          REGOFF(ds),     RINT, 'X'},
35         {"TRAP",        REGOFF(trap),   RINT, 'X'},
36         {"ECODE",       REGOFF(ecode),  RINT, 'X'},
37         {"PC",          PC,             RINT, 'X'},
38         {"CS",          REGOFF(cs),     RINT, 'X'},
39         {"EFLAGS",      REGOFF(flags),  RINT, 'X'},
40         {"SP",          SP,             RINT, 'X'},
41         {"SS",          REGOFF(ss),     RINT, 'X'},
42
43         {"FCW",         FP_CTLS(0),     RFLT, 'x'},
44         {"FSW",         FP_CTLS(1),     RFLT, 'x'},
45         {"FTW",         FP_CTLS(2),     RFLT, 'b'},
46         {"FOP",         FP_CTLS(3),     RFLT, 'x'},
47         {"FIP",         FP_CTL(2),      RFLT, 'X'},
48         {"FCS",         FP_CTLS(6),     RFLT, 'x'},
49         {"FDP",         FP_CTL(4),      RFLT, 'X'},
50         {"FDS",         FP_CTLS(10),    RFLT, 'x'},
51         {"MXCSR",       FP_CTL(6),      RFLT, 'X'},
52         {"MXCSRMASK",   FP_CTL(7),      RFLT, 'X'},
53
54         {"M0",          FP_REG(0),      RFLT, 'F'},     /* assumes double */
55         {"M1",          FP_REG(1),      RFLT, 'F'},
56         {"M2",          FP_REG(2),      RFLT, 'F'},
57         {"M3",          FP_REG(3),      RFLT, 'F'},
58         {"M4",          FP_REG(4),      RFLT, 'F'},
59         {"M5",          FP_REG(5),      RFLT, 'F'},
60         {"M6",          FP_REG(6),      RFLT, 'F'},
61         {"M7",          FP_REG(7),      RFLT, 'F'},
62
63         {"X0",          XM_REG(0),      RFLT, 'F'},     /* assumes double */
64         {"X1",          XM_REG(1),      RFLT, 'F'},
65         {"X2",          XM_REG(2),      RFLT, 'F'},
66         {"X3",          XM_REG(3),      RFLT, 'F'},
67         {"X4",          XM_REG(4),      RFLT, 'F'},
68         {"X5",          XM_REG(5),      RFLT, 'F'},
69         {"X6",          XM_REG(6),      RFLT, 'F'},
70         {"X7",          XM_REG(7),      RFLT, 'F'},
71
72         {"F0",          FP_REG(0),      RFLT, '3'},
73         {"F1",          FP_REG(1),      RFLT, '3'},
74         {"F2",          FP_REG(2),      RFLT, '3'},
75         {"F3",          FP_REG(3),      RFLT, '3'},
76         {"F4",          FP_REG(4),      RFLT, '3'},
77         {"F5",          FP_REG(5),      RFLT, '3'},
78         {"F6",          FP_REG(6),      RFLT, '3'},
79         {"F7",          FP_REG(7),      RFLT, '3'},
80
81         {  0 }
82 };
83
84 Mach mi386 =
85 {
86         "386",
87         MI386,          /* machine type */
88         i386reglist,    /* register list */
89         REGSIZE,        /* size of registers in bytes */
90         FPREGSIZE,      /* size of fp registers in bytes */
91         "PC",           /* name of PC */
92         "SP",           /* name of SP */
93         0,              /* link register */
94         "setSB",        /* static base register name (bogus anyways) */
95         0,              /* static base register value */
96         0x1000,         /* page size */
97         0xF0100000ULL,  /* kernel base */
98         0xF0000000ULL,  /* kernel text mask */
99         0x7FFFFFFFULL,  /* user stack top */
100         1,              /* quantization of pc */
101         4,              /* szaddr */
102         4,              /* szreg */
103         4,              /* szfloat */
104         8,              /* szdouble */
105 };