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