forked from Minki/linux
xtensa: save current register frame in fast_syscall_spill_registers_fixup
We need it saved because it contains a3 where we track which register windows we still need to spill, and fixup handler may call C exception handlers. Also fix comments. Cc: stable@vger.kernel.org Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
e2fd1374c7
commit
3251f1e27a
@ -1117,6 +1117,13 @@ ENDPROC(fast_syscall_spill_registers)
|
|||||||
* We basically restore WINDOWBASE and WINDOWSTART to the condition when
|
* We basically restore WINDOWBASE and WINDOWSTART to the condition when
|
||||||
* we entered the spill routine and jump to the user exception handler.
|
* we entered the spill routine and jump to the user exception handler.
|
||||||
*
|
*
|
||||||
|
* Note that we only need to restore the bits in windowstart that have not
|
||||||
|
* been spilled yet by the _spill_register routine. Luckily, a3 contains a
|
||||||
|
* rotated windowstart with only those bits set for frames that haven't been
|
||||||
|
* spilled yet. Because a3 is rotated such that bit 0 represents the register
|
||||||
|
* frame for the current windowbase - 1, we need to rotate a3 left by the
|
||||||
|
* value of the current windowbase + 1 and move it to windowstart.
|
||||||
|
*
|
||||||
* a0: value of depc, original value in depc
|
* a0: value of depc, original value in depc
|
||||||
* a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE
|
* a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE
|
||||||
* a3: exctable, original value in excsave1
|
* a3: exctable, original value in excsave1
|
||||||
@ -1131,10 +1138,15 @@ ENTRY(fast_syscall_spill_registers_fixup)
|
|||||||
/* We need to make sure the current registers (a0-a3) are preserved.
|
/* We need to make sure the current registers (a0-a3) are preserved.
|
||||||
* To do this, we simply set the bit for the current window frame
|
* To do this, we simply set the bit for the current window frame
|
||||||
* in WS, so that the exception handlers save them to the task stack.
|
* in WS, so that the exception handlers save them to the task stack.
|
||||||
|
*
|
||||||
|
* Note: we use a3 to set the windowbase, so we take a special care
|
||||||
|
* of it, saving it in the original _spill_registers frame across
|
||||||
|
* the exception handler call.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
xsr a3, excsave1 # get spill-mask
|
xsr a3, excsave1 # get spill-mask
|
||||||
slli a3, a3, 1 # shift left by one
|
slli a3, a3, 1 # shift left by one
|
||||||
|
addi a3, a3, 1 # set the bit for the current window frame
|
||||||
|
|
||||||
slli a2, a3, 32-WSBITS
|
slli a2, a3, 32-WSBITS
|
||||||
src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy......
|
src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy......
|
||||||
|
Loading…
Reference in New Issue
Block a user