Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3cfc096e authored by Max Filippov's avatar Max Filippov
Browse files

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: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent d1b6ba82
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -101,9 +101,8 @@ static dispatch_init_table_t __initdata dispatch_init_table[] = {
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
#ifdef CONFIG_XTENSA_UNALIGNED_USER
{ EXCCAUSE_UNALIGNED,		USER,	   fast_unaligned },
#else
{ EXCCAUSE_UNALIGNED,		0,	   do_unaligned_user },
#endif
{ EXCCAUSE_UNALIGNED,		0,	   do_unaligned_user },
{ EXCCAUSE_UNALIGNED,		KRNL,	   fast_unaligned },
#endif
#ifdef CONFIG_MMU
@@ -264,7 +263,6 @@ do_illegal_instruction(struct pt_regs *regs)
 */

#if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
#ifndef CONFIG_XTENSA_UNALIGNED_USER
void
do_unaligned_user (struct pt_regs *regs)
{
@@ -286,7 +284,6 @@ do_unaligned_user (struct pt_regs *regs)

}
#endif
#endif

void
do_debug(struct pt_regs *regs)
+7 −1
Original line number Diff line number Diff line
@@ -454,8 +454,14 @@ _DoubleExceptionVector_WindowOverflow:
	s32i	a0, a2, PT_DEPC

_DoubleExceptionVector_handle_exception:
	addi	a0, a0, -EXCCAUSE_UNALIGNED
	beqz	a0, 2f
	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
	jx	a0

+2 −2
Original line number Diff line number Diff line
@@ -269,13 +269,13 @@ SECTIONS
		  .UserExceptionVector.literal)
  SECTION_VECTOR (_DoubleExceptionVector_literal,
		  .DoubleExceptionVector.literal,
		  DOUBLEEXC_VECTOR_VADDR - 40,
		  DOUBLEEXC_VECTOR_VADDR - 48,
		  SIZEOF(.UserExceptionVector.text),
		  .UserExceptionVector.text)
  SECTION_VECTOR (_DoubleExceptionVector_text,
		  .DoubleExceptionVector.text,
		  DOUBLEEXC_VECTOR_VADDR,
		  40,
		  48,
		  .DoubleExceptionVector.literal)

  . = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3;