Skip to content

Commit bf35706

Browse files
Ard BiesheuvelRussell King
authored andcommitted
ARM: 8314/1: replace PROCINFO embedded branch with relative offset
This patch replaces the 'branch to setup()' instructions embedded in the PROCINFO structs with the offset to that setup function relative to the base of the struct. This preserves the position independent nature of that field, but uses a data item rather than an instruction. This is mainly done to prevent linker failures on large kernels, where the setup function is out of reach for the branch. Acked-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
1 parent 0a6a78b commit bf35706

26 files changed

+72
-67
lines changed

arch/arm/kernel/head.S

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ ENTRY(stext)
138138
@ mmu has been enabled
139139
adr lr, BSYM(1f) @ return (PIC) address
140140
mov r8, r4 @ set TTBR1 to swapper_pg_dir
141-
ARM( add pc, r10, #PROCINFO_INITFUNC )
142-
THUMB( add r12, r10, #PROCINFO_INITFUNC )
143-
THUMB( ret r12 )
141+
ldr r12, [r10, #PROCINFO_INITFUNC]
142+
add r12, r12, r10
143+
ret r12
144144
1: b __enable_mmu
145145
ENDPROC(stext)
146146
.ltorg
@@ -386,10 +386,10 @@ ENTRY(secondary_startup)
386386
ldr r8, [r7, lr] @ get secondary_data.swapper_pg_dir
387387
adr lr, BSYM(__enable_mmu) @ return address
388388
mov r13, r12 @ __secondary_switched address
389-
ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor
390-
@ (return control reg)
391-
THUMB( add r12, r10, #PROCINFO_INITFUNC )
392-
THUMB( ret r12 )
389+
ldr r12, [r10, #PROCINFO_INITFUNC]
390+
add r12, r12, r10 @ initialise processor
391+
@ (return control reg)
392+
ret r12
393393
ENDPROC(secondary_startup)
394394
ENDPROC(secondary_startup_arm)
395395

arch/arm/mm/proc-arm1020.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ cpu_arm1020_name:
507507

508508
.align
509509

510-
.section ".proc.info.init", #alloc, #execinstr
510+
.section ".proc.info.init", #alloc
511511

512512
.type __arm1020_proc_info,#object
513513
__arm1020_proc_info:
@@ -519,7 +519,7 @@ __arm1020_proc_info:
519519
.long PMD_TYPE_SECT | \
520520
PMD_SECT_AP_WRITE | \
521521
PMD_SECT_AP_READ
522-
b __arm1020_setup
522+
initfn __arm1020_setup, __arm1020_proc_info
523523
.long cpu_arch_name
524524
.long cpu_elf_name
525525
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB

arch/arm/mm/proc-arm1020e.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ arm1020e_crval:
465465

466466
.align
467467

468-
.section ".proc.info.init", #alloc, #execinstr
468+
.section ".proc.info.init", #alloc
469469

470470
.type __arm1020e_proc_info,#object
471471
__arm1020e_proc_info:
@@ -479,7 +479,7 @@ __arm1020e_proc_info:
479479
PMD_BIT4 | \
480480
PMD_SECT_AP_WRITE | \
481481
PMD_SECT_AP_READ
482-
b __arm1020e_setup
482+
initfn __arm1020e_setup, __arm1020e_proc_info
483483
.long cpu_arch_name
484484
.long cpu_elf_name
485485
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_EDSP

arch/arm/mm/proc-arm1022.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ arm1022_crval:
448448

449449
.align
450450

451-
.section ".proc.info.init", #alloc, #execinstr
451+
.section ".proc.info.init", #alloc
452452

453453
.type __arm1022_proc_info,#object
454454
__arm1022_proc_info:
@@ -462,7 +462,7 @@ __arm1022_proc_info:
462462
PMD_BIT4 | \
463463
PMD_SECT_AP_WRITE | \
464464
PMD_SECT_AP_READ
465-
b __arm1022_setup
465+
initfn __arm1022_setup, __arm1022_proc_info
466466
.long cpu_arch_name
467467
.long cpu_elf_name
468468
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_EDSP

arch/arm/mm/proc-arm1026.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ arm1026_crval:
442442
string cpu_arm1026_name, "ARM1026EJ-S"
443443
.align
444444

445-
.section ".proc.info.init", #alloc, #execinstr
445+
.section ".proc.info.init", #alloc
446446

447447
.type __arm1026_proc_info,#object
448448
__arm1026_proc_info:
@@ -456,7 +456,7 @@ __arm1026_proc_info:
456456
PMD_BIT4 | \
457457
PMD_SECT_AP_WRITE | \
458458
PMD_SECT_AP_READ
459-
b __arm1026_setup
459+
initfn __arm1026_setup, __arm1026_proc_info
460460
.long cpu_arch_name
461461
.long cpu_elf_name
462462
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA

arch/arm/mm/proc-arm720.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ arm720_crval:
186186
* See <asm/procinfo.h> for a definition of this structure.
187187
*/
188188
189-
.section ".proc.info.init", #alloc, #execinstr
189+
.section ".proc.info.init", #alloc
190190

191191
.macro arm720_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cpu_flush:req
192192
.type __\name\()_proc_info,#object
@@ -203,7 +203,7 @@ __\name\()_proc_info:
203203
PMD_BIT4 | \
204204
PMD_SECT_AP_WRITE | \
205205
PMD_SECT_AP_READ
206-
b \cpu_flush @ cpu_flush
206+
initfn \cpu_flush, __\name\()_proc_info @ cpu_flush
207207
.long cpu_arch_name @ arch_name
208208
.long cpu_elf_name @ elf_name
209209
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB @ elf_hwcap

arch/arm/mm/proc-arm740.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ __arm740_setup:
132132

133133
.align
134134

135-
.section ".proc.info.init", #alloc, #execinstr
135+
.section ".proc.info.init", #alloc
136136
.type __arm740_proc_info,#object
137137
__arm740_proc_info:
138138
.long 0x41807400
139139
.long 0xfffffff0
140140
.long 0
141141
.long 0
142-
b __arm740_setup
142+
initfn __arm740_setup, __arm740_proc_info
143143
.long cpu_arch_name
144144
.long cpu_elf_name
145145
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT

arch/arm/mm/proc-arm7tdmi.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ __arm7tdmi_setup:
7676

7777
.align
7878

79-
.section ".proc.info.init", #alloc, #execinstr
79+
.section ".proc.info.init", #alloc
8080

8181
.macro arm7tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, \
8282
extra_hwcaps=0
@@ -86,7 +86,7 @@ __\name\()_proc_info:
8686
.long \cpu_mask
8787
.long 0
8888
.long 0
89-
b __arm7tdmi_setup
89+
initfn __arm7tdmi_setup, __\name\()_proc_info
9090
.long cpu_arch_name
9191
.long cpu_elf_name
9292
.long HWCAP_SWP | HWCAP_26BIT | ( \extra_hwcaps )

arch/arm/mm/proc-arm920.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ arm920_crval:
448448

449449
.align
450450

451-
.section ".proc.info.init", #alloc, #execinstr
451+
.section ".proc.info.init", #alloc
452452

453453
.type __arm920_proc_info,#object
454454
__arm920_proc_info:
@@ -464,7 +464,7 @@ __arm920_proc_info:
464464
PMD_BIT4 | \
465465
PMD_SECT_AP_WRITE | \
466466
PMD_SECT_AP_READ
467-
b __arm920_setup
467+
initfn __arm920_setup, __arm920_proc_info
468468
.long cpu_arch_name
469469
.long cpu_elf_name
470470
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB

arch/arm/mm/proc-arm922.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ arm922_crval:
426426

427427
.align
428428

429-
.section ".proc.info.init", #alloc, #execinstr
429+
.section ".proc.info.init", #alloc
430430

431431
.type __arm922_proc_info,#object
432432
__arm922_proc_info:
@@ -442,7 +442,7 @@ __arm922_proc_info:
442442
PMD_BIT4 | \
443443
PMD_SECT_AP_WRITE | \
444444
PMD_SECT_AP_READ
445-
b __arm922_setup
445+
initfn __arm922_setup, __arm922_proc_info
446446
.long cpu_arch_name
447447
.long cpu_elf_name
448448
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB

arch/arm/mm/proc-arm925.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ arm925_crval:
494494

495495
.align
496496

497-
.section ".proc.info.init", #alloc, #execinstr
497+
.section ".proc.info.init", #alloc
498498

499499
.macro arm925_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache
500500
.type __\name\()_proc_info,#object
@@ -510,7 +510,7 @@ __\name\()_proc_info:
510510
PMD_BIT4 | \
511511
PMD_SECT_AP_WRITE | \
512512
PMD_SECT_AP_READ
513-
b __arm925_setup
513+
initfn __arm925_setup, __\name\()_proc_info
514514
.long cpu_arch_name
515515
.long cpu_elf_name
516516
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB

arch/arm/mm/proc-arm926.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ arm926_crval:
474474

475475
.align
476476

477-
.section ".proc.info.init", #alloc, #execinstr
477+
.section ".proc.info.init", #alloc
478478

479479
.type __arm926_proc_info,#object
480480
__arm926_proc_info:
@@ -490,7 +490,7 @@ __arm926_proc_info:
490490
PMD_BIT4 | \
491491
PMD_SECT_AP_WRITE | \
492492
PMD_SECT_AP_READ
493-
b __arm926_setup
493+
initfn __arm926_setup, __arm926_proc_info
494494
.long cpu_arch_name
495495
.long cpu_elf_name
496496
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA

arch/arm/mm/proc-arm940.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,14 +354,14 @@ __arm940_setup:
354354

355355
.align
356356

357-
.section ".proc.info.init", #alloc, #execinstr
357+
.section ".proc.info.init", #alloc
358358

359359
.type __arm940_proc_info,#object
360360
__arm940_proc_info:
361361
.long 0x41009400
362362
.long 0xff00fff0
363363
.long 0
364-
b __arm940_setup
364+
initfn __arm940_setup, __arm940_proc_info
365365
.long cpu_arch_name
366366
.long cpu_elf_name
367367
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB

arch/arm/mm/proc-arm946.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,14 +409,14 @@ __arm946_setup:
409409

410410
.align
411411

412-
.section ".proc.info.init", #alloc, #execinstr
412+
.section ".proc.info.init", #alloc
413413
.type __arm946_proc_info,#object
414414
__arm946_proc_info:
415415
.long 0x41009460
416416
.long 0xff00fff0
417417
.long 0
418418
.long 0
419-
b __arm946_setup
419+
initfn __arm946_setup, __arm946_proc_info
420420
.long cpu_arch_name
421421
.long cpu_elf_name
422422
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB

arch/arm/mm/proc-arm9tdmi.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ __arm9tdmi_setup:
7070

7171
.align
7272

73-
.section ".proc.info.init", #alloc, #execinstr
73+
.section ".proc.info.init", #alloc
7474

7575
.macro arm9tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req
7676
.type __\name\()_proc_info, #object
@@ -79,7 +79,7 @@ __\name\()_proc_info:
7979
.long \cpu_mask
8080
.long 0
8181
.long 0
82-
b __arm9tdmi_setup
82+
initfn __arm9tdmi_setup, __\name\()_proc_info
8383
.long cpu_arch_name
8484
.long cpu_elf_name
8585
.long HWCAP_SWP | HWCAP_THUMB | HWCAP_26BIT

arch/arm/mm/proc-fa526.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ fa526_cr1_set:
190190

191191
.align
192192

193-
.section ".proc.info.init", #alloc, #execinstr
193+
.section ".proc.info.init", #alloc
194194

195195
.type __fa526_proc_info,#object
196196
__fa526_proc_info:
@@ -206,7 +206,7 @@ __fa526_proc_info:
206206
PMD_BIT4 | \
207207
PMD_SECT_AP_WRITE | \
208208
PMD_SECT_AP_READ
209-
b __fa526_setup
209+
initfn __fa526_setup, __fa526_proc_info
210210
.long cpu_arch_name
211211
.long cpu_elf_name
212212
.long HWCAP_SWP | HWCAP_HALF

arch/arm/mm/proc-feroceon.S

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ feroceon_crval:
584584

585585
.align
586586

587-
.section ".proc.info.init", #alloc, #execinstr
587+
.section ".proc.info.init", #alloc
588588

589589
.macro feroceon_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache:req
590590
.type __\name\()_proc_info,#object
@@ -601,7 +601,8 @@ __\name\()_proc_info:
601601
PMD_BIT4 | \
602602
PMD_SECT_AP_WRITE | \
603603
PMD_SECT_AP_READ
604-
b __feroceon_setup
604+
initfn __feroceon_setup, __\name\()_proc_info
605+
.long __feroceon_setup
605606
.long cpu_arch_name
606607
.long cpu_elf_name
607608
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP

arch/arm/mm/proc-macros.S

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,3 +331,7 @@ ENTRY(\name\()_tlb_fns)
331331
.globl \x
332332
.equ \x, \y
333333
.endm
334+
335+
.macro initfn, func, base
336+
.long \func - \base
337+
.endm

arch/arm/mm/proc-mohawk.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ mohawk_crval:
427427

428428
.align
429429

430-
.section ".proc.info.init", #alloc, #execinstr
430+
.section ".proc.info.init", #alloc
431431

432432
.type __88sv331x_proc_info,#object
433433
__88sv331x_proc_info:
@@ -443,7 +443,7 @@ __88sv331x_proc_info:
443443
PMD_BIT4 | \
444444
PMD_SECT_AP_WRITE | \
445445
PMD_SECT_AP_READ
446-
b __mohawk_setup
446+
initfn __mohawk_setup, __88sv331x_proc_info
447447
.long cpu_arch_name
448448
.long cpu_elf_name
449449
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP

arch/arm/mm/proc-sa110.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ sa110_crval:
199199

200200
.align
201201

202-
.section ".proc.info.init", #alloc, #execinstr
202+
.section ".proc.info.init", #alloc
203203

204204
.type __sa110_proc_info,#object
205205
__sa110_proc_info:
@@ -213,7 +213,7 @@ __sa110_proc_info:
213213
.long PMD_TYPE_SECT | \
214214
PMD_SECT_AP_WRITE | \
215215
PMD_SECT_AP_READ
216-
b __sa110_setup
216+
initfn __sa110_setup, __sa110_proc_info
217217
.long cpu_arch_name
218218
.long cpu_elf_name
219219
.long HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT | HWCAP_FAST_MULT

arch/arm/mm/proc-sa1100.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ sa1100_crval:
242242

243243
.align
244244

245-
.section ".proc.info.init", #alloc, #execinstr
245+
.section ".proc.info.init", #alloc
246246

247247
.macro sa1100_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req
248248
.type __\name\()_proc_info,#object
@@ -257,7 +257,7 @@ __\name\()_proc_info:
257257
.long PMD_TYPE_SECT | \
258258
PMD_SECT_AP_WRITE | \
259259
PMD_SECT_AP_READ
260-
b __sa1100_setup
260+
initfn __sa1100_setup, __\name\()_proc_info
261261
.long cpu_arch_name
262262
.long cpu_elf_name
263263
.long HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT | HWCAP_FAST_MULT

arch/arm/mm/proc-v6.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ v6_crval:
264264
string cpu_elf_name, "v6"
265265
.align
266266

267-
.section ".proc.info.init", #alloc, #execinstr
267+
.section ".proc.info.init", #alloc
268268

269269
/*
270270
* Match any ARMv6 processor core.
@@ -287,7 +287,7 @@ __v6_proc_info:
287287
PMD_SECT_XN | \
288288
PMD_SECT_AP_WRITE | \
289289
PMD_SECT_AP_READ
290-
b __v6_setup
290+
initfn __v6_setup, __v6_proc_info
291291
.long cpu_arch_name
292292
.long cpu_elf_name
293293
/* See also feat_v6_fixup() for HWCAP_TLS */

0 commit comments

Comments
 (0)