Commit c0226e34 authored by Max Filippov's avatar Max Filippov Committed by Chris Zankel
Browse files

xtensa: make DoubleExceptionVector literals fit the gap



Manually load references to exc_table from the explicit literal in order
to fit DoubleExceptionVector.literals into the available 16-byte gap
before DoubleExceptionVector.text in the absence of link time
relaxation. Without this fix DoubleExceptionVector.literal section
overlaps DoubleExceptionVector.text section in the linked vmlinux image.

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
Signed-off-by: default avatarChris Zankel <chris@zankel.net>
parent 65501622
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -225,7 +225,13 @@ ENTRY(_DoubleExceptionVector)
	/* Window overflow/underflow exception. Get stack pointer. */

	mov	a3, a2
	movi	a2, exc_table
	/* This explicit literal and the following references to it are made
	 * in order to fit DoubleExceptionVector.literals into the available
	 * 16-byte gap before DoubleExceptionVector.text in the absence of
	 * link time relaxation. See kernel/vmlinux.lds.S
	 */
	.literal .Lexc_table, exc_table
	l32r	a2, .Lexc_table
	l32i	a2, a2, EXC_TABLE_KSTK

	/* Check for overflow/underflow exception, jump if overflow. */
@@ -255,7 +261,7 @@ ENTRY(_DoubleExceptionVector)
	s32i	a0, a2, PT_AREG0

	wsr	a3, excsave1		# save a3
	movi	a3, exc_table
	l32r	a3, .Lexc_table

	rsr	a0, exccause
	s32i	a0, a2, PT_DEPC		# mark it as a regular exception
@@ -267,7 +273,7 @@ ENTRY(_DoubleExceptionVector)

	/* a0: depc, a1: a1, a2: a2, a3: trashed, depc: a0, excsave1: a3 */

	movi	a3, exc_table
	l32r	a3, .Lexc_table
	s32i	a2, a3, EXC_TABLE_DOUBLE_SAVE	# temporary variable

	/* Enter critical section. */
@@ -296,7 +302,7 @@ ENTRY(_DoubleExceptionVector)

	/* a0: avail, a1: a1, a2: kstk, a3: avail, depc: a2, excsave: a3 */

	movi	a3, exc_table
	l32r	a3, .Lexc_table
	rsr	a0, exccause
	addx4	a0, a0, a3
	l32i	a0, a0, EXC_TABLE_FAST_USER