Re: [PATCH 1/2] KVM: x86: Add emulation support for #GP triggered by VM instructions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux