Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/intel/vmx.c
Show First 20 Lines • Show All 1,967 Lines • ▼ Show 20 Lines | ept_fault_type(uint64_t ept_qual) | ||||
else if (ept_qual & EPT_VIOLATION_INST_FETCH) | else if (ept_qual & EPT_VIOLATION_INST_FETCH) | ||||
fault_type = VM_PROT_EXECUTE; | fault_type = VM_PROT_EXECUTE; | ||||
else | else | ||||
fault_type= VM_PROT_READ; | fault_type= VM_PROT_READ; | ||||
return (fault_type); | return (fault_type); | ||||
} | } | ||||
static boolean_t | static bool | ||||
ept_emulation_fault(uint64_t ept_qual) | ept_emulation_fault(uint64_t ept_qual) | ||||
{ | { | ||||
int read, write; | int read, write; | ||||
/* EPT fault on an instruction fetch doesn't make sense here */ | /* EPT fault on an instruction fetch doesn't make sense here */ | ||||
if (ept_qual & EPT_VIOLATION_INST_FETCH) | if (ept_qual & EPT_VIOLATION_INST_FETCH) | ||||
return (FALSE); | return (false); | ||||
/* EPT fault must be a read fault or a write fault */ | /* EPT fault must be a read fault or a write fault */ | ||||
read = ept_qual & EPT_VIOLATION_DATA_READ ? 1 : 0; | read = ept_qual & EPT_VIOLATION_DATA_READ ? 1 : 0; | ||||
write = ept_qual & EPT_VIOLATION_DATA_WRITE ? 1 : 0; | write = ept_qual & EPT_VIOLATION_DATA_WRITE ? 1 : 0; | ||||
if ((read | write) == 0) | if ((read | write) == 0) | ||||
return (FALSE); | return (false); | ||||
/* | /* | ||||
* The EPT violation must have been caused by accessing a | * The EPT violation must have been caused by accessing a | ||||
* guest-physical address that is a translation of a guest-linear | * guest-physical address that is a translation of a guest-linear | ||||
* address. | * address. | ||||
*/ | */ | ||||
if ((ept_qual & EPT_VIOLATION_GLA_VALID) == 0 || | if ((ept_qual & EPT_VIOLATION_GLA_VALID) == 0 || | ||||
(ept_qual & EPT_VIOLATION_XLAT_VALID) == 0) { | (ept_qual & EPT_VIOLATION_XLAT_VALID) == 0) { | ||||
return (FALSE); | return (false); | ||||
} | } | ||||
return (TRUE); | return (true); | ||||
} | } | ||||
static __inline int | static __inline int | ||||
apic_access_virtualization(struct vmx *vmx, int vcpuid) | apic_access_virtualization(struct vmx *vmx, int vcpuid) | ||||
{ | { | ||||
uint32_t proc_ctls2; | uint32_t proc_ctls2; | ||||
proc_ctls2 = vmx->cap[vcpuid].proc_ctls2; | proc_ctls2 = vmx->cap[vcpuid].proc_ctls2; | ||||
▲ Show 20 Lines • Show All 1,800 Lines • Show Last 20 Lines |