summaryrefslogtreecommitdiff
path: root/arch/blackfin
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2012-07-31 05:38:56 -0400
committerSonic Zhang <sonic.zhang@analog.com>2013-05-13 15:47:24 +0800
commit2e2ed3f4ff5f21a5c39394c55d361e826238ce2d (patch)
tree558ea823e0acbeb2005fbd996f5df582c8e36a7b /arch/blackfin
parente0ae433e9283728ce3f25e0d3794291c11e48f5e (diff)
downloadu-boot-imx-2e2ed3f4ff5f21a5c39394c55d361e826238ce2d.zip
u-boot-imx-2e2ed3f4ff5f21a5c39394c55d361e826238ce2d.tar.gz
u-boot-imx-2e2ed3f4ff5f21a5c39394c55d361e826238ce2d.tar.bz2
Blackfin: adjust asm constraints with NMI workaround
Newer gcc versions will sometimes use a Preg when "r" constraints, but that'll fail if we use an Ireg in the assignment. So force the code to always use a Dreg. This also fixes early boot crashes for older Blackfin parts when compiled with gcc-4.5. This version ends up selecting the same register for the input and output variables which corrupts the output assignment triggering an exception. P2 = 0xffe02008; /* EVT2 */ R0 = RETS; CALL 1f; RTN; 1: P2 = RETS; <-- BAD RETS = R0; [P2] = P2; <-- BAD Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Diffstat (limited to 'arch/blackfin')
-rw-r--r--arch/blackfin/cpu/initcode.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/blackfin/cpu/initcode.c b/arch/blackfin/cpu/initcode.c
index 1a06680..e8ea0ba 100644
--- a/arch/blackfin/cpu/initcode.c
+++ b/arch/blackfin/cpu/initcode.c
@@ -262,7 +262,8 @@ program_nmi_handler(void)
"%1 = RETS;" /* Load addr of NMI handler */
"RETS = %0;" /* Restore RETS */
"[%2] = %1;" /* Write NMI handler */
- : "=r"(tmp1), "=r"(tmp2) : "ab"(EVT2)
+ : "=d"(tmp1), "=d"(tmp2)
+ : "ab"(EVT2)
);
}