xref: /plan9-contrib/sys/src/9k/k10/amd64.h (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1*9ef1f84bSDavid du Colombier enum {						/* Cr0 */
2*9ef1f84bSDavid du Colombier 	Pe		= 0x00000001,		/* Protected Mode Enable */
3*9ef1f84bSDavid du Colombier 	Mp		= 0x00000002,		/* Monitor Coprocessor */
4*9ef1f84bSDavid du Colombier 	Em		= 0x00000004,		/* Emulate Coprocessor */
5*9ef1f84bSDavid du Colombier 	Ts		= 0x00000008,		/* Task Switched */
6*9ef1f84bSDavid du Colombier 	Et		= 0x00000010,		/* Extension Type */
7*9ef1f84bSDavid du Colombier 	Ne		= 0x00000020,		/* Numeric Error  */
8*9ef1f84bSDavid du Colombier 	Wp		= 0x00010000,		/* Write Protect */
9*9ef1f84bSDavid du Colombier 	Am		= 0x00040000,		/* Alignment Mask */
10*9ef1f84bSDavid du Colombier 	Nw		= 0x20000000,		/* Not Writethrough */
11*9ef1f84bSDavid du Colombier 	Cd		= 0x40000000,		/* Cache Disable */
12*9ef1f84bSDavid du Colombier 	Pg		= 0x80000000,		/* Paging Enable */
13*9ef1f84bSDavid du Colombier };
14*9ef1f84bSDavid du Colombier 
15*9ef1f84bSDavid du Colombier enum {						/* Cr3 */
16*9ef1f84bSDavid du Colombier 	Pwt		= 0x00000008,		/* Page-Level Writethrough */
17*9ef1f84bSDavid du Colombier 	Pcd		= 0x00000010,		/* Page-Level Cache Disable */
18*9ef1f84bSDavid du Colombier };
19*9ef1f84bSDavid du Colombier 
20*9ef1f84bSDavid du Colombier enum {						/* Cr4 */
21*9ef1f84bSDavid du Colombier 	Vme		= 0x00000001,		/* Virtual-8086 Mode Extensions */
22*9ef1f84bSDavid du Colombier 	Pvi		= 0x00000002,		/* Protected Mode Virtual Interrupts */
23*9ef1f84bSDavid du Colombier 	Tsd		= 0x00000004,		/* Time-Stamp Disable */
24*9ef1f84bSDavid du Colombier 	De		= 0x00000008,		/* Debugging Extensions */
25*9ef1f84bSDavid du Colombier 	Pse		= 0x00000010,		/* Page-Size Extensions */
26*9ef1f84bSDavid du Colombier 	Pae		= 0x00000020,		/* Physical Address Extension */
27*9ef1f84bSDavid du Colombier 	Mce		= 0x00000040,		/* Machine Check Enable */
28*9ef1f84bSDavid du Colombier 	Pge		= 0x00000080,		/* Page-Global Enable */
29*9ef1f84bSDavid du Colombier 	Pce		= 0x00000100,		/* Performance Monitoring Counter Enable */
30*9ef1f84bSDavid du Colombier 	Osfxsr		= 0x00000200,		/* FXSAVE/FXRSTOR Support */
31*9ef1f84bSDavid du Colombier 	Osxmmexcpt	= 0x00000400,		/* Unmasked Exception Support */
32*9ef1f84bSDavid du Colombier };
33*9ef1f84bSDavid du Colombier 
34*9ef1f84bSDavid du Colombier enum {						/* Rflags */
35*9ef1f84bSDavid du Colombier 	Cf		= 0x00000001,		/* Carry Flag */
36*9ef1f84bSDavid du Colombier 	Pf		= 0x00000004,		/* Parity Flag */
37*9ef1f84bSDavid du Colombier 	Af		= 0x00000010,		/* Auxiliary Flag */
38*9ef1f84bSDavid du Colombier 	Zf		= 0x00000040,		/* Zero Flag */
39*9ef1f84bSDavid du Colombier 	Sf		= 0x00000080,		/* Sign Flag */
40*9ef1f84bSDavid du Colombier 	Tf		= 0x00000100,		/* Trap Flag */
41*9ef1f84bSDavid du Colombier 	If		= 0x00000200,		/* Interrupt Flag */
42*9ef1f84bSDavid du Colombier 	Df		= 0x00000400,		/* Direction Flag */
43*9ef1f84bSDavid du Colombier 	Of		= 0x00000800,		/* Overflow Flag */
44*9ef1f84bSDavid du Colombier 	Iopl0		= 0x00000000,		/* I/O Privilege Level */
45*9ef1f84bSDavid du Colombier 	Iopl1		= 0x00001000,
46*9ef1f84bSDavid du Colombier 	Iopl2		= 0x00002000,
47*9ef1f84bSDavid du Colombier 	Iopl3		= 0x00003000,
48*9ef1f84bSDavid du Colombier 	Nt		= 0x00004000,		/* Nested Task */
49*9ef1f84bSDavid du Colombier 	Rf		= 0x00010000,		/* Resume Flag */
50*9ef1f84bSDavid du Colombier 	Vm		= 0x00020000,		/* Virtual-8086 Mode */
51*9ef1f84bSDavid du Colombier 	Ac		= 0x00040000,		/* Alignment Check */
52*9ef1f84bSDavid du Colombier 	Vif		= 0x00080000,		/* Virtual Interrupt Flag */
53*9ef1f84bSDavid du Colombier 	Vip		= 0x00100000,		/* Virtual Interrupt Pending */
54*9ef1f84bSDavid du Colombier 	Id		= 0x00200000,		/* ID Flag */
55*9ef1f84bSDavid du Colombier };
56*9ef1f84bSDavid du Colombier 
57*9ef1f84bSDavid du Colombier enum {						/* MSRs */
58*9ef1f84bSDavid du Colombier 	Efer		= 0xc0000080,		/* Extended Feature Enable */
59*9ef1f84bSDavid du Colombier 	Star		= 0xc0000081,		/* Legacy Target IP and [CS]S */
60*9ef1f84bSDavid du Colombier 	Lstar		= 0xc0000082,		/* Long Mode Target IP */
61*9ef1f84bSDavid du Colombier 	Cstar		= 0xc0000083,		/* Compatibility Target IP */
62*9ef1f84bSDavid du Colombier 	Sfmask		= 0xc0000084,		/* SYSCALL Flags Mask */
63*9ef1f84bSDavid du Colombier 	FSbase		= 0xc0000100,		/* 64-bit FS Base Address */
64*9ef1f84bSDavid du Colombier 	GSbase		= 0xc0000101,		/* 64-bit GS Base Address */
65*9ef1f84bSDavid du Colombier 	KernelGSbase	= 0xc0000102,		/* SWAPGS instruction */
66*9ef1f84bSDavid du Colombier };
67*9ef1f84bSDavid du Colombier 
68*9ef1f84bSDavid du Colombier enum {						/* Efer */
69*9ef1f84bSDavid du Colombier 	Sce		= 0x00000001,		/* System Call Extension */
70*9ef1f84bSDavid du Colombier 	Lme		= 0x00000100,		/* Long Mode Enable */
71*9ef1f84bSDavid du Colombier 	Lma		= 0x00000400,		/* Long Mode Active */
72*9ef1f84bSDavid du Colombier 	Nxe		= 0x00000800,		/* No-Execute Enable */
73*9ef1f84bSDavid du Colombier 	Svme		= 0x00001000,		/* SVM Extension Enable */
74*9ef1f84bSDavid du Colombier 	Ffxsr		= 0x00004000,		/* Fast FXSAVE/FXRSTOR */
75*9ef1f84bSDavid du Colombier };
76*9ef1f84bSDavid du Colombier 
77*9ef1f84bSDavid du Colombier enum {						/* PML4E/PDPE/PDE/PTE */
78*9ef1f84bSDavid du Colombier 	PteP		= 0x0000000000000001ull,/* Present */
79*9ef1f84bSDavid du Colombier 	PteRW		= 0x0000000000000002ull,/* Read/Write */
80*9ef1f84bSDavid du Colombier 	PteU		= 0x0000000000000004ull,/* User/Supervisor */
81*9ef1f84bSDavid du Colombier 	PtePWT		= 0x0000000000000008ull,/* Page-Level Write Through */
82*9ef1f84bSDavid du Colombier 	PtePCD		= 0x0000000000000010ull,/* Page Level Cache Disable */
83*9ef1f84bSDavid du Colombier 	PteA		= 0x0000000000000020ull,/* Accessed */
84*9ef1f84bSDavid du Colombier 	PteD		= 0x0000000000000040ull,/* Dirty */
85*9ef1f84bSDavid du Colombier 	PtePS		= 0x0000000000000080ull,/* Page Size */
86*9ef1f84bSDavid du Colombier 	Pte4KPAT	= PtePS,		/* PTE PAT */
87*9ef1f84bSDavid du Colombier 	PteG		= 0x0000000000000100ull,/* Global */
88*9ef1f84bSDavid du Colombier 	Pte2MPAT	= 0x0000000000001000ull,/* PDE PAT */
89*9ef1f84bSDavid du Colombier 	Pte1GPAT	= Pte2MPAT,		/* PDPE PAT */
90*9ef1f84bSDavid du Colombier 	PteNX		= 0x8000000000000000ull,/* No Execute */
91*9ef1f84bSDavid du Colombier };
92*9ef1f84bSDavid du Colombier 
93*9ef1f84bSDavid du Colombier enum {						/* Exceptions */
94*9ef1f84bSDavid du Colombier 	IdtDE		= 0,			/* Divide-by-Zero Error */
95*9ef1f84bSDavid du Colombier 	IdtDB		= 1,			/* Debug */
96*9ef1f84bSDavid du Colombier 	IdtNMI		= 2,			/* Non-Maskable-Interrupt */
97*9ef1f84bSDavid du Colombier 	IdtBP		= 3,			/* Breakpoint */
98*9ef1f84bSDavid du Colombier 	IdtOF		= 4,			/* Overflow */
99*9ef1f84bSDavid du Colombier 	IdtBR		= 5,			/* Bound-Range */
100*9ef1f84bSDavid du Colombier 	IdtUD		= 6,			/* Invalid-Opcode */
101*9ef1f84bSDavid du Colombier 	IdtNM		= 7,			/* Device-Not-Available */
102*9ef1f84bSDavid du Colombier 	IdtDF		= 8,			/* Double-Fault */
103*9ef1f84bSDavid du Colombier 	Idt09		= 9,			/* unsupported */
104*9ef1f84bSDavid du Colombier 	IdtTS		= 10,			/* Invalid-TSS */
105*9ef1f84bSDavid du Colombier 	IdtNP		= 11,			/* Segment-Not-Present */
106*9ef1f84bSDavid du Colombier 	IdtSS		= 12,			/* Stack */
107*9ef1f84bSDavid du Colombier 	IdtGP		= 13,			/* General-Protection */
108*9ef1f84bSDavid du Colombier 	IdtPF		= 14,			/* Page-Fault */
109*9ef1f84bSDavid du Colombier 	Idt0F		= 15,			/* reserved */
110*9ef1f84bSDavid du Colombier 	IdtMF		= 16,			/* x87 FPE-Pending */
111*9ef1f84bSDavid du Colombier 	IdtAC		= 17,			/* Alignment-Check */
112*9ef1f84bSDavid du Colombier 	IdtMC		= 18,			/* Machine-Check */
113*9ef1f84bSDavid du Colombier 	IdtXF		= 19,			/* SIMD Floating-Point */
114*9ef1f84bSDavid du Colombier };
115*9ef1f84bSDavid du Colombier 
116*9ef1f84bSDavid du Colombier /*
117*9ef1f84bSDavid du Colombier  * Vestigial Segmented Virtual Memory.
118*9ef1f84bSDavid du Colombier  */
119*9ef1f84bSDavid du Colombier enum {						/* Segment Descriptor */
120*9ef1f84bSDavid du Colombier 	SdISTM		= 0x0000000700000000ull,/* Interrupt Stack Table Mask */
121*9ef1f84bSDavid du Colombier 	SdA		= 0x0000010000000000ull,/* Accessed */
122*9ef1f84bSDavid du Colombier 	SdR		= 0x0000020000000000ull,/* Readable (Code) */
123*9ef1f84bSDavid du Colombier 	SdW		= 0x0000020000000000ull,/* Writeable (Data) */
124*9ef1f84bSDavid du Colombier 	SdE		= 0x0000040000000000ull,/* Expand Down */
125*9ef1f84bSDavid du Colombier 	SdaTSS		= 0x0000090000000000ull,/* Available TSS */
126*9ef1f84bSDavid du Colombier 	SdbTSS		= 0x00000b0000000000ull,/* Busy TSS */
127*9ef1f84bSDavid du Colombier 	SdCG		= 0x00000c0000000000ull,/* Call Gate */
128*9ef1f84bSDavid du Colombier 	SdIG		= 0x00000e0000000000ull,/* Interrupt Gate */
129*9ef1f84bSDavid du Colombier 	SdTG		= 0x00000f0000000000ull,/* Trap Gate */
130*9ef1f84bSDavid du Colombier 	SdCODE		= 0x0000080000000000ull,/* Code/Data */
131*9ef1f84bSDavid du Colombier 	SdS		= 0x0000100000000000ull,/* System/User */
132*9ef1f84bSDavid du Colombier 	SdDPL0		= 0x0000000000000000ull,/* Descriptor Privilege Level */
133*9ef1f84bSDavid du Colombier 	SdDPL1		= 0x0000200000000000ull,
134*9ef1f84bSDavid du Colombier 	SdDPL2		= 0x0000400000000000ull,
135*9ef1f84bSDavid du Colombier 	SdDPL3		= 0x0000600000000000ull,
136*9ef1f84bSDavid du Colombier 	SdP		= 0x0000800000000000ull,/* Present */
137*9ef1f84bSDavid du Colombier 	Sd4G		= 0x000f00000000ffffull,/* 4G Limit */
138*9ef1f84bSDavid du Colombier 	SdL		= 0x0020000000000000ull,/* Long Attribute */
139*9ef1f84bSDavid du Colombier 	SdD		= 0x0040000000000000ull,/* Default Operand Size */
140*9ef1f84bSDavid du Colombier 	SdG		= 0x0080000000000000ull,/* Granularity */
141*9ef1f84bSDavid du Colombier };
142*9ef1f84bSDavid du Colombier 
143*9ef1f84bSDavid du Colombier enum {						/* Segment Selector */
144*9ef1f84bSDavid du Colombier 	SsRPL0		= 0x0000,		/* Requestor Privilege Level */
145*9ef1f84bSDavid du Colombier 	SsRPL1		= 0x0001,
146*9ef1f84bSDavid du Colombier 	SsRPL2		= 0x0002,
147*9ef1f84bSDavid du Colombier 	SsRPL3		= 0x0003,
148*9ef1f84bSDavid du Colombier 	SsTIGDT		= 0x0000,		/* GDT Table Indicator  */
149*9ef1f84bSDavid du Colombier 	SsTILDT		= 0x0004,		/* LDT Table Indicator */
150*9ef1f84bSDavid du Colombier 	SsSIM		= 0xfff8,		/* Selector Index Mask */
151*9ef1f84bSDavid du Colombier };
152*9ef1f84bSDavid du Colombier 
153*9ef1f84bSDavid du Colombier #define SSEL(si, tirpl)	(((si)<<3)|(tirpl))	/* Segment Selector */
154*9ef1f84bSDavid du Colombier 
155*9ef1f84bSDavid du Colombier enum {
156*9ef1f84bSDavid du Colombier 	SiNULL		= 0,			/* NULL selector index */
157*9ef1f84bSDavid du Colombier 	SiCS		= 1,			/* CS selector index */
158*9ef1f84bSDavid du Colombier 	SiDS		= 2,			/* DS selector index */
159*9ef1f84bSDavid du Colombier 	SiU32CS		= 3,			/* User CS selector index */
160*9ef1f84bSDavid du Colombier 	SiUDS		= 4,			/* User DS selector index */
161*9ef1f84bSDavid du Colombier 	SiUCS		= 5,			/* User CS selector index */
162*9ef1f84bSDavid du Colombier 	SiFS		= 6,			/* FS selector index */
163*9ef1f84bSDavid du Colombier 	SiGS		= 7,			/* GS selector index */
164*9ef1f84bSDavid du Colombier 	SiTSS		= 8,			/* TSS selector index */
165*9ef1f84bSDavid du Colombier };
166*9ef1f84bSDavid du Colombier 
167*9ef1f84bSDavid du Colombier /*
168*9ef1f84bSDavid du Colombier  * Extern registers.
169*9ef1f84bSDavid du Colombier  */
170*9ef1f84bSDavid du Colombier #define RMACH		R15			/* m-> */
171*9ef1f84bSDavid du Colombier #define RUSER		R14			/* up-> */
172