diff options
author | Mike Frysinger <vapier@gentoo.org> | 2012-07-31 05:38:56 -0400 |
---|---|---|
committer | Sonic Zhang <sonic.zhang@analog.com> | 2013-05-13 15:47:24 +0800 |
commit | 2e2ed3f4ff5f21a5c39394c55d361e826238ce2d (patch) | |
tree | 558ea823e0acbeb2005fbd996f5df582c8e36a7b /arch/blackfin | |
parent | e0ae433e9283728ce3f25e0d3794291c11e48f5e (diff) | |
download | u-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.c | 3 |
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) ); } |