arm64: Rework alternate sequence for ARM erratum 845719
authorMarc Zyngier <marc.zyngier@arm.com>
Wed, 3 Jun 2015 13:36:23 +0000 (14:36 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 5 Jun 2015 09:38:52 +0000 (10:38 +0100)
The workaround for erratum 845719 is currently using
a branch between two alternate sequences, which is
quite fragile, and that we are going to break as we
rework the alternative code.

This patch reworks the workaround to fit in a single
alternative sequence. The generated code itself is
unchanged.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/entry.S

index 959fe8733560971e4a8d9d222f943dac192c6057..9fe1a85c2027ee739c9e9e5b2a4c84bacdd7131a 100644 (file)
        msr     sp_el0, x23
 
 #ifdef CONFIG_ARM64_ERRATUM_845719
-       alternative_insn                                                \
-       "nop",                                                          \
-       "tbz x22, #4, 1f",                                              \
-       ARM64_WORKAROUND_845719
+
+#undef SEQUENCE_ORG
+#undef SEQUENCE_ALT
+
 #ifdef CONFIG_PID_IN_CONTEXTIDR
-       alternative_insn                                                \
-       "nop; nop",                                                     \
-       "mrs x29, contextidr_el1; msr contextidr_el1, x29; 1:",         \
-       ARM64_WORKAROUND_845719
+
+#define SEQUENCE_ORG   "nop ; nop ; nop"
+#define SEQUENCE_ALT   "tbz x22, #4, 1f ; mrs x29, contextidr_el1; msr contextidr_el1, x29; 1:"
+
 #else
-       alternative_insn                                                \
-       "nop",                                                          \
-       "msr contextidr_el1, xzr; 1:",                                  \
-       ARM64_WORKAROUND_845719
+
+#define SEQUENCE_ORG   "nop ; nop"
+#define SEQUENCE_ALT   "tbz x22, #4, 1f ; msr contextidr_el1, xzr; 1:"
+
 #endif
+
+       alternative_insn SEQUENCE_ORG, SEQUENCE_ALT, ARM64_WORKAROUND_845719
+
 #endif
        .endif
        msr     elr_el1, x21                    // set up the return data