xtensa: don't allow overflow/underflow on unaligned stack
Double exceptions that happen during register window overflow/underflow are handled in the topmost stack frame, as if it was the only exception that occured. However unaligned access exception handler is special because it needs to analyze instruction that caused the exception, but the userspace instruction that triggered window exception is completely irrelevant. Unaligned data access is rather normal in the generic userspace code, but stack pointer manipulation must always be done by architecture-aware code and thus unaligned stack means a serious problem anyway. Use the default unaligned access handler that raises SIGBUS in case of unaligned access in window overflow/underflow handler. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
d1b6ba82a5
commit
3cfc096e4c
|
@ -101,9 +101,8 @@ static dispatch_init_table_t __initdata dispatch_init_table[] = {
|
||||||
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
|
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
|
||||||
#ifdef CONFIG_XTENSA_UNALIGNED_USER
|
#ifdef CONFIG_XTENSA_UNALIGNED_USER
|
||||||
{ EXCCAUSE_UNALIGNED, USER, fast_unaligned },
|
{ EXCCAUSE_UNALIGNED, USER, fast_unaligned },
|
||||||
#else
|
|
||||||
{ EXCCAUSE_UNALIGNED, 0, do_unaligned_user },
|
|
||||||
#endif
|
#endif
|
||||||
|
{ EXCCAUSE_UNALIGNED, 0, do_unaligned_user },
|
||||||
{ EXCCAUSE_UNALIGNED, KRNL, fast_unaligned },
|
{ EXCCAUSE_UNALIGNED, KRNL, fast_unaligned },
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
|
@ -264,7 +263,6 @@ do_illegal_instruction(struct pt_regs *regs)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
|
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
|
||||||
#ifndef CONFIG_XTENSA_UNALIGNED_USER
|
|
||||||
void
|
void
|
||||||
do_unaligned_user (struct pt_regs *regs)
|
do_unaligned_user (struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -286,7 +284,6 @@ do_unaligned_user (struct pt_regs *regs)
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
do_debug(struct pt_regs *regs)
|
do_debug(struct pt_regs *regs)
|
||||||
|
|
|
@ -454,8 +454,14 @@ _DoubleExceptionVector_WindowOverflow:
|
||||||
s32i a0, a2, PT_DEPC
|
s32i a0, a2, PT_DEPC
|
||||||
|
|
||||||
_DoubleExceptionVector_handle_exception:
|
_DoubleExceptionVector_handle_exception:
|
||||||
|
addi a0, a0, -EXCCAUSE_UNALIGNED
|
||||||
|
beqz a0, 2f
|
||||||
addx4 a0, a0, a3
|
addx4 a0, a0, a3
|
||||||
l32i a0, a0, EXC_TABLE_FAST_USER
|
l32i a0, a0, EXC_TABLE_FAST_USER + 4 * EXCCAUSE_UNALIGNED
|
||||||
|
xsr a3, excsave1
|
||||||
|
jx a0
|
||||||
|
2:
|
||||||
|
movi a0, user_exception
|
||||||
xsr a3, excsave1
|
xsr a3, excsave1
|
||||||
jx a0
|
jx a0
|
||||||
|
|
||||||
|
|
|
@ -269,13 +269,13 @@ SECTIONS
|
||||||
.UserExceptionVector.literal)
|
.UserExceptionVector.literal)
|
||||||
SECTION_VECTOR (_DoubleExceptionVector_literal,
|
SECTION_VECTOR (_DoubleExceptionVector_literal,
|
||||||
.DoubleExceptionVector.literal,
|
.DoubleExceptionVector.literal,
|
||||||
DOUBLEEXC_VECTOR_VADDR - 40,
|
DOUBLEEXC_VECTOR_VADDR - 48,
|
||||||
SIZEOF(.UserExceptionVector.text),
|
SIZEOF(.UserExceptionVector.text),
|
||||||
.UserExceptionVector.text)
|
.UserExceptionVector.text)
|
||||||
SECTION_VECTOR (_DoubleExceptionVector_text,
|
SECTION_VECTOR (_DoubleExceptionVector_text,
|
||||||
.DoubleExceptionVector.text,
|
.DoubleExceptionVector.text,
|
||||||
DOUBLEEXC_VECTOR_VADDR,
|
DOUBLEEXC_VECTOR_VADDR,
|
||||||
40,
|
48,
|
||||||
.DoubleExceptionVector.literal)
|
.DoubleExceptionVector.literal)
|
||||||
|
|
||||||
. = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3;
|
. = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3;
|
||||||
|
|
Loading…
Reference in New Issue