]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Write MDCR_EL2 directly from kvm_arm_setup_mdcr_el2()
authorOliver Upton <oliver.upton@linux.dev>
Thu, 19 Dec 2024 22:41:02 +0000 (14:41 -0800)
committerMarc Zyngier <maz@kernel.org>
Fri, 20 Dec 2024 09:01:25 +0000 (09:01 +0000)
Expecting the callee to know when MDCR_EL2 needs to be written to
hardware asking for trouble. Do the deed from kvm_arm_setup_mdcr_el2()
instead.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20241219224116.3941496-6-oliver.upton@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/debug.c

index 1ee2fd765b62ef90993533bd6f032c0a28ff17f4..fef03456284bf5ce74cbcb0601c8df123e791785 100644 (file)
@@ -73,6 +73,8 @@ static void restore_guest_debug_regs(struct kvm_vcpu *vcpu)
  */
 static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
 {
+       preempt_disable();
+
        /*
         * This also clears MDCR_EL2_E2PB_MASK and MDCR_EL2_E2TB_MASK
         * to disable guest access to the profiling and trace buffers
@@ -103,6 +105,12 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
            kvm_vcpu_os_lock_enabled(vcpu))
                vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA;
 
+       /* Write MDCR_EL2 directly if we're already at EL2 */
+       if (has_vhe())
+               write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
+
+       preempt_enable();
+
        trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2);
 }
 
@@ -148,7 +156,7 @@ void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu)
 
 void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
 {
-       unsigned long mdscr, orig_mdcr_el2 = vcpu->arch.mdcr_el2;
+       unsigned long mdscr;
 
        trace_kvm_arm_setup_debug(vcpu, vcpu->guest_debug);
 
@@ -250,10 +258,6 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
        if (vcpu_read_sys_reg(vcpu, MDSCR_EL1) & (DBG_MDSCR_KDE | DBG_MDSCR_MDE))
                vcpu_set_flag(vcpu, DEBUG_DIRTY);
 
-       /* Write mdcr_el2 changes since vcpu_load on VHE systems */
-       if (has_vhe() && orig_mdcr_el2 != vcpu->arch.mdcr_el2)
-               write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
-
        trace_kvm_arm_set_dreg32("MDSCR_EL1", vcpu_read_sys_reg(vcpu, MDSCR_EL1));
 }