6161 .macro pabt_helper
6262 @ PABORT handler takes pt_regs in r2 , fault address in r4 and psr in r5
6363#ifdef MULTI_PABORT
64- ldr ip , .LCprocfns
65- mov lr , pc
66- ldr pc , [ ip , #PROCESSOR_PABT_FUNC ]
64+ ldr_va ip , processor , offset=PROCESSOR_PABT_FUNC
65+ bl_r ip
6766#else
6867 bl CPU_PABORT_HANDLER
6968#endif
8281 @ the fault status register in r1. r9 must be preserved.
8382 @
8483#ifdef MULTI_DABORT
85- ldr ip , .LCprocfns
86- mov lr , pc
87- ldr pc , [ ip , #PROCESSOR_DABT_FUNC ]
84+ ldr_va ip , processor , offset=PROCESSOR_DABT_FUNC
85+ bl_r ip
8886#else
8987 bl CPU_DABORT_HANDLER
9088#endif
@@ -302,16 +300,6 @@ __fiq_svc:
302300 UNWIND(.fnend )
303301ENDPROC(__fiq_svc)
304302
305- . align 5
306- .LCcralign:
307- . word cr_alignment
308- #ifdef MULTI_DABORT
309- .LCprocfns:
310- . word processor
311- #endif
312- .LCfp:
313- . word fp_enter
314-
315303/ *
316304 * Abort mode handlers
317305 * /
@@ -370,7 +358,7 @@ ENDPROC(__fiq_abt)
370358 THUMB( stmia sp , {r0 - r12 } )
371359
372360 ATRAP( mrc p15 , 0 , r7 , c1 , c0 , 0 )
373- ATRAP( ldr r8 , .LCcralign )
361+ ATRAP( ldr_va r8 , cr_alignment )
374362
375363 ldmia r0 , {r3 - r5}
376364 add r0 , sp , #S_PC @ here for interlock avoidance
@@ -379,8 +367,6 @@ ENDPROC(__fiq_abt)
379367 str r3 , [ sp ] @ save the "real" r0 copied
380368 @ from the exception stack
381369
382- ATRAP( ldr r8 , [ r8 , # 0 ] )
383-
384370 @
385371 @ We are now ready to fill in the remaining blanks on the stack:
386372 @
@@ -505,9 +491,7 @@ __und_usr_thumb:
505491 * /
506492#if __LINUX_ARM_ARCH__ < 7
507493/ * If the target CPU may not be Thumb - 2 - capable , a run - time check is needed: * /
508- #define NEED_CPU_ARCHITECTURE
509- ldr r5 , .LCcpu_architecture
510- ldr r5 , [ r5 ]
494+ ldr_va r5 , cpu_architecture
511495 cmp r5 , #CPU_ARCH_ARMv7
512496 blo __und_usr_fault_16 @ 16bit undefined instruction
513497/ *
@@ -654,12 +638,6 @@ call_fpe:
654638 ret .w lr @ CP# 14 (Debug)
655639 ret .w lr @ CP# 15 (Control)
656640
657- #ifdef NEED_CPU_ARCHITECTURE
658- . align 2
659- .LCcpu_architecture:
660- . word __cpu_architecture
661- #endif
662-
663641#ifdef CONFIG_NEON
664642 . align 6
665643
@@ -685,9 +663,8 @@ call_fpe:
685663#endif
686664
687665do_fpe:
688- ldr r4 , .LCfp
689666 add r10 , r10 , #TI_FPSTATE @ r10 = workspace
690- ldr pc , [ r4 ] @ Call FP module USR entry point
667+ ldr_va pc , fp_enter , tmp=r4 @ Call FP module USR entry point
691668
692669/ *
693670 * The FP module is called with these registers set:
@@ -1101,6 +1078,12 @@ __kuser_helper_end:
11011078 * /
11021079 .macro vector_stub , name , mode , correction= 0
11031080 . align 5
1081+ #ifdef CONFIG_HARDEN_BRANCH_HISTORY
1082+ vector_bhb_bpiall_\name:
1083+ mcr p15 , 0 , r0 , c7 , c5 , 6 @ BPIALL
1084+ @ isb not needed due to "movs pc, lr" in the vector stub
1085+ @ which gives a "context synchronisation" .
1086+ #endif
11041087
11051088vector_\name:
11061089 .if \correction
@@ -1111,7 +1094,8 @@ vector_\name:
11111094 stmia sp , {r0 , lr} @ save r0 , lr
11121095
11131096 @ Save spsr_<exception> (parent CPSR)
1114- 2 : mrs lr , spsr
1097+ .Lvec_\name:
1098+ mrs lr , spsr
11151099 str lr , [ sp , # 8 ] @ save spsr
11161100
11171101 @
@@ -1148,25 +1132,11 @@ vector_bhb_loop8_\name:
114811323 : W(b) . + 4
11491133 subs r0 , r0 , # 1
11501134 bne 3b
1151- dsb
1152- isb
1153- b 2b
1154- ENDPROC(vector_bhb_loop8_\name)
1155-
1156- vector_bhb_bpiall_\name:
1157- .if \correction
1158- sub lr , lr , #\correction
1159- .endif
1160-
1161- @ Save r0 , lr_<exception> (parent PC)
1162- stmia sp , {r0 , lr}
1163-
1164- @ bhb workaround
1165- mcr p15 , 0 , r0 , c7 , c5 , 6 @ BPIALL
1135+ dsb nsh
11661136 @ isb not needed due to "movs pc, lr" in the vector stub
11671137 @ which gives a "context synchronisation" .
1168- b 2b
1169- ENDPROC(vector_bhb_bpiall_ \name)
1138+ b .Lvec_\name
1139+ ENDPROC(vector_bhb_loop8_ \name)
11701140 .previous
11711141#endif
11721142
@@ -1176,10 +1146,15 @@ ENDPROC(vector_bhb_bpiall_\name)
11761146 .endm
11771147
11781148 . section .stubs , "ax" , %progbits
1179- @ This must be the first word
1149+ @ These need to remain at the start of the section so th at
1150+ @ they are in range of the 'SWI' entries in the vector tables
1151+ @ located 4k down.
1152+ .L__vector_swi:
11801153 . word vector_swi
11811154#ifdef CONFIG_HARDEN_BRANCH_HISTORY
1155+ .L__vector_bhb_loop8_swi:
11821156 . word vector_bhb_loop8_swi
1157+ .L__vector_bhb_bpiall_swi:
11831158 . word vector_bhb_bpiall_swi
11841159#endif
11851160
@@ -1322,10 +1297,11 @@ vector_addrexcptn:
13221297 .globl vector_fiq
13231298
13241299 . section .vectors , "ax" , %progbits
1325- .L__vectors_start:
13261300 W(b) vector_rst
13271301 W(b) vector_und
1328- W(ldr) pc , .L__vectors_start + 0x1000
1302+ ARM( .reloc . , R_ARM_LDR_PC_G0 , .L__vector_swi )
1303+ THUMB( .reloc . , R_ARM_THM_PC12 , .L__vector_swi )
1304+ W(ldr) pc , .
13291305 W(b) vector_pabt
13301306 W(b) vector_dabt
13311307 W(b) vector_addrexcptn
@@ -1334,21 +1310,23 @@ vector_addrexcptn:
13341310
13351311#ifdef CONFIG_HARDEN_BRANCH_HISTORY
13361312 . section .vectors.bhb.loop8 , "ax" , %progbits
1337- .L__vectors_bhb_loop8_start:
13381313 W(b) vector_rst
13391314 W(b) vector_bhb_loop8_und
1340- W(ldr) pc , .L__vectors_bhb_loop8_start + 0x1004
1315+ ARM( .reloc . , R_ARM_LDR_PC_G0 , .L__vector_bhb_loop8_swi )
1316+ THUMB( .reloc . , R_ARM_THM_PC12 , .L__vector_bhb_loop8_swi )
1317+ W(ldr) pc , .
13411318 W(b) vector_bhb_loop8_pabt
13421319 W(b) vector_bhb_loop8_dabt
13431320 W(b) vector_addrexcptn
13441321 W(b) vector_bhb_loop8_irq
13451322 W(b) vector_bhb_loop8_fiq
13461323
13471324 . section .vectors.bhb.bpiall , "ax" , %progbits
1348- .L__vectors_bhb_bpiall_start:
13491325 W(b) vector_rst
13501326 W(b) vector_bhb_bpiall_und
1351- W(ldr) pc , .L__vectors_bhb_bpiall_start + 0x1008
1327+ ARM( .reloc . , R_ARM_LDR_PC_G0 , .L__vector_bhb_bpiall_swi )
1328+ THUMB( .reloc . , R_ARM_THM_PC12 , .L__vector_bhb_bpiall_swi )
1329+ W(ldr) pc , .
13521330 W(b) vector_bhb_bpiall_pabt
13531331 W(b) vector_bhb_bpiall_dabt
13541332 W(b) vector_addrexcptn
0 commit comments