@ mmu has been enabled
        adr     lr, BSYM(1f)                    @ return (PIC) address
        mov     r8, r4                          @ set TTBR1 to swapper_pg_dir
- ARM(  add     pc, r10, #PROCINFO_INITFUNC     )
- THUMB(        add     r12, r10, #PROCINFO_INITFUNC    )
- THUMB(        ret     r12                             )
+       ldr     r12, [r10, #PROCINFO_INITFUNC]
+       add     r12, r12, r10
+       ret     r12
 1:     b       __enable_mmu
 ENDPROC(stext)
        .ltorg
        ldr     r8, [r7, lr]                    @ get secondary_data.swapper_pg_dir
        adr     lr, BSYM(__enable_mmu)          @ return address
        mov     r13, r12                        @ __secondary_switched address
- ARM(  add     pc, r10, #PROCINFO_INITFUNC     ) @ initialise processor
-                                                 @ (return control reg)
- THUMB(        add     r12, r10, #PROCINFO_INITFUNC    )
- THUMB(        ret     r12                             )
+       ldr     r12, [r10, #PROCINFO_INITFUNC]
+       add     r12, r12, r10                   @ initialise processor
+                                               @ (return control reg)
+       ret     r12
 ENDPROC(secondary_startup)
 ENDPROC(secondary_startup_arm)
 
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm1020_proc_info,#object
 __arm1020_proc_info:
        .long   PMD_TYPE_SECT | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm1020_setup
+       initfn  __arm1020_setup, __arm1020_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm1020e_proc_info,#object
 __arm1020e_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm1020e_setup
+       initfn  __arm1020e_setup, __arm1020e_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_EDSP
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm1022_proc_info,#object
 __arm1022_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm1022_setup
+       initfn  __arm1022_setup, __arm1022_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_EDSP
 
        string  cpu_arm1026_name, "ARM1026EJ-S"
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm1026_proc_info,#object
 __arm1026_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm1026_setup
+       initfn  __arm1026_setup, __arm1026_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA
 
  * See <asm/procinfo.h> for a definition of this structure.
  */
        
-               .section ".proc.info.init", #alloc, #execinstr
+               .section ".proc.info.init", #alloc
 
 .macro arm720_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cpu_flush:req
                .type   __\name\()_proc_info,#object
                        PMD_BIT4 | \
                        PMD_SECT_AP_WRITE | \
                        PMD_SECT_AP_READ
-               b       \cpu_flush                              @ cpu_flush
+               initfn  \cpu_flush, __\name\()_proc_info        @ cpu_flush
                .long   cpu_arch_name                           @ arch_name
                .long   cpu_elf_name                            @ elf_name
                .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB    @ elf_hwcap
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
        .type   __arm740_proc_info,#object
 __arm740_proc_info:
        .long   0x41807400
        .long   0xfffffff0
        .long   0
        .long   0
-       b       __arm740_setup
+       initfn  __arm740_setup, __arm740_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT
 
 
                .align
 
-               .section ".proc.info.init", #alloc, #execinstr
+               .section ".proc.info.init", #alloc
 
 .macro arm7tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, \
        extra_hwcaps=0
                .long   \cpu_mask
                .long   0
                .long   0
-               b       __arm7tdmi_setup
+               initfn  __arm7tdmi_setup, __\name\()_proc_info
                .long   cpu_arch_name
                .long   cpu_elf_name
                .long   HWCAP_SWP | HWCAP_26BIT | ( \extra_hwcaps )
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm920_proc_info,#object
 __arm920_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm920_setup
+       initfn  __arm920_setup, __arm920_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm922_proc_info,#object
 __arm922_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm922_setup
+       initfn  __arm922_setup, __arm922_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
 .macro arm925_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache
        .type   __\name\()_proc_info,#object
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm925_setup
+       initfn  __arm925_setup, __\name\()_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm926_proc_info,#object
 __arm926_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __arm926_setup
+       initfn  __arm926_setup, __arm926_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __arm940_proc_info,#object
 __arm940_proc_info:
        .long   0x41009400
        .long   0xff00fff0
        .long   0
-       b       __arm940_setup
+       initfn  __arm940_setup, __arm940_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
        .type   __arm946_proc_info,#object
 __arm946_proc_info:
        .long   0x41009460
        .long   0xff00fff0
        .long   0
        .long   0
-       b       __arm946_setup
+       initfn  __arm946_setup, __arm946_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
 
 
                .align
 
-               .section ".proc.info.init", #alloc, #execinstr
+               .section ".proc.info.init", #alloc
 
 .macro arm9tdmi_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req
                .type   __\name\()_proc_info, #object
                .long   \cpu_mask
                .long   0
                .long   0
-               b       __arm9tdmi_setup
+               initfn  __arm9tdmi_setup, __\name\()_proc_info
                .long   cpu_arch_name
                .long   cpu_elf_name
                .long   HWCAP_SWP | HWCAP_THUMB | HWCAP_26BIT
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __fa526_proc_info,#object
 __fa526_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __fa526_setup
+       initfn  __fa526_setup, __fa526_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
 .macro feroceon_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache:req
        .type   __\name\()_proc_info,#object
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __feroceon_setup
+       initfn  __feroceon_setup, __\name\()_proc_info
+       .long __feroceon_setup
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
 
        .globl  \x
        .equ    \x, \y
 .endm
+
+.macro initfn, func, base
+       .long   \func - \base
+.endm
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __88sv331x_proc_info,#object
 __88sv331x_proc_info:
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __mohawk_setup
+       initfn  __mohawk_setup, __88sv331x_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        .type   __sa110_proc_info,#object
 __sa110_proc_info:
        .long   PMD_TYPE_SECT | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __sa110_setup
+       initfn  __sa110_setup, __sa110_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT | HWCAP_FAST_MULT
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
 .macro sa1100_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req
        .type   __\name\()_proc_info,#object
        .long   PMD_TYPE_SECT | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __sa1100_setup
+       initfn  __sa1100_setup, __\name\()_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT | HWCAP_FAST_MULT
 
        string  cpu_elf_name, "v6"
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        /*
         * Match any ARMv6 processor core.
                PMD_SECT_XN | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __v6_setup
+       initfn  __v6_setup, __v6_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        /* See also feat_v6_fixup() for HWCAP_TLS */
 
        string  cpu_elf_name, "v7"
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        /*
         * Standard v7 proc info content
         */
-.macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0, proc_fns = v7_processor_functions
+.macro __v7_proc name, initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0, proc_fns = v7_processor_functions
        ALT_SMP(.long   PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
                        PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags)
        ALT_UP(.long    PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
                        PMD_SECT_AF | PMD_FLAGS_UP | \mm_mmuflags)
        .long   PMD_TYPE_SECT | PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ | PMD_SECT_AF | \io_mmuflags
-       W(b)    \initfunc
+       initfn  \initfunc, \name
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \
 __v7_ca5mp_proc_info:
        .long   0x410fc050
        .long   0xff0ffff0
-       __v7_proc __v7_ca5mp_setup
+       __v7_proc __v7_ca5mp_proc_info, __v7_ca5mp_setup
        .size   __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info
 
        /*
 __v7_ca9mp_proc_info:
        .long   0x410fc090
        .long   0xff0ffff0
-       __v7_proc __v7_ca9mp_setup, proc_fns = ca9mp_processor_functions
+       __v7_proc __v7_ca9mp_proc_info, __v7_ca9mp_setup, proc_fns = ca9mp_processor_functions
        .size   __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info
 
 #endif /* CONFIG_ARM_LPAE */
 __v7_pj4b_proc_info:
        .long   0x560f5800
        .long   0xff0fff00
-       __v7_proc __v7_pj4b_setup, proc_fns = pj4b_processor_functions
+       __v7_proc __v7_pj4b_proc_info, __v7_pj4b_setup, proc_fns = pj4b_processor_functions
        .size   __v7_pj4b_proc_info, . - __v7_pj4b_proc_info
 #endif
 
 __v7_cr7mp_proc_info:
        .long   0x410fc170
        .long   0xff0ffff0
-       __v7_proc __v7_cr7mp_setup
+       __v7_proc __v7_cr7mp_proc_info, __v7_cr7mp_setup
        .size   __v7_cr7mp_proc_info, . - __v7_cr7mp_proc_info
 
        /*
 __v7_ca7mp_proc_info:
        .long   0x410fc070
        .long   0xff0ffff0
-       __v7_proc __v7_ca7mp_setup
+       __v7_proc __v7_ca7mp_proc_info, __v7_ca7mp_setup
        .size   __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
 
        /*
 __v7_ca12mp_proc_info:
        .long   0x410fc0d0
        .long   0xff0ffff0
-       __v7_proc __v7_ca12mp_setup
+       __v7_proc __v7_ca12mp_proc_info, __v7_ca12mp_setup
        .size   __v7_ca12mp_proc_info, . - __v7_ca12mp_proc_info
 
        /*
 __v7_ca15mp_proc_info:
        .long   0x410fc0f0
        .long   0xff0ffff0
-       __v7_proc __v7_ca15mp_setup
+       __v7_proc __v7_ca15mp_proc_info, __v7_ca15mp_setup
        .size   __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
 
        /*
 __v7_b15mp_proc_info:
        .long   0x420f00f0
        .long   0xff0ffff0
-       __v7_proc __v7_b15mp_setup
+       __v7_proc __v7_b15mp_proc_info, __v7_b15mp_setup
        .size   __v7_b15mp_proc_info, . - __v7_b15mp_proc_info
 
        /*
 __v7_ca17mp_proc_info:
        .long   0x410fc0e0
        .long   0xff0ffff0
-       __v7_proc __v7_ca17mp_setup
+       __v7_proc __v7_ca17mp_proc_info, __v7_ca17mp_setup
        .size   __v7_ca17mp_proc_info, . - __v7_ca17mp_proc_info
 
        /*
         * do support them. They also don't indicate support for fused multiply
         * instructions even though they actually do support them.
         */
-       __v7_proc __v7_setup, hwcaps = HWCAP_IDIV | HWCAP_VFPv4
+       __v7_proc __krait_proc_info, __v7_setup, hwcaps = HWCAP_IDIV | HWCAP_VFPv4
        .size   __krait_proc_info, . - __krait_proc_info
 
        /*
 __v7_proc_info:
        .long   0x000f0000              @ Required ID value
        .long   0x000f0000              @ Mask for ID
-       __v7_proc __v7_setup
+       __v7_proc __v7_proc_info, __v7_setup
        .size   __v7_proc_info, . - __v7_proc_info
 
        string cpu_elf_name "v7m"
        string cpu_v7m_name "ARMv7-M"
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
        /*
         * Match any ARMv7-M processor core.
        .long   0x000f0000              @ Mask for ID
        .long   0                       @ proc_info_list.__cpu_mm_mmu_flags
        .long   0                       @ proc_info_list.__cpu_io_mmu_flags
-       b       __v7m_setup             @ proc_info_list.__cpu_flush
+       initfn  __v7m_setup, __v7m_proc_info    @ proc_info_list.__cpu_flush
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
 .macro xsc3_proc_info name:req, cpu_val:req, cpu_mask:req
        .type   __\name\()_proc_info,#object
        .long   PMD_TYPE_SECT | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __xsc3_setup
+       initfn  __xsc3_setup, __\name\()_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
 
 
        .align
 
-       .section ".proc.info.init", #alloc, #execinstr
+       .section ".proc.info.init", #alloc
 
 .macro xscale_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cache
        .type   __\name\()_proc_info,#object
        .long   PMD_TYPE_SECT | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
-       b       __xscale_setup
+       initfn  __xscale_setup, __\name\()_proc_info
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP