Messages in this thread | | | From | Paolo Bonzini <> | Subject | Re: [PATCH 1/2] KVM: x86: Add emulation support for #GP triggered by VM instructions | Date | Tue, 12 Jan 2021 15:01:39 +0100 |
| |
On 12/01/21 07:37, Wei Huang wrote: > static int gp_interception(struct vcpu_svm *svm) > { > struct kvm_vcpu *vcpu = &svm->vcpu; > u32 error_code = svm->vmcb->control.exit_info_1; > - > - WARN_ON_ONCE(!enable_vmware_backdoor); > + int rc; > > /* > - * VMware backdoor emulation on #GP interception only handles IN{S}, > - * OUT{S}, and RDPMC, none of which generate a non-zero error code. > + * Only VMware backdoor and SVM VME errata are handled. Neither of > + * them has non-zero error codes. > */ > if (error_code) { > kvm_queue_exception_e(vcpu, GP_VECTOR, error_code); > return 1; > } > - return kvm_emulate_instruction(vcpu, EMULTYPE_VMWARE_GP); > + > + rc = kvm_emulate_instruction(vcpu, EMULTYPE_PARAVIRT_GP); > + if (rc > 1) > + rc = svm_emulate_vm_instr(vcpu, rc); > + return rc; > } >
Passing back the third byte is quick hacky. Instead of this change to kvm_emulate_instruction, I'd rather check the instruction bytes in gp_interception before calling kvm_emulate_instruction. That would be something like:
- move "kvm_clear_exception_queue(vcpu);" inside the "if (!(emulation_type & EMULTYPE_NO_DECODE))". It doesn't apply when you are coming back from userspace.
- extract the "if (!(emulation_type & EMULTYPE_NO_DECODE))" body to a new function x86_emulate_decoded_instruction. Call it from gp_interception, we know this is not a pagefault and therefore vcpu->arch.write_fault_to_shadow_pgtable must be false.
- check ctxt->insn_bytes for an SVM instruction
- if not an SVM instruction, call kvm_emulate_instruction(vcpu, EMULTYPE_VMWARE_GP|EMULTYPE_NO_DECODE).
Thanks,
Paolo
| |