#ifndef _VISOR_VMX_H_ #define _VISOR_VMX_H_ #include struct VMXON { uint32_t revisionID; uint32_t abortIndicator; char vmcsData[]; }; struct VMCS { uint32_t revisionID; /* Guest-state area */ /* Host-state area */ /* VM-execution control fields */ /* VM-exit control fields */ /* VM-entry control fields */ /* VM-exit information fields */ }; static inline uint64_t vmxon(void *region) { uint64_t regionpa = (uint64_t)region; uint64_t flags; __asm__ volatile ( "vmxon %1\n\t" "pushf \n\t" "pop %0\n\t" : "=r"(flags) : "m"(regionpa)); return flags; } static inline void vmxoff(void) { __asm__ volatile ("vmxoff\n\t" ::); } static inline uint64_t vmptrld(void *region) { uint64_t regionpa = (uint64_t)region; uint64_t flags; __asm__ volatile ( "vmptrld %1\n\t" "pushf \n\t" "pop %0\n\t" : "=r"(flags) : "m"(regionpa)); return flags; } static inline void vmptrst(void *arg) { __asm__ volatile ("vmptrst\n\t" ::); } static inline uint64_t vmclear(void *region) { uint64_t regionpa = (uint64_t)region; uint64_t flags; __asm__ volatile ( "vmclear %1\n\t" "pushf \n\t" "pop %0\n\t" : "=r"(flags) : "m"(regionpa)); return flags; } static inline void vmlaunch(void) { __asm__ volatile ("vmlaunch\n\t" ::); } static inline void vmresume(void) { __asm__ volatile ("vmresume\n\t" ::); } static inline void vmread() { __asm__ volatile ("vmread\n\t" ::); } static inline void vmwrite() { __asm__ volatile ("vmwrite\n\t" ::); } static inline void vmcall() { __asm__ volatile ("vmcall\n\t" ::); } #endif