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 ; \
|
mov %wim, %l3 ; \
|
||||||
sethi %hi(_handler), %l4 ; \
|
sethi %hi(_handler), %l4 ; \
|
||||||
jmp %l4+%lo(_handler); \
|
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...
|
* Software trap. Treat as BAD_TRAP for the time being...
|
||||||
|
|||||||
@@ -76,7 +76,8 @@ SYM(window_overflow_trap_handler):
|
|||||||
*
|
*
|
||||||
* l1 = pc
|
* l1 = pc
|
||||||
* l2 = npc
|
* l2 = npc
|
||||||
* l3 = wim (from trap table)
|
* l3 = wim (from trap vector)
|
||||||
|
* l4 = wim << 1 (from trap vector)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
PUBLIC(window_underflow_trap_handler)
|
PUBLIC(window_underflow_trap_handler)
|
||||||
@@ -96,15 +97,14 @@ SYM(window_underflow_trap_handler):
|
|||||||
* register will result in the local register set changing.
|
* 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
|
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))
|
! (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 ! 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
|
ldd [%sp + 0x00], %l0 ! First the local register set
|
||||||
mov %l7, %wim ! load the new WIM
|
|
||||||
ldd [%sp + 0x08], %l2
|
ldd [%sp + 0x08], %l2
|
||||||
ldd [%sp + 0x10], %l4
|
ldd [%sp + 0x10], %l4
|
||||||
ldd [%sp + 0x18], %l6
|
ldd [%sp + 0x18], %l6
|
||||||
|
|||||||
Reference in New Issue
Block a user