]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: arm64: pkvm: Don't reprobe for ICH_VTR_EL2.TDS on CPU hotplug
authorMarc Zyngier <maz@kernel.org>
Tue, 10 Mar 2026 08:54:33 +0000 (08:54 +0000)
committerMarc Zyngier <maz@kernel.org>
Tue, 10 Mar 2026 09:48:45 +0000 (09:48 +0000)
Hotplugging a CPU off and back on fails with pKVM, as we try to
probe for ICH_VTR_EL2.TDS. In a non-VHE setup, this is achieved
by using an EL2 stub helper. However, the stubs are out of reach
once pKVM has deprivileged the kernel. The CPU never boots.

Since pKVM doesn't allow late onlining of CPUs, we can detect
that protected mode is enforced early on, and return the current
state of the capability.

Fixes: 2a28810cbb8b2 ("KVM: arm64: GICv3: Detect and work around the lack of ICV_DIR_EL1 trapping")
Reported-by: Vincent Donnefort <vdonnefort@google.com>
Tested-by: Vincent Donnefort <vdonnefort@google.com>
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://patch.msgid.link/20260310085433.3936742-1-maz@kernel.org
Cc: stable@vger.kernel.org
arch/arm64/kernel/cpufeature.c

index c31f8e17732a39138703c5e861ca23647ce63679..32c2dbcc0c64165d5e81151d36807d5edee52758 100644 (file)
@@ -2345,6 +2345,15 @@ static bool can_trap_icv_dir_el1(const struct arm64_cpu_capabilities *entry,
            !is_midr_in_range_list(has_vgic_v3))
                return false;
 
+       /*
+        * pKVM prevents late onlining of CPUs. This means that whatever
+        * state the capability is in after deprivilege cannot be affected
+        * by a new CPU booting -- this is garanteed to be a CPU we have
+        * already seen, and the cap is therefore unchanged.
+        */
+       if (system_capabilities_finalized() && is_protected_kvm_enabled())
+               return cpus_have_final_cap(ARM64_HAS_ICH_HCR_EL2_TDIR);
+
        if (is_kernel_in_hyp_mode())
                res.a1 = read_sysreg_s(SYS_ICH_VTR_EL2);
        else