Skip to content

Commit

Permalink
ARM: use linker magic for vectors and vector stubs
Browse files Browse the repository at this point in the history
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: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Jul 31, 2013
1 parent 19accfd commit b9b32bf
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 18 deletions.
28 changes: 10 additions & 18 deletions arch/arm/kernel/entry-armv.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
17 changes: 17 additions & 0 deletions arch/arm/kernel/vmlinux.lds.S
Original file line number Diff line number Diff line change
Expand Up @@ -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 : {
Expand Down

0 comments on commit b9b32bf

Please sign in to comment.