On 1/12/21 8:01 AM, Paolo Bonzini wrote: > 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. If the whole body inside if-statement is moved out, do you expect the interface of x86_emulate_decoded_instruction to be something like: int x86_emulate_decoded_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int emulation_type, void *insn, int insn_len, bool write_fault_to_spt) And if so, what is the emulation type to use when calling this function from svm.c? EMULTYPE_VMWARE_GP? > > - 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 >