From b34bc46188b2535bb0e9085b4d004f0015b85358 Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Wed, 25 May 2022 14:52:00 +0000 Subject: [PATCH] ANDROID: KVM: arm64: Factor out code for saving/restoring guest debug regs This code will be reused when supporting debug for non-protected VMs in protected mode. No functional change intended Bug: 228011917 Signed-off-by: Fuad Tabba Change-Id: If05dc8fdb3fff8e811f06cf5050d3eaf0ce67116 Signed-off-by: Quentin Perret --- arch/arm64/include/asm/kvm_host.h | 17 +++++++++++++++++ arch/arm64/kvm/debug.c | 12 ++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 26c145aa7fa6..bac1038ace93 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -991,9 +991,26 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu); void kvm_arm_clear_debug(struct kvm_vcpu *vcpu); void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu); +#define __vcpu_save_guest_debug_regs(vcpu) \ + do { \ + u64 val = vcpu_read_sys_reg(vcpu, MDSCR_EL1); \ + \ + (vcpu)->arch.guest_debug_preserved.mdscr_el1 = val; \ + } while(0) + +#define __vcpu_restore_guest_debug_regs(vcpu) \ + do { \ + u64 val = (vcpu)->arch.guest_debug_preserved.mdscr_el1; \ + \ + vcpu_write_sys_reg(vcpu, val, MDSCR_EL1); \ + } while (0) + #define kvm_vcpu_os_lock_enabled(vcpu) \ (!!(__vcpu_sys_reg(vcpu, OSLSR_EL1) & SYS_OSLSR_OSLK)) +#define kvm_vcpu_needs_debug_regs(vcpu) \ + ((vcpu)->guest_debug || kvm_vcpu_os_lock_enabled(vcpu)) + int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr); int kvm_arm_vcpu_arch_get_attr(struct kvm_vcpu *vcpu, diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index fccf9ec01813..81218d707b01 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -39,9 +39,7 @@ static DEFINE_PER_CPU(u64, mdcr_el2); */ static void save_guest_debug_regs(struct kvm_vcpu *vcpu) { - u64 val = vcpu_read_sys_reg(vcpu, MDSCR_EL1); - - vcpu->arch.guest_debug_preserved.mdscr_el1 = val; + __vcpu_save_guest_debug_regs(vcpu); trace_kvm_arm_set_dreg32("Saved MDSCR_EL1", vcpu->arch.guest_debug_preserved.mdscr_el1); @@ -52,9 +50,7 @@ static void save_guest_debug_regs(struct kvm_vcpu *vcpu) static void restore_guest_debug_regs(struct kvm_vcpu *vcpu) { - u64 val = vcpu->arch.guest_debug_preserved.mdscr_el1; - - vcpu_write_sys_reg(vcpu, val, MDSCR_EL1); + __vcpu_restore_guest_debug_regs(vcpu); trace_kvm_arm_set_dreg32("Restored MDSCR_EL1", vcpu_read_sys_reg(vcpu, MDSCR_EL1)); @@ -175,7 +171,7 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) 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)) { + if (kvm_vcpu_needs_debug_regs(vcpu)) { /* Save guest debug state */ save_guest_debug_regs(vcpu); @@ -284,7 +280,7 @@ void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) /* * Restore the guest's debug registers if we were using them. */ - if (vcpu->guest_debug || kvm_vcpu_os_lock_enabled(vcpu)) { + if (kvm_vcpu_needs_debug_regs(vcpu)) { if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) { if (!(*vcpu_cpsr(vcpu) & DBG_SPSR_SS)) /*