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