* [PATCHv2 0/2] xtensa fixes for 3.12
@ 2013-10-26 1:03 Max Filippov
2013-10-26 1:03 ` [PATCHv2 1/2] xtensa: fix fast_syscall_spill_registers_fixup Max Filippov
2013-10-26 1:03 ` [PATCHv2 2/2] xtensa: don't use alternate signal stack on threads Max Filippov
0 siblings, 2 replies; 3+ messages in thread
From: Max Filippov @ 2013-10-26 1:03 UTC (permalink / raw)
To: Chris Zankel; +Cc: Marc Gauthier, linux-xtensa, linux-arch, Max Filippov
Hi Chris,
This is the second version of late 3.12 fixes, changes v1->v2:
xtensa: fix fast_syscall_spill_registers_fixup: set windowstart bit for
the current register frame in the fast_syscall_spill_registers_fixup;
expand comments, add FIXME mark.
xtensa: don't use alternate signal stack on threads: no changes.
I can post the third version if using a1 instead of a2 in the
_spill_registers .Lc12 is fine.
You can pull these changes from my git tree,
the following changes since commit 61e6cfa80de5760bbe406f4e815b7739205754d2:
Linux 3.12-rc5 (2013-10-13 15:41:28 -0700)
are available in the git repository at:
git://github.com/jcmvbkbc/linux-xtensa.git xtensa-fixes-for-upstream
for you to fetch changes up to cbcc64e11437f701121e71ca55ff0eb9815af530:
xtensa: don't use alternate signal stack on threads (2013-10-26 04:39:13 +0400)
----------------------------------------------------------------
Baruch Siach (1):
xtensa: don't use alternate signal stack on threads
Max Filippov (1):
xtensa: fix fast_syscall_spill_registers_fixup
arch/xtensa/kernel/entry.S | 64 +++++++++++++++++++++++++++++++--------------
arch/xtensa/kernel/signal.c | 2 +-
2 files changed, 46 insertions(+), 20 deletions(-)
--
1.8.1.4
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCHv2 1/2] xtensa: fix fast_syscall_spill_registers_fixup
2013-10-26 1:03 [PATCHv2 0/2] xtensa fixes for 3.12 Max Filippov
@ 2013-10-26 1:03 ` Max Filippov
2013-10-26 1:03 ` [PATCHv2 2/2] xtensa: don't use alternate signal stack on threads Max Filippov
1 sibling, 0 replies; 3+ messages in thread
From: Max Filippov @ 2013-10-26 1:03 UTC (permalink / raw)
To: Chris Zankel; +Cc: Marc Gauthier, linux-xtensa, linux-arch, Max Filippov
fast_syscall_spill_registers_fixup was not correctly updated by the
'keep a3 and excsave1 on entry to exception handlers' patch: it doesn't
preserve a3 that it gets on entry, breaking _spill_registers in case of
page fault on stack during register spilling, leading to unhandled
exception in kernel mode.
Preserve a3 by saving it in the original _spill_registers stack frame's
a3 during exception handling and restoring it afterwards.
Also fix comments and function bounds annotations.
Reported-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Tested-by: Baruch Siach <baruch@tkos.co.il>
---
arch/xtensa/kernel/entry.S | 64 ++++++++++++++++++++++++++++++++--------------
1 file changed, 45 insertions(+), 19 deletions(-)
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S
index de1dfa1..baf45de 100644
--- a/arch/xtensa/kernel/entry.S
+++ b/arch/xtensa/kernel/entry.S
@@ -1064,6 +1064,9 @@ ENDPROC(fast_syscall_xtensa)
* excsave_1: dispatch table
*
* Note: We assume the stack pointer is EXC_TABLE_KSTK in the fixup handler.
+ * FIXME: this may be wrong in case we enter _spill_registers with 4 live
+ * registers, followed by a 12-register live window: .Lc12 in the
+ * _spill_registers would use a2 then.
*/
ENTRY(fast_syscall_spill_registers)
@@ -1117,12 +1120,19 @@ ENDPROC(fast_syscall_spill_registers)
* We basically restore WINDOWBASE and WINDOWSTART to the condition when
* 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
* a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE
* a3: exctable, original value in excsave1
*/
-fast_syscall_spill_registers_fixup:
+ENTRY(fast_syscall_spill_registers_fixup)
rsr a2, windowbase # get current windowbase (a2 is saved)
xsr a0, depc # restore depc and a0
@@ -1131,25 +1141,34 @@ fast_syscall_spill_registers_fixup:
/* 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
* 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
- slli a2, 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 a3, a2, 32-WSBITS
- src a2, a2, a3 # a1 = xxwww1yyxxxwww1yy......
+ slli a2, a3, 32-WSBITS
+ src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy......
wsr a2, windowstart # set corrected windowstart
- rsr a3, excsave1
- l32i a2, a3, EXC_TABLE_DOUBLE_SAVE # restore a2
- l32i a3, a3, EXC_TABLE_PARAM # original WB (in user task)
+ srli a3, a3, 1
+ rsr a2, excsave1
+ l32i a2, a2, EXC_TABLE_DOUBLE_SAVE # restore a2
+ xsr a2, excsave1
+ s32i a3, a2, EXC_TABLE_DOUBLE_SAVE # save a3
+ l32i a3, a2, EXC_TABLE_PARAM # original WB (in user task)
+ xsr a2, excsave1
/* Return to the original (user task) WINDOWBASE.
* We leave the following frame behind:
* a0, a1, a2 same
- * a3: trashed (saved in excsave_1)
+ * a3: trashed (saved in EXC_TABLE_DOUBLE_SAVE)
* depc: depc (we have to return to that address)
- * excsave_1: a3
+ * excsave_1: exctable
*/
wsr a3, windowbase
@@ -1159,9 +1178,9 @@ fast_syscall_spill_registers_fixup:
* a0: return address
* a1: used, stack pointer
* a2: kernel stack pointer
- * a3: available, saved in EXCSAVE_1
+ * a3: available
* depc: exception address
- * excsave: a3
+ * excsave: exctable
* Note: This frame might be the same as above.
*/
@@ -1181,9 +1200,12 @@ fast_syscall_spill_registers_fixup:
rsr a0, exccause
addx4 a0, a0, a3 # find entry in table
l32i a0, a0, EXC_TABLE_FAST_USER # load handler
+ l32i a3, a3, EXC_TABLE_DOUBLE_SAVE
jx a0
-fast_syscall_spill_registers_fixup_return:
+ENDPROC(fast_syscall_spill_registers_fixup)
+
+ENTRY(fast_syscall_spill_registers_fixup_return)
/* When we return here, all registers have been restored (a2: DEPC) */
@@ -1191,13 +1213,13 @@ fast_syscall_spill_registers_fixup_return:
/* Restore fixup handler. */
- xsr a3, excsave1
- movi a2, fast_syscall_spill_registers_fixup
- s32i a2, a3, EXC_TABLE_FIXUP
- s32i a0, a3, EXC_TABLE_DOUBLE_SAVE
- rsr a2, windowbase
- s32i a2, a3, EXC_TABLE_PARAM
- l32i a2, a3, EXC_TABLE_KSTK
+ rsr a2, excsave1
+ s32i a3, a2, EXC_TABLE_DOUBLE_SAVE
+ movi a3, fast_syscall_spill_registers_fixup
+ s32i a3, a2, EXC_TABLE_FIXUP
+ rsr a3, windowbase
+ s32i a3, a2, EXC_TABLE_PARAM
+ l32i a2, a2, EXC_TABLE_KSTK
/* Load WB at the time the exception occurred. */
@@ -1206,8 +1228,12 @@ fast_syscall_spill_registers_fixup_return:
wsr a3, windowbase
rsync
+ rsr a3, excsave1
+ l32i a3, a3, EXC_TABLE_DOUBLE_SAVE
+
rfde
+ENDPROC(fast_syscall_spill_registers_fixup_return)
/*
* spill all registers.
--
1.8.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCHv2 2/2] xtensa: don't use alternate signal stack on threads
2013-10-26 1:03 [PATCHv2 0/2] xtensa fixes for 3.12 Max Filippov
2013-10-26 1:03 ` [PATCHv2 1/2] xtensa: fix fast_syscall_spill_registers_fixup Max Filippov
@ 2013-10-26 1:03 ` Max Filippov
1 sibling, 0 replies; 3+ messages in thread
From: Max Filippov @ 2013-10-26 1:03 UTC (permalink / raw)
To: Chris Zankel
Cc: Marc Gauthier, linux-xtensa, linux-arch, Baruch Siach, stable,
Max Filippov
From: Baruch Siach <baruch@tkos.co.il>
According to create_thread(3): "The new thread does not inherit the creating
thread's alternate signal stack". Since commit f9a3879a (Fix sigaltstack
corruption among cloned threads), current->sas_ss_size is set to 0 for cloned
processes sharing VM with their parent. Don't use the (nonexistent) alternate
signal stack in this case. This has been broken since commit 29c4dfd9 ([XTENSA]
Remove non-rt signal handling).
Fixes the SA_ONSTACK part of the nptl/tst-cancel20 test from uClibc.
Cc: <stable@vger.kernel.org>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
arch/xtensa/kernel/signal.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c
index 718eca1..98b67d5 100644
--- a/arch/xtensa/kernel/signal.c
+++ b/arch/xtensa/kernel/signal.c
@@ -341,7 +341,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sp = regs->areg[1];
- if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp)) {
+ if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) {
sp = current->sas_ss_sp + current->sas_ss_size;
}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-10-26 1:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-26 1:03 [PATCHv2 0/2] xtensa fixes for 3.12 Max Filippov
2013-10-26 1:03 ` [PATCHv2 1/2] xtensa: fix fast_syscall_spill_registers_fixup Max Filippov
2013-10-26 1:03 ` [PATCHv2 2/2] xtensa: don't use alternate signal stack on threads Max Filippov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).