]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
KVM: arm64: Compute MDCR_EL2 at vcpu_load()
authorOliver Upton <oliver.upton@linux.dev>
Thu, 19 Dec 2024 22:41:10 +0000 (14:41 -0800)
committerMarc Zyngier <maz@kernel.org>
Fri, 20 Dec 2024 09:01:25 +0000 (09:01 +0000)
KVM has picked up several hacks to cope with vcpu->arch.mdcr_el2 needing
to be prepared before vcpu_load(), which is when it gets programmed
into hardware on VHE.

Now that the flows for reprogramming MDCR_EL2 have been simplified, move
that computation to vcpu_load().

Tested-by: James Clark <james.clark@linaro.org>
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20241219224116.3941496-14-oliver.upton@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/arm.c
arch/arm64/kvm/debug.c

index d61b8ed32a21a7f8d90d7c756e8d6acc4bfdd4f5..c630d59e7f4cd2ee9be4260878e5fe30b4c18ff3 100644 (file)
@@ -1341,7 +1341,6 @@ static inline bool kvm_system_needs_idmapped_vectors(void)
 static inline void kvm_arch_sync_events(struct kvm *kvm) {}
 
 void kvm_init_host_debug_data(void);
-void kvm_arm_vcpu_init_debug(struct kvm_vcpu *vcpu);
 void kvm_arm_setup_debug(struct kvm_vcpu *vcpu);
 void kvm_arm_clear_debug(struct kvm_vcpu *vcpu);
 void kvm_vcpu_load_debug(struct kvm_vcpu *vcpu);
index 44a6093b0d9eb4efb8eb5c0ffc038251de1833d1..ec581aeb41f990ce3bda33e9df11cb818dbb3ce3 100644 (file)
@@ -804,8 +804,6 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
 
        kvm_init_mpidr_data(kvm);
 
-       kvm_arm_vcpu_init_debug(vcpu);
-
        if (likely(irqchip_in_kernel(kvm))) {
                /*
                 * Map the VGIC hardware resources before running a vcpu the
index dec023673d4cee69a1ee8925914b036d6b2dd951..cc9599a7df5f2c9dbdcee11e9f80b00900b20f79 100644 (file)
@@ -98,20 +98,6 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
        preempt_enable();
 }
 
-/**
- * kvm_arm_vcpu_init_debug - setup vcpu debug traps
- *
- * @vcpu:      the vcpu pointer
- *
- * Set vcpu initial mdcr_el2 value.
- */
-void kvm_arm_vcpu_init_debug(struct kvm_vcpu *vcpu)
-{
-       preempt_disable();
-       kvm_arm_setup_mdcr_el2(vcpu);
-       preempt_enable();
-}
-
 /**
  * kvm_arm_setup_debug - set up debug related stuff
  *
@@ -131,8 +117,6 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
 {
        unsigned long mdscr;
 
-       kvm_arm_setup_mdcr_el2(vcpu);
-
        /* Check if we need to use the debug registers. */
        if (vcpu->guest_debug || kvm_vcpu_os_lock_enabled(vcpu)) {
                /* Save guest debug state */
@@ -273,6 +257,8 @@ void kvm_vcpu_load_debug(struct kvm_vcpu *vcpu)
                else
                        vcpu->arch.debug_owner = VCPU_DEBUG_FREE;
        }
+
+       kvm_arm_setup_mdcr_el2(vcpu);
 }
 
 /*
@@ -287,6 +273,7 @@ void kvm_debug_set_guest_ownership(struct kvm_vcpu *vcpu)
                return;
 
        vcpu->arch.debug_owner = VCPU_DEBUG_GUEST_OWNED;
+       kvm_arm_setup_mdcr_el2(vcpu);
 }
 
 void kvm_debug_handle_oslar(struct kvm_vcpu *vcpu, u64 val)