The cpu_enable callback for VHE feature requires all alternatives to have
been applied. This prevents applying VHE alternative separately from the
rest.

Use an alternative depending on VHE feature to know whether VHE
alternatives have already been applied.

Signed-off-by: Julien Thierry <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Suzuki K Poulose <[email protected]>
Cc: Marc Zyngier <[email protected]>
Cc: Christoffer Dall <[email protected]>
---
 arch/arm64/kernel/cpufeature.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index a177104..a3a5585d 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -1013,6 +1013,8 @@ static bool runs_at_el2(const struct 
arm64_cpu_capabilities *entry, int __unused
 
 static void cpu_copy_el2regs(const struct arm64_cpu_capabilities *__unused)
 {
+       u64 tmp = 0;
+
        /*
         * Copy register values that aren't redirected by hardware.
         *
@@ -1021,8 +1023,15 @@ static void cpu_copy_el2regs(const struct 
arm64_cpu_capabilities *__unused)
         * that, freshly-onlined CPUs will set tpidr_el2, so we don't need to
         * do anything here.
         */
-       if (!alternatives_applied)
-               write_sysreg(read_sysreg(tpidr_el1), tpidr_el2);
+       asm volatile(ALTERNATIVE(
+               "mrs    %0, tpidr_el1\n"
+               "msr    tpidr_el2, %0",
+               "nop\n"
+               "nop",
+               ARM64_HAS_VIRT_HOST_EXTN)
+               : "+r" (tmp)
+               :
+               : "memory");
 }
 #endif
 
-- 
1.9.1

Reply via email to