aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlistair Popple <alistair@popple.id.au>2014-02-24 02:00:56 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2014-04-30 18:26:34 -0400
commitd5b35cffe3d3c2bc297b7c1fb997a6139de02e12 (patch)
tree8d84d161bc69c92887099ca300f418e329eaf66d
parente2c37d908336dc27c8b405f063c2a163124947fa (diff)
ppc476: Enable a linker work around for IBM errata #46
This patch adds an option to enable a work around for an icache bug on 476 that can cause execution of stale instructions when falling through pages (IBM errata #46). It requires a recent version of binutils which supports the --ppc476-workaround option. The work around enables the appropriate linker options and ensures that all module output sections are aligned to 4K page boundaries. The work around is only required when building modules. Signed-off-by: Alistair Popple <alistair@popple.id.au> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/Makefile5
-rw-r--r--arch/powerpc/platforms/44x/Kconfig14
-rw-r--r--arch/powerpc/platforms/44x/ppc476_modules.lds15
3 files changed, 34 insertions, 0 deletions
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 4c0cedf4e2c7..31b96942c0a7 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -159,6 +159,11 @@ CHECKFLAGS += -m$(CONFIG_WORD_SIZE) -D__powerpc__ -D__powerpc$(CONFIG_WORD_SIZE)
159 159
160KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o 160KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
161 161
162ifeq ($(CONFIG_476FPE_ERR46),y)
163 KBUILD_LDFLAGS_MODULE += --ppc476-workaround \
164 -T $(srctree)/arch/powerpc/platforms/44x/ppc476_modules.lds
165endif
166
162# No AltiVec or VSX instructions when building kernel 167# No AltiVec or VSX instructions when building kernel
163KBUILD_CFLAGS += $(call cc-option,-mno-altivec) 168KBUILD_CFLAGS += $(call cc-option,-mno-altivec)
164KBUILD_CFLAGS += $(call cc-option,-mno-vsx) 169KBUILD_CFLAGS += $(call cc-option,-mno-vsx)
diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig
index 8beec7d00cac..4d88f6a19058 100644
--- a/arch/powerpc/platforms/44x/Kconfig
+++ b/arch/powerpc/platforms/44x/Kconfig
@@ -351,6 +351,20 @@ config APM821xx
351 select IBM_EMAC_EMAC4 351 select IBM_EMAC_EMAC4
352 select IBM_EMAC_TAH 352 select IBM_EMAC_TAH
353 353
354config 476FPE_ERR46
355 depends on 476FPE
356 bool "Enable linker work around for PPC476FPE errata #46"
357 help
358 This option enables a work around for an icache bug on 476
359 that can cause execution of stale instructions when falling
360 through pages (IBM errata #46). It requires a recent version
361 of binutils which supports the --ppc476-workaround option.
362
363 The work around enables the appropriate linker options and
364 ensures that all module output sections are aligned to 4K
365 page boundaries. The work around is only required when
366 building modules.
367
354# 44x errata/workaround config symbols, selected by the CPU models above 368# 44x errata/workaround config symbols, selected by the CPU models above
355config IBM440EP_ERR42 369config IBM440EP_ERR42
356 bool 370 bool
diff --git a/arch/powerpc/platforms/44x/ppc476_modules.lds b/arch/powerpc/platforms/44x/ppc476_modules.lds
new file mode 100644
index 000000000000..9fec5d34ba8e
--- /dev/null
+++ b/arch/powerpc/platforms/44x/ppc476_modules.lds
@@ -0,0 +1,15 @@
1SECTIONS
2{
3 .text : ALIGN(4096)
4 {
5 *(.text .text.* .fixup)
6 }
7 .init.text : ALIGN(4096)
8 {
9 *(.init.text .init.text.*)
10 }
11 .exit.text : ALIGN(4096)
12 {
13 *(.exit.text .exit.text.*)
14 }
15}