visor/include/x86/vmx.h
2025-03-10 20:24:32 +01:00

89 lines
1.3 KiB
C

#ifndef _VISOR_VMX_H_
#define _VISOR_VMX_H_
#include <stdint.h>
struct VMXON {
uint32_t revisionID;
uint32_t abortIndicator;
char vmcsData[];
};
struct VMCS {
int _placeholder;
/* 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 void
vmptrld(void *region)
{
__asm__ volatile ("vmptrld %0\n\t" :: "r"(region));
}
static inline void
vmptrst(void *arg)
{
__asm__ volatile ("vmptrst\n\t" ::);
}
static inline void
vmclear(void *region)
{
__asm__ volatile ("vmclear %0\n\t" :: "r"(region));
}
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