From: Mans Rullgard 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/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h index cccb389..c9d2976 100644 --- a/arch/arm/include/asm/vfpmacros.h +++ b/arch/arm/include/asm/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