diff options
author | Maciej W. Rozycki <macro@linux-mips.org> | 2007-10-23 07:43:11 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2008-01-29 05:14:54 -0500 |
commit | 20d60d9973c3b441902b0a3f4f6f7e7ade08f77d (patch) | |
tree | 2dbadcb5600fcb486612ec30d972e6c29195ee1d /arch/mips/Makefile | |
parent | 2b22c034d04d3632a339d14d5803c8f94e412608 (diff) |
[MIPS] R4000/R4400 errata workarounds
This is the gereric part of R4000/R4400 errata workarounds. They include
compiler and assembler support as well as some source code modifications
to address the problems with some combinations of multiply/divide+shift
instructions as well as the daddi and daddiu instructions.
Changes included are as follows:
1. New Kconfig options to select workarounds by platforms as necessary.
2. Arch top-level Makefile to pass necessary options to the compiler; also
incompatible configurations are detected (-mno-sym32 unsupported as
horribly intrusive for little gain).
3. Bug detection updated and shuffled -- the multiply/divide+shift problem
is lethal enough that if not worked around it makes the kernel crash in
time_init() because of a division by zero; the daddiu erratum might
also trigger early potentially, though I have not observed it. On the
other hand the daddi detection code requires the exception subsystem to
have been initialised (and is there mainly for information).
4. r4k_daddiu_bug() added so that the existence of the erratum can be
queried by code at the run time as necessary; useful for generated code
like TLB fault and copy/clear page handlers.
5. __udelay() updated as it uses multiplication in inline assembly.
Note that -mdaddi requires modified toolchain (which has been maintained
by myself and available from my site for ~4years now -- versions covered
are GCC 2.95.4 - 4.1.2 and binutils from 2.13 onwards). The -mfix-r4000
and -mfix-r4400 have been standard for a while though.
Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/Makefile')
-rw-r--r-- | arch/mips/Makefile | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index a1f8d8b96b03..a49127af33c8 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -141,6 +141,10 @@ cflags-$(CONFIG_CPU_R8000) += -march=r8000 -Wa,--trap | |||
141 | cflags-$(CONFIG_CPU_R10000) += $(call cc-option,-march=r10000,-march=r8000) \ | 141 | cflags-$(CONFIG_CPU_R10000) += $(call cc-option,-march=r10000,-march=r8000) \ |
142 | -Wa,--trap | 142 | -Wa,--trap |
143 | 143 | ||
144 | cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,) | ||
145 | cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,) | ||
146 | cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,) | ||
147 | |||
144 | ifdef CONFIG_CPU_SB1 | 148 | ifdef CONFIG_CPU_SB1 |
145 | ifdef CONFIG_SB1_PASS_1_WORKAROUNDS | 149 | ifdef CONFIG_SB1_PASS_1_WORKAROUNDS |
146 | MODFLAGS += -msb1-pass1-workarounds | 150 | MODFLAGS += -msb1-pass1-workarounds |
@@ -602,9 +606,11 @@ ifdef CONFIG_64BIT | |||
602 | endif | 606 | endif |
603 | endif | 607 | endif |
604 | 608 | ||
605 | ifeq ($(KBUILD_SYM32), y) | 609 | ifeq ($(KBUILD_SYM32)$(call cc-option-yn,-msym32), yy) |
606 | ifeq ($(call cc-option-yn,-msym32), y) | 610 | cflags-y += -msym32 -DKBUILD_64BIT_SYM32 |
607 | cflags-y += -msym32 -DKBUILD_64BIT_SYM32 | 611 | else |
612 | ifeq ($(CONFIG_CPU_DADDI_WORKAROUNDS), y) | ||
613 | $(error CONFIG_CPU_DADDI_WORKAROUNDS unsupported without -msym32) | ||
608 | endif | 614 | endif |
609 | endif | 615 | endif |
610 | endif | 616 | endif |