As there's only one host on each CPU, there's no need to pollute struct kvm_vcpu with this field. Especially when there different state is needed between VHE and nVHE. Signed-off-by: Andrew Scull <ascull@xxxxxxxxxx> --- arch/arm64/include/asm/kvm_host.h | 15 +++------------ arch/arm64/include/asm/kvm_hyp.h | 3 +++ arch/arm64/kernel/image-vars.h | 1 + arch/arm64/kvm/arm.c | 11 +++++++++++ arch/arm64/kvm/hyp/nvhe/debug-sr.c | 4 ++-- arch/arm64/kvm/hyp/vhe/debug-sr.c | 4 ++-- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 152c050e74a9..37e94a49b668 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -308,11 +308,9 @@ struct kvm_vcpu_arch { * We maintain more than a single set of debug registers to support * debugging the guest from the host and to maintain separate host and * guest state during world switches. vcpu_debug_state are the debug - * registers of the vcpu as the guest sees them. host_debug_state are - * the host registers which are saved and restored during - * world switches. external_debug_state contains the debug - * values we want to debug the guest. This is set via the - * KVM_SET_GUEST_DEBUG ioctl. + * registers of the vcpu as the guest sees them. external_debug_state + * contains the debug values we want to debug the guest. This is set + * via the KVM_SET_GUEST_DEBUG ioctl. * * debug_ptr points to the set of debug registers that should be loaded * onto the hardware when running the guest. @@ -324,13 +322,6 @@ struct kvm_vcpu_arch { struct thread_info *host_thread_info; /* hyp VA */ struct user_fpsimd_state *host_fpsimd_state; /* hyp VA */ - struct { - /* {Break,watch}point registers */ - struct kvm_guest_debug_arch regs; - /* Statistical profiling extension */ - u64 pmscr_el1; - } host_debug_state; - /* VGIC state */ struct vgic_cpu vgic_cpu; struct arch_timer_cpu timer_cpu; diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index aec61c9f6017..75016c92d70b 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -15,6 +15,9 @@ DECLARE_PER_CPU(struct kvm_vcpu *, kvm_hyp_running_vcpu); #ifdef __KVM_NVHE_HYPERVISOR__ DECLARE_PER_CPU(struct kvm_vcpu, kvm_host_vcpu); +DECLARE_PER_CPU(u64, kvm_host_pmscr_el1); +#else +DECLARE_PER_CPU(struct kvm_guest_debug_arch, kvm_host_debug_state); #endif #define read_sysreg_elx(r,nvh,vh) \ diff --git a/arch/arm64/kernel/image-vars.h b/arch/arm64/kernel/image-vars.h index 5b93da2359d4..c75d74adfc8b 100644 --- a/arch/arm64/kernel/image-vars.h +++ b/arch/arm64/kernel/image-vars.h @@ -71,6 +71,7 @@ KVM_NVHE_ALIAS(kvm_update_va_mask); /* Global kernel state accessed by nVHE hyp code. */ KVM_NVHE_ALIAS(arm64_ssbd_callback_required); KVM_NVHE_ALIAS(kvm_host_data); +KVM_NVHE_ALIAS(kvm_host_pmscr_el1); KVM_NVHE_ALIAS(kvm_host_vcpu); KVM_NVHE_ALIAS(kvm_hyp_running_vcpu); KVM_NVHE_ALIAS(kvm_vgic_global_state); diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index fe49203948d3..cb8ac29195be 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -49,6 +49,8 @@ __asm__(".arch_extension virt"); DEFINE_PER_CPU(kvm_host_data_t, kvm_host_data); DEFINE_PER_CPU(struct kvm_vcpu, kvm_host_vcpu); DEFINE_PER_CPU(struct kvm_vcpu *, kvm_hyp_running_vcpu); +DEFINE_PER_CPU(struct kvm_guest_debug_arch, kvm_host_debug_state); +DEFINE_PER_CPU(u64, kvm_host_pmscr_el1); static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page); /* The VMID used in the VTTBR */ @@ -1549,6 +1551,7 @@ static int init_hyp_mode(void) for_each_possible_cpu(cpu) { kvm_host_data_t *cpu_data; struct kvm_vcpu *host_vcpu; + u64 *host_pmscr; struct kvm_vcpu **running_vcpu; cpu_data = per_cpu_ptr(&kvm_host_data, cpu); @@ -1567,6 +1570,14 @@ static int init_hyp_mode(void) goto out_err; } + host_pmscr = per_cpu_ptr(&kvm_host_pmscr_el1, cpu); + err = create_hyp_mappings(host_pmscr, host_pmscr + 1, PAGE_HYP); + + if (err) { + kvm_err("Cannot map host pmscr_el1: %d\n", err); + goto out_err; + } + running_vcpu = per_cpu_ptr(&kvm_hyp_running_vcpu, cpu); err = create_hyp_mappings(running_vcpu, running_vcpu + 1, PAGE_HYP); diff --git a/arch/arm64/kvm/hyp/nvhe/debug-sr.c b/arch/arm64/kvm/hyp/nvhe/debug-sr.c index a5fa40c060a8..4bf0eeb41a44 100644 --- a/arch/arm64/kvm/hyp/nvhe/debug-sr.c +++ b/arch/arm64/kvm/hyp/nvhe/debug-sr.c @@ -67,7 +67,7 @@ void __debug_switch_to_guest(struct kvm_vcpu *host_vcpu, struct kvm_vcpu *vcpu) host_dbg = host_vcpu->arch.debug_ptr; /* Disable and flush SPE data generation */ - __debug_save_spe(&vcpu->arch.host_debug_state.pmscr_el1); + __debug_save_spe(__hyp_this_cpu_ptr(kvm_host_pmscr_el1)); __debug_switch_to_guest_common(vcpu, host_dbg, host_ctxt); } @@ -79,7 +79,7 @@ void __debug_switch_to_host(struct kvm_vcpu *host_vcpu, struct kvm_vcpu *vcpu) host_ctxt = &host_vcpu->arch.ctxt; host_dbg = host_vcpu->arch.debug_ptr; - __debug_restore_spe(vcpu->arch.host_debug_state.pmscr_el1); + __debug_restore_spe(__hyp_this_cpu_read(kvm_host_pmscr_el1)); __debug_switch_to_host_common(vcpu, host_dbg, host_ctxt); } diff --git a/arch/arm64/kvm/hyp/vhe/debug-sr.c b/arch/arm64/kvm/hyp/vhe/debug-sr.c index 6225c6cdfbca..a564831726e7 100644 --- a/arch/arm64/kvm/hyp/vhe/debug-sr.c +++ b/arch/arm64/kvm/hyp/vhe/debug-sr.c @@ -16,7 +16,7 @@ void __debug_switch_to_guest(struct kvm_vcpu *vcpu) struct kvm_guest_debug_arch *host_dbg; host_ctxt = &__hyp_this_cpu_ptr(kvm_host_data)->host_ctxt; - host_dbg = &vcpu->arch.host_debug_state.regs; + host_dbg = __hyp_this_cpu_ptr(kvm_host_debug_state); __debug_switch_to_guest_common(vcpu, host_dbg, host_ctxt); } @@ -27,7 +27,7 @@ void __debug_switch_to_host(struct kvm_vcpu *vcpu) struct kvm_guest_debug_arch *host_dbg; host_ctxt = &__hyp_this_cpu_ptr(kvm_host_data)->host_ctxt; - host_dbg = &vcpu->arch.host_debug_state.regs; + host_dbg = __hyp_this_cpu_ptr(kvm_host_debug_state); __debug_switch_to_host_common(vcpu, host_dbg, host_ctxt); } -- 2.27.0.389.gc38d7665816-goog _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm