]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: pkvm: Save host FPMR in host cpu context
authorMark Rutland <mark.rutland@arm.com>
Wed, 3 Jun 2026 11:06:15 +0000 (12:06 +0100)
committerWill Deacon <will@kernel.org>
Wed, 3 Jun 2026 15:50:47 +0000 (16:50 +0100)
Protected KVM stores most of the host's system register state in
kvm_host_data::host_ctxt, which is an instance of struct
kvm_cpu_context. As kvm_cpu_context::sys_regs[] has a slot for FPMR, we
can store the host's FPMR there.

Do so, and remove kvm_host_data::fpmr.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Fuad Tabba <tabba@google.com>
Cc: James Morse <james.morse@arm.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Oliver Upton <oupton@kernel.org>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/hyp/include/hyp/switch.h
arch/arm64/kvm/hyp/nvhe/hyp-main.c

index 851f6171751c047c6c4f99a0e833775e154e308d..0595644d6a3abbdd64bdf54a8cbb5b514ffcb4a2 100644 (file)
@@ -778,9 +778,6 @@ struct kvm_host_data {
         */
        struct cpu_sve_state *sve_state;
 
-       /* Used by pKVM only. */
-       u64     fpmr;
-
        /* Ownership of the FP regs */
        enum {
                FP_STATE_FREE,
index 98b2976837b116149823f6daf141f490b8182bd8..cc4d011a2b380db52261afa27de5d01e0d0b587e 100644 (file)
@@ -554,6 +554,8 @@ static inline void fpsimd_lazy_switch_to_host(struct kvm_vcpu *vcpu)
 
 static void kvm_hyp_save_fpsimd_host(struct kvm_vcpu *vcpu)
 {
+       struct kvm_cpu_context *hctxt = host_data_ptr(host_ctxt);
+
        /*
         * Non-protected kvm relies on the host restoring its sve state.
         * Protected kvm restores the host's sve state as not to reveal that
@@ -562,11 +564,11 @@ static void kvm_hyp_save_fpsimd_host(struct kvm_vcpu *vcpu)
        if (system_supports_sve()) {
                __hyp_sve_save_host();
        } else {
-               __fpsimd_save_state(host_data_ptr(host_ctxt.fp_regs));
+               __fpsimd_save_state(&hctxt->fp_regs);
        }
 
        if (kvm_has_fpmr(kern_hyp_va(vcpu->kvm)))
-               *host_data_ptr(fpmr) = read_sysreg_s(SYS_FPMR);
+               ctxt_sys_reg(hctxt, FPMR) = read_sysreg_s(SYS_FPMR);
 }
 
 
index 73f2e0221e70323ba57b1dec9ba738d390fe4b22..3b2c00ca94089c5eb9166155fbd27adacde06f98 100644 (file)
@@ -66,6 +66,7 @@ static void fpsimd_sve_flush(void)
 
 static void fpsimd_sve_sync(struct kvm_vcpu *vcpu)
 {
+       struct kvm_cpu_context *hctxt = host_data_ptr(host_ctxt);
        bool has_fpmr;
 
        if (!guest_owns_fp_regs())
@@ -89,10 +90,10 @@ static void fpsimd_sve_sync(struct kvm_vcpu *vcpu)
        if (system_supports_sve())
                __hyp_sve_restore_host();
        else
-               __fpsimd_restore_state(host_data_ptr(host_ctxt.fp_regs));
+               __fpsimd_restore_state(&hctxt->fp_regs);
 
        if (has_fpmr)
-               write_sysreg_s(*host_data_ptr(fpmr), SYS_FPMR);
+               write_sysreg_s(ctxt_sys_reg(hctxt, FPMR), SYS_FPMR);
 
        *host_data_ptr(fp_owner) = FP_STATE_HOST_OWNED;
 }