xref: /plan9/sys/src/libmach/8.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 /*
2  * 386 definition
3  */
4 #include <u.h>
5 #include <bio.h>
6 #include "/386/include/ureg.h"
7 #include <mach.h>
8 
9 #define	MINREG	0
10 #define	MAXREG	0
11 
12 #define USIZE		0x1000
13 #define USER_REG(x)	(USIZE-((19)*4)+(ulong)(x))
14 #define FP_CTL(x)	(0x0000+4+4*(x))
15 #define FP_REG(x)	(0x0000+4+7*4+10*(x))
16 #define	SCALLOFF	(0x0000+4+108)
17 
18 #define	REGOFF(x)	(USER_REG(&((struct Ureg *) 0)->x))
19 
20 #define PC		REGOFF(pc)
21 #define SP		REGOFF(sp)
22 #define	AX		REGOFF(ax)
23 
24 Reglist i386reglist[] = {
25 	{"DI",		REGOFF(di),	RINT, 'X'},
26 	{"SI",		REGOFF(si),	RINT, 'X'},
27 	{"BP",		REGOFF(bp),	RINT, 'X'},
28 	{"BX",		REGOFF(bx),	RINT, 'X'},
29 	{"DX",		REGOFF(dx),	RINT, 'X'},
30 	{"CX",		REGOFF(cx),	RINT, 'X'},
31 	{"AX",		REGOFF(ax),	RINT, 'X'},
32 	{"GS",		REGOFF(gs),	RINT, 'X'},
33 	{"FS",		REGOFF(fs),	RINT, 'X'},
34 	{"ES",		REGOFF(es),	RINT, 'X'},
35 	{"DS",		REGOFF(ds),	RINT, 'X'},
36 	{"TRAP",	REGOFF(trap), 	RINT, 'X'},
37 	{"ECODE",	REGOFF(ecode),	RINT, 'X'},
38 	{"PC",		PC,		RINT, 'X'},
39 	{"CS",		REGOFF(cs),	RINT, 'X'},
40 	{"EFLAGS",	REGOFF(flags),	RINT, 'X'},
41 	{"SP",		SP,		RINT, 'X'},
42 	{"SS",		REGOFF(ss),	RINT, 'X'},
43 
44 	{"E0",		FP_CTL(0),	RFLT, 'X'},
45 	{"E1",		FP_CTL(1),	RFLT, 'X'},
46 	{"E2",		FP_CTL(2),	RFLT, 'X'},
47 	{"E3",		FP_CTL(3),	RFLT, 'X'},
48 	{"E4",		FP_CTL(4),	RFLT, 'X'},
49 	{"E5",		FP_CTL(5),	RFLT, 'X'},
50 	{"E6",		FP_CTL(6),	RFLT, 'X'},
51 	{"F0",		FP_REG(7),	RFLT, '3'},
52 	{"F1",		FP_REG(6),	RFLT, '3'},
53 	{"F2",		FP_REG(5),	RFLT, '3'},
54 	{"F3",		FP_REG(4),	RFLT, '3'},
55 	{"F4",		FP_REG(3),	RFLT, '3'},
56 	{"F5",		FP_REG(2),	RFLT, '3'},
57 	{"F6",		FP_REG(1),	RFLT, '3'},
58 	{"F7",		FP_REG(0),	RFLT, '3'},
59 	{  0 }
60 };
61 
62 Mach mi386 =
63 {
64 	"386",
65 	MI386,		/* machine type */
66 	i386reglist,	/* register list */
67 	MINREG,		/* minimum register */
68 	MAXREG,		/* maximum register */
69 	"PC",
70 	"SP",
71 	0,		/* link register */
72 	AX,		/* return reg */
73 	0x1000,		/* page size */
74 	0x80100000,	/* kernel base */
75 	0,		/* kernel text mask */
76 	0,		/* offset of ksp in /proc/proc */
77 	4,		/* correction to ksp value */
78 	4,		/* offset of kpc in /proc/proc */
79 	0,		/* correction to kpc value */
80 	SCALLOFF,	/* offset in ublk to sys call # */
81 	1,		/* quantization of pc */
82 	"setSB",	/* static base register name (bogus anyways) */
83 	0,		/* value */
84 	4,		/* szaddr */
85 	4,		/* szreg */
86 	4,		/* szfloat */
87 	8,		/* szdouble */
88 };
89