FAILED: patch "[PATCH] KVM: nVMX: Handle pending #DB when injecting INIT VM-exit" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 684c0422da71da0cd81319c90b8099b563b13da4 Mon Sep 17 00:00:00 2001
From: Oliver Upton <[email protected]>
Date: Fri, 7 Feb 2020 02:36:05 -0800
Subject: [PATCH] KVM: nVMX: Handle pending #DB when injecting INIT VM-exit
SDM 27.3.4 states that the 'pending debug exceptions' VMCS field will be populated if a VM-exit caused by an INIT signal takes priority over a debug-trap. Emulate this behavior when synthesizing an INIT signal VM-exit into L1.
arch/x86/kvm/vmx/nested.c +28 -0
@@ -3575,6 +3575,33 @@ static void nested_vmx_inject_exception_vmexit(struct kvm_vcpu *vcpu,nested_vmx_vmexit (vcpu,EXIT_REASON_EXCEPTION_NMI , intr_info, exit_qual); } +/* +* Returns true if a debug trap is pending delivery. +* +* In KVM, debug traps bear an exception payload. As such, the class of a #DB +* exception may be inferred from the presence of an exception payload. +*/ +static inline bool vmx_pending_dbg_trap (struct kvm_vcpu *vcpu) +{ +return vcpu->arch.exception.pending && + vcpu->arch.exception.nr ==DB_VECTOR && + vcpu->arch.exception.payload; +} + +/* +* Certain VM-exits set the 'pending debug exceptions' field to indicate a +* recognized #DB (data or single-step) that has yet to be delivered. Since KVM +* represents these debug traps with a payload that is said to be compatible +* with the 'pending debug exceptions' field, write the payload to the VMCS +* field if a VM-exit is delivered before the debug trap. +*/ +static void nested_vmx_update_pending_dbg (struct kvm_vcpu *vcpu) +{ +if (vmx_pending_dbg_trap (vcpu)) +vmcs_writel (GUEST_PENDING_DBG_EXCEPTIONS , + vcpu->arch.exception.payload); +} +static int vmx_check_nested_events (struct kvm_vcpu *vcpu,bool external_intr) {struct vcpu_vmx *vmx =to_vmx (vcpu);
@@ -3587,6 +3614,7 @@ static int vmx_check_nested_events(struct kvm_vcpu *vcpu, bool external_intr) test_bit(KVM_APIC_INIT, &apic->pending_events)) {if (block_nested_events)return -EBUSY ; +nested_vmx_update_pending_dbg (vcpu);clear_bit (KVM_APIC_INIT , &apic->pending_events);nested_vmx_vmexit (vcpu,EXIT_REASON_INIT_SIGNAL ,0 ,0 );return 0 ;