diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2016-03-17 09:12:19 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-03-24 07:41:01 +0100 |
commit | 33de2037f6007f6adf90514dbc98158a473476fc (patch) | |
tree | 36caee6704bfa5c22bfa60606d316b46a63da803 /c/src/lib/libcpu/sparc | |
parent | Filesystem: Export most generic path eval function (diff) | |
download | rtems-33de2037f6007f6adf90514dbc98158a473476fc.tar.bz2 |
sparc: Fix window underflow trap handler
The window underflow trap handler used %i5 which destroyed the %o5 of
the calling context. Bug introduced by
0d3b5d47429effb350448d9e9123a67db722109f.
Go back to the pre 0d3b5d47429effb350448d9e9123a67db722109f behaviour
and use the two unused instructions in the trap vector to optimize a
bit.
Close #2651.
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libcpu/sparc/reg_win/window.S | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/c/src/lib/libcpu/sparc/reg_win/window.S b/c/src/lib/libcpu/sparc/reg_win/window.S index 06a7056c03..f57fbe18a8 100644 --- a/c/src/lib/libcpu/sparc/reg_win/window.S +++ b/c/src/lib/libcpu/sparc/reg_win/window.S @@ -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 |