openrisc: use scratch regs in atomic syscall
authorJonas Bonn <jonas@southpole.se>
Wed, 18 Apr 2012 10:23:39 +0000 (12:23 +0200)
committerJonas Bonn <jonas@southpole.se>
Tue, 8 May 2012 09:43:59 +0000 (11:43 +0200)
The function sys_or1k_atomic was using call-saved registers without
restoring their value before returning.  This is a faux pas: either
we need to restore their values or use scratch regs; the latter is
less code so that's the route this patch takes.

Thanks to David Hennerström for doing most of the heavy-lifting in
tracking this one down.

Reported-by: Davd Hennerström <david.hennerstrom@aacmicrotec.com>
Signed-off-by: Jonas Bonn <jonas@southpole.se>
arch/openrisc/kernel/entry.S

index 6e61af8..ddfcaa8 100644 (file)
@@ -1117,10 +1117,10 @@ ENTRY(sys_rt_sigreturn)
 ENTRY(sys_or1k_atomic)
        /* FIXME: This ignores r3 and always does an XCHG */
        DISABLE_INTERRUPTS(r17,r19)
-       l.lwz   r30,0(r4)
-       l.lwz   r28,0(r5)
-       l.sw    0(r4),r28
-       l.sw    0(r5),r30
+       l.lwz   r29,0(r4)
+       l.lwz   r27,0(r5)
+       l.sw    0(r4),r27
+       l.sw    0(r5),r29
        ENABLE_INTERRUPTS(r17)
        l.jr    r9
         l.or   r11,r0,r0