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

Commit b9b32bf7 authored by Russell King's avatar Russell King
Browse files

ARM: use linker magic for vectors and vector stubs



Use linker magic to create the vectors and vector stubs: we can tell the
linker to place them at an appropriate VMA, but keep the LMA within the
kernel.  This gets rid of some unnecessary symbol manipulation, and
have the linker calculate the relocations appropriately.

Cc: <stable@vger.kernel.org>
Acked-by: default avatarNicolas Pitre <nico@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 19accfd3
Loading
Loading
Loading
Loading
+10 −18
Original line number Diff line number Diff line
@@ -993,7 +993,7 @@ ENDPROC(vector_\name)
1:
	.endm

	.globl	__stubs_start
	.section .stubs, "ax", %progbits
__stubs_start:
	@ This must be the first word
	.word	vector_swi
@@ -1120,24 +1120,16 @@ vector_addrexcptn:
vector_fiq:
	subs	pc, lr, #4

	.globl	__stubs_end
__stubs_end:

	.equ	stubs_offset, __vectors_start + 0x1000 - __stubs_start

	.globl	__vectors_start
	.section .vectors, "ax", %progbits
__vectors_start:
	W(b)	vector_rst + stubs_offset
	W(b)	vector_und + stubs_offset
	W(ldr)	pc, .LCvswi + stubs_offset
	W(b)	vector_pabt + stubs_offset
	W(b)	vector_dabt + stubs_offset
	W(b)	vector_addrexcptn + stubs_offset
	W(b)	vector_irq + stubs_offset
	W(b)	vector_fiq + stubs_offset

	.globl	__vectors_end
__vectors_end:
	W(b)	vector_rst
	W(b)	vector_und
	W(ldr)	pc, __vectors_start + 0x1000
	W(b)	vector_pabt
	W(b)	vector_dabt
	W(b)	vector_addrexcptn
	W(b)	vector_irq
	W(b)	vector_fiq

	.data

+17 −0
Original line number Diff line number Diff line
@@ -148,6 +148,23 @@ SECTIONS
	. = ALIGN(PAGE_SIZE);
	__init_begin = .;
#endif
	/*
	 * The vectors and stubs are relocatable code, and the
	 * only thing that matters is their relative offsets
	 */
	__vectors_start = .;
	.vectors 0 : AT(__vectors_start) {
		*(.vectors)
	}
	. = __vectors_start + SIZEOF(.vectors);
	__vectors_end = .;

	__stubs_start = .;
	.stubs 0x1000 : AT(__stubs_start) {
		*(.stubs)
	}
	. = __stubs_start + SIZEOF(.stubs);
	__stubs_end = .;

	INIT_TEXT_SECTION(8)
	.exit.text : {