diff --git a/hypervisor/arch/x86/ept.c b/hypervisor/arch/x86/ept.c index f35632038..73f63a134 100644 --- a/hypervisor/arch/x86/ept.c +++ b/hypervisor/arch/x86/ept.c @@ -339,10 +339,6 @@ static int dm_emulate_mmio_pre(struct vcpu *vcpu, uint64_t exit_qual) { int status; - status = analyze_instruction(vcpu, &vcpu->mmio); - if (status != 0) - return status; - if (vcpu->mmio.read_write == HV_MEM_IO_WRITE) { status = emulate_instruction(vcpu, &vcpu->mmio); if (status != 0) @@ -404,6 +400,9 @@ int ept_violation_vmexit_handler(struct vcpu *vcpu) */ mmio->paddr = gpa; + if (decode_instruction(vcpu, mmio) != 0) + goto out; + list_for_each(pos, &vcpu->vm->mmio_list) { mmio_handler = list_entry(pos, struct mem_io_node, list); if ((mmio->paddr + mmio->access_size <= @@ -419,9 +418,6 @@ int ept_violation_vmexit_handler(struct vcpu *vcpu) return -EIO; } - if (analyze_instruction(vcpu, mmio) != 0) - goto out; - if (mmio->read_write == HV_MEM_IO_WRITE) { if (emulate_instruction(vcpu, mmio) != 0) goto out; diff --git a/hypervisor/arch/x86/guest/instr_emul.h b/hypervisor/arch/x86/guest/instr_emul.h index c3186e56c..621530d86 100644 --- a/hypervisor/arch/x86/guest/instr_emul.h +++ b/hypervisor/arch/x86/guest/instr_emul.h @@ -90,6 +90,6 @@ int vmm_decode_instruction(struct vcpu *vcpu, uint64_t gla, enum vm_cpu_mode cpu_mode, int csd, struct vie *vie); int emulate_instruction(struct vcpu *vcpu, struct mem_io *mmio); -int analyze_instruction(struct vcpu *vcpu, struct mem_io *mmio); +int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio); #endif /* _VMM_INSTRUCTION_EMUL_H_ */ diff --git a/hypervisor/arch/x86/guest/instr_emul_wrapper.c b/hypervisor/arch/x86/guest/instr_emul_wrapper.c index 2637cc095..7859ee87b 100644 --- a/hypervisor/arch/x86/guest/instr_emul_wrapper.c +++ b/hypervisor/arch/x86/guest/instr_emul_wrapper.c @@ -380,7 +380,7 @@ void vm_gva2gpa(struct vcpu *vcpu, uint64_t gva, uint64_t *gpa) vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].cr3, gva); } -int analyze_instruction(struct vcpu *vcpu, struct mem_io *mmio) +int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio) { uint64_t guest_rip_gva, guest_rip_gpa; char *guest_rip_hva; diff --git a/hypervisor/arch/x86/guest/vlapic.c b/hypervisor/arch/x86/guest/vlapic.c index c5b4d672d..2f79440bf 100644 --- a/hypervisor/arch/x86/guest/vlapic.c +++ b/hypervisor/arch/x86/guest/vlapic.c @@ -2178,7 +2178,7 @@ int apic_access_vmexit_handler(struct vcpu *vcpu) vlapic = vcpu->arch_vcpu.vlapic; - analyze_instruction(vcpu, &vcpu->mmio); + decode_instruction(vcpu, &vcpu->mmio); if (access_type == 1) { if (!emulate_instruction(vcpu, &vcpu->mmio)) vlapic_write(vlapic, 1, offset, vcpu->mmio.value);