76 lines
2.5 KiB
Diff
76 lines
2.5 KiB
Diff
From: Mans Rullgard <mans@mansr.com>
|
|
Date: Wed, 30 Jul 2008 08:25:51 +0000 (+0100)
|
|
Subject: ARM: NEON L1 cache bug workaround (erratum 451034)
|
|
X-Git-Url: http://git.mansr.com/?p=linux-omap;a=commitdiff_plain;h=26023493baf13e0a67fd6cf08d87be5ff6f7c56d
|
|
|
|
ARM: NEON L1 cache bug workaround (erratum 451034)
|
|
|
|
On Cortex-A8 r1p0 and r1p1, executing a NEON store with an integer
|
|
store in the store buffer, can cause a processor deadlock under
|
|
certain conditions.
|
|
|
|
Executing a DMB instruction before saving NEON/VFP registers and before
|
|
return to userspace makes it safe to run code which includes similar
|
|
counter-measures. Userspace code can still trigger the deadlock, so
|
|
a different workaround is required to safely run untrusted code.
|
|
|
|
See ARM Cortex-A8 Errata Notice (PR120-PRDC-008070) for full details.
|
|
---
|
|
|
|
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
|
|
index 8c75840..1172e14 100644
|
|
--- a/arch/arm/Kconfig
|
|
+++ b/arch/arm/Kconfig
|
|
@@ -1071,6 +1071,22 @@ config NEON
|
|
Say Y to include support code for NEON, the ARMv7 Advanced SIMD
|
|
Extension.
|
|
|
|
+config NEON_CACHE_BUG
|
|
+ bool "NEON L1 cache bug workaround (erratum 451034)"
|
|
+ depends on VFPv3
|
|
+ help
|
|
+ On Cortex-A8 r1p0 and r1p1, executing a NEON store with an integer
|
|
+ store in the store buffer, can cause a processor deadlock under
|
|
+ certain conditions.
|
|
+
|
|
+ See ARM Cortex-A8 Errata Notice (PR120-PRDC-008070) for full details.
|
|
+
|
|
+ Say Y to include a workaround.
|
|
+
|
|
+ WARNING: Even with this option enabled, userspace code can trigger
|
|
+ the deadlock. To safely run untrusted code, a different fix is
|
|
+ required.
|
|
+
|
|
endmenu
|
|
|
|
menu "Userspace binary formats"
|
|
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
|
|
index 597ed00..e50094e 100644
|
|
--- a/arch/arm/kernel/entry-common.S
|
|
+++ b/arch/arm/kernel/entry-common.S
|
|
@@ -68,6 +68,10 @@ no_work_pending:
|
|
/* perform architecture specific actions before user return */
|
|
arch_ret_to_user r1, lr
|
|
|
|
+#ifdef CONFIG_NEON_CACHE_BUG
|
|
+ dmb
|
|
+#endif
|
|
+
|
|
@ slow_restore_user_regs
|
|
ldr r1, [sp, #S_PSR] @ get calling cpsr
|
|
ldr lr, [sp, #S_PC]! @ get pc
|
|
diff --git a/include/asm-arm/vfpmacros.h b/include/asm-arm/vfpmacros.h
|
|
index cccb389..c9d2976 100644
|
|
--- a/include/asm-arm/vfpmacros.h
|
|
+++ b/include/asm-arm/vfpmacros.h
|
|
@@ -32,6 +32,9 @@
|
|
|
|
@ write all the working registers out of the VFP
|
|
.macro VFPFSTMIA, base, tmp
|
|
+#ifdef CONFIG_NEON_CACHE_BUG
|
|
+ dmb
|
|
+#endif
|
|
#if __LINUX_ARM_ARCH__ < 6
|
|
STC p11, cr0, [\base],#33*4 @ FSTMIAX \base!, {d0-d15}
|
|
#else
|