|
@@ -21,8 +21,10 @@
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/linkage.h>
|
|
|
|
|
|
+#include <asm/alternative-asm.h>
|
|
|
#include <asm/assembler.h>
|
|
|
#include <asm/asm-offsets.h>
|
|
|
+#include <asm/cpufeature.h>
|
|
|
#include <asm/errno.h>
|
|
|
#include <asm/esr.h>
|
|
|
#include <asm/thread_info.h>
|
|
@@ -120,6 +122,24 @@
|
|
|
ct_user_enter
|
|
|
ldr x23, [sp, #S_SP] // load return stack pointer
|
|
|
msr sp_el0, x23
|
|
|
+
|
|
|
+#ifdef CONFIG_ARM64_ERRATUM_845719
|
|
|
+ alternative_insn \
|
|
|
+ "nop", \
|
|
|
+ "tbz x22, #4, 1f", \
|
|
|
+ ARM64_WORKAROUND_845719
|
|
|
+#ifdef CONFIG_PID_IN_CONTEXTIDR
|
|
|
+ alternative_insn \
|
|
|
+ "nop; nop", \
|
|
|
+ "mrs x29, contextidr_el1; msr contextidr_el1, x29; 1:", \
|
|
|
+ ARM64_WORKAROUND_845719
|
|
|
+#else
|
|
|
+ alternative_insn \
|
|
|
+ "nop", \
|
|
|
+ "msr contextidr_el1, xzr; 1:", \
|
|
|
+ ARM64_WORKAROUND_845719
|
|
|
+#endif
|
|
|
+#endif
|
|
|
.endif
|
|
|
msr elr_el1, x21 // set up the return data
|
|
|
msr spsr_el1, x22
|