[XTENSA] Add missing a2 register restore in register spill routine
authorChris Zankel <chris@zankel.net>
Wed, 14 Nov 2007 21:47:02 +0000 (13:47 -0800)
committerChris Zankel <chris@zankel.net>
Thu, 14 Feb 2008 01:21:27 +0000 (17:21 -0800)
Register a2 is saved in depc but wasn't getting restored before
returning from _spill_registers when there weren't any registers
to spill. The mask to cut the top bit from the rotated WINDOWMASK
register was also one bit short.

Signed-off-by: CHris Zankel <chris@zankel.net>
arch/xtensa/kernel/entry.S

index 91a689e..401b33b 100644 (file)
@@ -1344,7 +1344,7 @@ ENTRY(_spill_registers)
 
        /* We are done if there are no more than the current register frame. */
 
-       extui   a3, a3, 1, WSBITS-2     # a3 = 0yyxxxwww
+       extui   a3, a3, 1, WSBITS-1     # a3 = 0yyxxxwww
        movi    a2, (1 << (WSBITS-1))
        _beqz   a3, .Lnospill           # only one active frame? jump
 
@@ -1394,6 +1394,10 @@ ENTRY(_spill_registers)
        l32e    a4, a1, -16
        j       .Lc12c
 
+.Lnospill:
+       rsr     a2, DEPC        # restore a2 and 'return'
+       jx      a0
+
 .Lloop: _bbsi.l        a3, 1, .Lc4
        _bbci.l a3, 2, .Lc12
 
@@ -1419,8 +1423,6 @@ ENTRY(_spill_registers)
        movi    a3, 1
        sll     a3, a3
        wsr     a3, WINDOWSTART
-
-.Lnospill:
        jx      a0
 
 .Lc4:  s32e    a4, a9, -16