forked from Imagelibrary/rtems
sparc: Fix window underflow trap handler
The window underflow trap handler used %i5 which destroyed the %o5 of the calling context. Bug introduced by0d3b5d4742. Go back to the pre0d3b5d4742behaviour and use the two unused instructions in the trap vector to optimize a bit. Close #2651.
This commit is contained in:
committed by
Sebastian Huber
parent
d85db176e7
commit
33de2037f6
@@ -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...
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user