#ifndef _VISOR_CR_H_ #define _VISOR_CR_H_ #include #define CR4_VMXE (1 << 13) // TODO properly handle segment registers as 16-bit values #define DECLARE_REGISTER_ACCESSORS(regname)\ static inline uint64_t read##regname(void) {\ uint64_t v;\ __asm__ ("mov %%" #regname ", %0\n\t" : "=a"(v));\ return v;\ }\ static inline void write##regname(uint64_t v) {\ __asm__ ("mov %0, %%" #regname "\n\t" :: "a"(v));\ } /* Segment Selectors */ DECLARE_REGISTER_ACCESSORS(es) DECLARE_REGISTER_ACCESSORS(cs) DECLARE_REGISTER_ACCESSORS(ss) DECLARE_REGISTER_ACCESSORS(ds) DECLARE_REGISTER_ACCESSORS(fs) DECLARE_REGISTER_ACCESSORS(gs) /* Control Registers */ DECLARE_REGISTER_ACCESSORS(cr0) DECLARE_REGISTER_ACCESSORS(cr1) DECLARE_REGISTER_ACCESSORS(cr2) DECLARE_REGISTER_ACCESSORS(cr3) DECLARE_REGISTER_ACCESSORS(cr4) /* Debug Registers */ DECLARE_REGISTER_ACCESSORS(dr0) DECLARE_REGISTER_ACCESSORS(dr1) DECLARE_REGISTER_ACCESSORS(dr2) DECLARE_REGISTER_ACCESSORS(dr3) DECLARE_REGISTER_ACCESSORS(dr4) DECLARE_REGISTER_ACCESSORS(dr5) DECLARE_REGISTER_ACCESSORS(dr6) DECLARE_REGISTER_ACCESSORS(dr7) static inline uint16_t readtr(void) { uint16_t v; __asm__ ("str %0\n\t" : "=a"(v)); return v; } static inline uint64_t readflags(void) { uint64_t v; __asm__ ("pushf\n\tpop %0\n\t" : "=a"(v)); return v; } #endif