diff options
author | David S. Miller <davem@davemloft.net> | 2012-05-10 11:00:46 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-05-10 11:00:46 -0700 |
commit | a5a737e090e25981e99d69f01400e3a80356581c (patch) | |
tree | 800716c007575b1c316299300e3316d0d94ed243 | |
parent | bc46f9375a286d05f84a9464efc2b7f1f5614ff4 (diff) | |
download | talos-op-linux-a5a737e090e25981e99d69f01400e3a80356581c.tar.gz talos-op-linux-a5a737e090e25981e99d69f01400e3a80356581c.zip |
sparc64: Do not clobber %g2 in xcall_fetch_glob_regs().
%g2 is meant to hold the CPUID number throughout this routine, since
at the very beginning, and at the very end, we use %g2 to calculate
indexes into per-cpu arrays.
However we erroneously clobber it in order to hold the %cwp register
value mid-stream.
Fix this code to use %g3 for the %cwp read and related calulcations
instead.
Reported-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc/kernel/central.c | 2 | ||||
-rw-r--r-- | arch/sparc/mm/ultra.S | 6 |
2 files changed, 4 insertions, 4 deletions
diff --git a/arch/sparc/kernel/central.c b/arch/sparc/kernel/central.c index 38d48a59879c..9708851a8b9f 100644 --- a/arch/sparc/kernel/central.c +++ b/arch/sparc/kernel/central.c @@ -269,4 +269,4 @@ static int __init sunfire_init(void) return 0; } -subsys_initcall(sunfire_init); +fs_initcall(sunfire_init); diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S index b57a5942ba64..874162a11ceb 100644 --- a/arch/sparc/mm/ultra.S +++ b/arch/sparc/mm/ultra.S @@ -495,11 +495,11 @@ xcall_fetch_glob_regs: stx %o7, [%g1 + GR_SNAP_O7] stx %i7, [%g1 + GR_SNAP_I7] /* Don't try this at home kids... */ - rdpr %cwp, %g2 - sub %g2, 1, %g7 + rdpr %cwp, %g3 + sub %g3, 1, %g7 wrpr %g7, %cwp mov %i7, %g7 - wrpr %g2, %cwp + wrpr %g3, %cwp stx %g7, [%g1 + GR_SNAP_RPC] sethi %hi(trap_block), %g7 or %g7, %lo(trap_block), %g7 |