mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 06:31:58 +02:00
KVM: arm64: Compute MDCR_EL2 at vcpu_load()
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>
This commit is contained in:
parent
06d22a9c1b
commit
75a5fbaf66
|
|
@ -1341,7 +1341,6 @@ static inline bool kvm_system_needs_idmapped_vectors(void)
|
||||||
static inline void kvm_arch_sync_events(struct kvm *kvm) {}
|
static inline void kvm_arch_sync_events(struct kvm *kvm) {}
|
||||||
|
|
||||||
void kvm_init_host_debug_data(void);
|
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_setup_debug(struct kvm_vcpu *vcpu);
|
||||||
void kvm_arm_clear_debug(struct kvm_vcpu *vcpu);
|
void kvm_arm_clear_debug(struct kvm_vcpu *vcpu);
|
||||||
void kvm_vcpu_load_debug(struct kvm_vcpu *vcpu);
|
void kvm_vcpu_load_debug(struct kvm_vcpu *vcpu);
|
||||||
|
|
|
||||||
|
|
@ -804,8 +804,6 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
kvm_init_mpidr_data(kvm);
|
kvm_init_mpidr_data(kvm);
|
||||||
|
|
||||||
kvm_arm_vcpu_init_debug(vcpu);
|
|
||||||
|
|
||||||
if (likely(irqchip_in_kernel(kvm))) {
|
if (likely(irqchip_in_kernel(kvm))) {
|
||||||
/*
|
/*
|
||||||
* Map the VGIC hardware resources before running a vcpu the
|
* Map the VGIC hardware resources before running a vcpu the
|
||||||
|
|
|
||||||
|
|
@ -98,20 +98,6 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
|
||||||
preempt_enable();
|
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
|
* 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;
|
unsigned long mdscr;
|
||||||
|
|
||||||
kvm_arm_setup_mdcr_el2(vcpu);
|
|
||||||
|
|
||||||
/* Check if we need to use the debug registers. */
|
/* Check if we need to use the debug registers. */
|
||||||
if (vcpu->guest_debug || kvm_vcpu_os_lock_enabled(vcpu)) {
|
if (vcpu->guest_debug || kvm_vcpu_os_lock_enabled(vcpu)) {
|
||||||
/* Save guest debug state */
|
/* Save guest debug state */
|
||||||
|
|
@ -273,6 +257,8 @@ void kvm_vcpu_load_debug(struct kvm_vcpu *vcpu)
|
||||||
else
|
else
|
||||||
vcpu->arch.debug_owner = VCPU_DEBUG_FREE;
|
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;
|
return;
|
||||||
|
|
||||||
vcpu->arch.debug_owner = VCPU_DEBUG_GUEST_OWNED;
|
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)
|
void kvm_debug_handle_oslar(struct kvm_vcpu *vcpu, u64 val)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user