#define GDTTYPE(x) ((uvlong)(x)<<40) enum { GDTR = GDTTYPE(0x10), /* read-only */ GDTRW = GDTTYPE(0x12), /* read-write * GDTX = GDTTYPE(0x18), /* execute-only */ GDTRX = GDTTYPE(0x1A), /* read-execute */ GDTTSS = GDTTYPE(0x09), GDTA = 1ULL<<40, /* accessed */ GDTE = 1ULL<<42, /* expand down (data only) */ GDTC = GDTE, /* conforming (code only) */ GDTP = 1ULL<<47, /* present */ GDT64 = 1ULL<<53, /* 64-bit code segment */ GDT32 = 1ULL<<54, /* 32-bit segment */ GDTG = 1ULL<<55, /* granularity */ }; #define GDTLIM(l) ((l) & 0xffff | (uvlong)((l) & 0xf0000)<<32) #define GDTBASE(l) (((uvlong)(l) & 0xffffff)<<16 | (uvlong)((l) & 0xff000000)<<32) #define GDTDPL(l) ((uvlong)(l)<<45) enum { Cr0Pg = 1<<31, Cr4Pse = 1<<4, Cr4Pae = 1<<5, EferLme = 1<<8, }; extern char *x86reg[16]; extern char *x86segreg[8]; enum { CF = 1<<0, PF = 1<<2, AF = 1<<4, ZF = 1<<6, SF = 1<<7, OF = 1<<11, };