sparc: Fix window underflow trap handler

The window underflow trap handler used %i5 which destroyed the %o5 of
the calling context.  Bug introduced by
0d3b5d4742.

Go back to the pre 0d3b5d4742 behaviour
and use the two unused instructions in the trap vector to optimize a
bit.

Close #2651.
This commit is contained in:
Daniel Hellstrom
2016-03-17 09:12:19 +01:00
committed by Sebastian Huber
parent d85db176e7
commit 33de2037f6
2 changed files with 7 additions and 7 deletions

View File

@@ -66,7 +66,7 @@
mov %wim, %l3 ; \
sethi %hi(_handler), %l4 ; \
jmp %l4+%lo(_handler); \
mov %g0, %wim ! WIM = 0, so that we can restore regardless of WIM
sll %l3, 1, %l4 ! l4 = WIM << 1
/*
* Software trap. Treat as BAD_TRAP for the time being...

View File

@@ -76,7 +76,8 @@ SYM(window_overflow_trap_handler):
*
* l1 = pc
* l2 = npc
* l3 = wim (from trap table)
* l3 = wim (from trap vector)
* l4 = wim << 1 (from trap vector)
*/
PUBLIC(window_underflow_trap_handler)
@@ -96,15 +97,14 @@ SYM(window_underflow_trap_handler):
* register will result in the local register set changing.
*/
! In WIM 3 write instruction delay. since WIM<=0 from trap entry
sll %l3, 1, %l4 ! l4 = WIM << 1
srl %l3, SPARC_NUMBER_OF_REGISTER_WINDOWS-1, %l5
or %l5, %l4, %i5 ! %i5= (WIM << 1) |
or %l5, %l4, %l5 ! l5 = (WIM << 1) |
! (WIM >> (Number Windows-1))
mov %l5, %wim ! load the new WIM
nop; nop; nop ! 3 slot delay
restore ! Two restores to get into the
restore %o5, %g0, %l7 ! window to restore. Carry along new WIM
restore ! window to restore
ldd [%sp + 0x00], %l0 ! First the local register set
mov %l7, %wim ! load the new WIM
ldd [%sp + 0x08], %l2
ldd [%sp + 0x10], %l4
ldd [%sp + 0x18], %l6