]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
KVM: arm64: Flush hyp bss section after initialization of variables in bss
authorLokesh Vutla <lokeshvutla@google.com>
Tue, 21 Jan 2025 04:40:16 +0000 (04:40 +0000)
committerMarc Zyngier <maz@kernel.org>
Tue, 21 Jan 2025 08:32:53 +0000 (08:32 +0000)
To determine CPU features during initialization, the nVHE hypervisor
utilizes sanitized values of the host's CPU features registers. These
values, stored in u64 idaa64*_el1_sys_val variables are updated by the
kvm_hyp_init_symbols() function at EL1. To ensure EL2 visibility with
the MMU off, the data cache needs to be flushed after these updates.
However, individually flushing each variable using
kvm_flush_dcache_to_poc() is inefficient.

These cpu feature variables would be part of the bss section of
the hypervisor. Hence, flush the entire bss section of hypervisor
once the initialization is complete.

Fixes: 6c30bfb18d0b ("KVM: arm64: Add handlers for protected VM System Registers")
Suggested-by: Fuad Tabba <tabba@google.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@google.com>
Link: https://lore.kernel.org/r/20250121044016.2219256-1-lokeshvutla@google.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/arm.c

index bcc4f7e926349a69902f5f9e241cfc93efa15b68..0725a0b50a3e973ac604f0b426c978ce7b8b9809 100644 (file)
@@ -2400,6 +2400,13 @@ static void kvm_hyp_init_symbols(void)
        kvm_nvhe_sym(id_aa64smfr0_el1_sys_val) = read_sanitised_ftr_reg(SYS_ID_AA64SMFR0_EL1);
        kvm_nvhe_sym(__icache_flags) = __icache_flags;
        kvm_nvhe_sym(kvm_arm_vmid_bits) = kvm_arm_vmid_bits;
+
+       /*
+        * Flush entire BSS since part of its data containing init symbols is read
+        * while the MMU is off.
+        */
+       kvm_flush_dcache_to_poc(kvm_ksym_ref(__hyp_bss_start),
+                               kvm_ksym_ref(__hyp_bss_end) - kvm_ksym_ref(__hyp_bss_start));
 }
 
 static int __init kvm_hyp_init_protection(u32 hyp_va_bits)