aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2013-07-04 07:03:31 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2013-07-31 16:34:24 -0400
commitb9b32bf70f2fb710b07c94e13afbc729afe221da (patch)
tree865285ebb52964077d2b8a89a9e6b4d9e56eec5c
parent19accfd373847ac3d10623c5d20f948846299741 (diff)
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: Nicolas Pitre <nico@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/kernel/entry-armv.S28
-rw-r--r--arch/arm/kernel/vmlinux.lds.S17
2 files changed, 27 insertions, 18 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index 79a41fa978f5..7e1ae91e5b1a 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -993,7 +993,7 @@ ENDPROC(vector_\name)
9931: 9931:
994 .endm 994 .endm
995 995
996 .globl __stubs_start 996 .section .stubs, "ax", %progbits
997__stubs_start: 997__stubs_start:
998 @ This must be the first word 998 @ This must be the first word
999 .word vector_swi 999 .word vector_swi
@@ -1120,24 +1120,16 @@ vector_addrexcptn:
1120vector_fiq: 1120vector_fiq:
1121 subs pc, lr, #4 1121 subs pc, lr, #4
1122 1122
1123 .globl __stubs_end 1123 .section .vectors, "ax", %progbits
1124__stubs_end:
1125
1126 .equ stubs_offset, __vectors_start + 0x1000 - __stubs_start
1127
1128 .globl __vectors_start
1129__vectors_start: 1124__vectors_start:
1130 W(b) vector_rst + stubs_offset 1125 W(b) vector_rst
1131 W(b) vector_und + stubs_offset 1126 W(b) vector_und
1132 W(ldr) pc, .LCvswi + stubs_offset 1127 W(ldr) pc, __vectors_start + 0x1000
1133 W(b) vector_pabt + stubs_offset 1128 W(b) vector_pabt
1134 W(b) vector_dabt + stubs_offset 1129 W(b) vector_dabt
1135 W(b) vector_addrexcptn + stubs_offset 1130 W(b) vector_addrexcptn
1136 W(b) vector_irq + stubs_offset 1131 W(b) vector_irq
1137 W(b) vector_fiq + stubs_offset 1132 W(b) vector_fiq
1138
1139 .globl __vectors_end
1140__vectors_end:
1141 1133
1142 .data 1134 .data
1143 1135
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index fa25e4e425f6..7bcee5c9b604 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -148,6 +148,23 @@ SECTIONS
148 . = ALIGN(PAGE_SIZE); 148 . = ALIGN(PAGE_SIZE);
149 __init_begin = .; 149 __init_begin = .;
150#endif 150#endif
151 /*
152 * The vectors and stubs are relocatable code, and the
153 * only thing that matters is their relative offsets
154 */
155 __vectors_start = .;
156 .vectors 0 : AT(__vectors_start) {
157 *(.vectors)
158 }
159 . = __vectors_start + SIZEOF(.vectors);
160 __vectors_end = .;
161
162 __stubs_start = .;
163 .stubs 0x1000 : AT(__stubs_start) {
164 *(.stubs)
165 }
166 . = __stubs_start + SIZEOF(.stubs);
167 __stubs_end = .;
151 168
152 INIT_TEXT_SECTION(8) 169 INIT_TEXT_SECTION(8)
153 .exit.text : { 170 .exit.text : {