From: johlstei@codeaurora.org (Jeff Ohlstein)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 03/10] ARM: hotplug cpu: Keep processor information, startup code & __lookup_processor_type
Date: Mon, 04 Oct 2010 12:25:35 -0700 [thread overview]
Message-ID: <4CAA2A2F.7010901@codeaurora.org> (raw)
In-Reply-To: <E1P2oXV-00020M-QV@rmk-PC.arm.linux.org.uk>
Russell King - ARM Linux wrote:
> When hotplug CPU is enabled, we need to keep the list of supported CPUs,
> their setup functions, and __lookup_processor_type in place so that we
> can find and initialize secondary CPUs. Move these into the __CPUINIT
> section.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> arch/arm/kernel/head-common.S | 81 +++++++++++++++++++++++------------------
> arch/arm/kernel/vmlinux.lds.S | 24 +++++++++----
> arch/arm/mm/proc-arm1020e.S | 2 +-
> arch/arm/mm/proc-arm1022.S | 2 +-
> arch/arm/mm/proc-arm1026.S | 2 +-
> arch/arm/mm/proc-arm6_7.S | 2 +-
> arch/arm/mm/proc-arm720.S | 2 +-
> arch/arm/mm/proc-arm740.S | 2 +-
> arch/arm/mm/proc-arm7tdmi.S | 2 +-
> arch/arm/mm/proc-arm920.S | 2 +-
> arch/arm/mm/proc-arm922.S | 2 +-
> arch/arm/mm/proc-arm925.S | 2 +-
> arch/arm/mm/proc-arm926.S | 2 +-
> arch/arm/mm/proc-arm940.S | 2 +-
> arch/arm/mm/proc-arm946.S | 2 +-
> arch/arm/mm/proc-arm9tdmi.S | 2 +-
> arch/arm/mm/proc-fa526.S | 2 +-
> arch/arm/mm/proc-feroceon.S | 2 +-
> arch/arm/mm/proc-mohawk.S | 2 +-
> arch/arm/mm/proc-sa110.S | 2 +-
> arch/arm/mm/proc-sa1100.S | 2 +-
> arch/arm/mm/proc-v6.S | 6 +++-
> arch/arm/mm/proc-v7.S | 6 +++-
> arch/arm/mm/proc-xsc3.S | 2 +-
> arch/arm/mm/proc-xscale.S | 2 +-
> 25 files changed, 93 insertions(+), 66 deletions(-)
>
> diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S
> index b9505aa..6ad24d2 100644
> --- a/arch/arm/kernel/head-common.S
> +++ b/arch/arm/kernel/head-common.S
> @@ -145,45 +145,14 @@ ENDPROC(__error)
>
>
> /*
> - * Read processor ID register (CP#15, CR0), and look up in the linker-built
> - * supported processor list. Note that we can't use the absolute addresses
> - * for the __proc_info lists since we aren't running with the MMU on
> - * (and therefore, we are not in the correct address space). We have to
> - * calculate the offset.
> - *
> - * r9 = cpuid
> - * Returns:
> - * r3, r4, r6 corrupted
> - * r5 = proc_info pointer in physical address space
> - * r9 = cpuid (preserved)
> - */
> -__lookup_processor_type:
> - adr r3, 3f
> - ldmia r3, {r5 - r7}
> - add r3, r3, #8
> - sub r3, r3, r7 @ get offset between virt&phys
> - add r5, r5, r3 @ convert virt addresses to
> - add r6, r6, r3 @ physical address space
> -1: ldmia r5, {r3, r4} @ value, mask
> - and r4, r4, r9 @ mask wanted bits
> - teq r3, r4
> - beq 2f
> - add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list)
> - cmp r5, r6
> - blo 1b
> - mov r5, #0 @ unknown processor
> -2: mov pc, lr
> -ENDPROC(__lookup_processor_type)
> -
> -/*
> - * This provides a C-API version of the above function.
> + * This provides a C-API version of __lookup_processor_type
> */
> ENTRY(lookup_processor_type)
> - stmfd sp!, {r4 - r7, r9, lr}
> + stmfd sp!, {r4 - r6, r9, lr}
> mov r9, r0
> bl __lookup_processor_type
> mov r0, r5
> - ldmfd sp!, {r4 - r7, r9, pc}
> + ldmfd sp!, {r4 - r6, r9, pc}
> ENDPROC(lookup_processor_type)
>
> /*
> @@ -191,8 +160,6 @@ ENDPROC(lookup_processor_type)
> * more information about the __proc_info and __arch_info structures.
> */
> .align 2
> -3: .long __proc_info_begin
> - .long __proc_info_end
> 4: .long .
> .long __arch_info_begin
> .long __arch_info_end
> @@ -265,3 +232,45 @@ __vet_atags:
> 1: mov r2, #0
> mov pc, lr
> ENDPROC(__vet_atags)
> +
> +/*
> + * Read processor ID register (CP#15, CR0), and look up in the linker-built
> + * supported processor list. Note that we can't use the absolute addresses
> + * for the __proc_info lists since we aren't running with the MMU on
> + * (and therefore, we are not in the correct address space). We have to
> + * calculate the offset.
> + *
> + * r9 = cpuid
> + * Returns:
> + * r3, r4, r6 corrupted
> + * r5 = proc_info pointer in physical address space
> + * r9 = cpuid (preserved)
> + */
> + __CPUINIT
> +__lookup_processor_type:
> + adr r3, __lookup_processor_type_data
> + ldmia r3, {r4 - r6}
> + sub r3, r3, r4 @ get offset between virt&phys
> + add r5, r5, r3 @ convert virt addresses to
> + add r6, r6, r3 @ physical address space
> +1: ldmia r5, {r3, r4} @ value, mask
> + and r4, r4, r9 @ mask wanted bits
> + teq r3, r4
> + beq 2f
> + add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list)
> + cmp r5, r6
> + blo 1b
> + mov r5, #0 @ unknown processor
> +2: mov pc, lr
> +ENDPROC(__lookup_processor_type)
> +
> +/*
> + * Look in <asm/procinfo.h> for information about the __proc_info structure.
> + */
> + .align 2
> + .type __lookup_processor_type_data, %object
> +__lookup_processor_type_data:
> + .long .
> + .long __proc_info_begin
> + .long __proc_info_end
> + .size __lookup_processor_type_data, . - __lookup_processor_type_data
> diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
> index b16c079..1630524 100644
> --- a/arch/arm/kernel/vmlinux.lds.S
> +++ b/arch/arm/kernel/vmlinux.lds.S
> @@ -8,6 +8,19 @@
> #include <asm/memory.h>
> #include <asm/page.h>
>
> +#define PROC_INFO \
> + VMLINUX_SYMBOL(__proc_info_begin) = .; \
> + *(.proc.info.init) \
> + VMLINUX_SYMBOL(__proc_info_end) = .;
> +
> +#ifdef CONFIG_HOTPLUG_CPU
> +#define ARM_CPU_DISCARD(x)
> +#define ARM_CPU_KEEP(x) x
> +#else
> +#define ARM_CPU_DISCARD(x) x
> +#define ARM_CPU_KEEP(x)
> +#endif
> +
> OUTPUT_ARCH(arm)
> ENTRY(stext)
>
> @@ -31,9 +44,7 @@ SECTIONS
> HEAD_TEXT
> INIT_TEXT
> _einittext = .;
> - __proc_info_begin = .;
> - *(.proc.info.init)
> - __proc_info_end = .;
> + ARM_CPU_DISCARD(PROC_INFO)
> __arch_info_begin = .;
> *(.arch.info.init)
> __arch_info_end = .;
> @@ -68,10 +79,8 @@ SECTIONS
> /DISCARD/ : {
> *(.ARM.exidx.exit.text)
> *(.ARM.extab.exit.text)
> -#ifndef CONFIG_HOTPLUG_CPU
> - *(.ARM.exidx.cpuexit.text)
> - *(.ARM.extab.cpuexit.text)
> -#endif
> + ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
> + ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
> #ifndef CONFIG_HOTPLUG
> *(.ARM.exidx.devexit.text)
> *(.ARM.extab.devexit.text)
> @@ -100,6 +109,7 @@ SECTIONS
> *(.glue_7)
> *(.glue_7t)
> *(.got) /* Global offset table */
> + ARM_CPU_KEEP(PROC_INFO)
> }
>
> RO_DATA(PAGE_SIZE)
> diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S
> index 1a511e7..afc06b9 100644
> --- a/arch/arm/mm/proc-arm1020e.S
> +++ b/arch/arm/mm/proc-arm1020e.S
> @@ -412,7 +412,7 @@ ENTRY(cpu_arm1020e_set_pte_ext)
> #endif /* CONFIG_MMU */
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __arm1020e_setup, #function
> __arm1020e_setup:
> diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S
> index 1ffa4eb..8915e0b 100644
> --- a/arch/arm/mm/proc-arm1022.S
> +++ b/arch/arm/mm/proc-arm1022.S
> @@ -394,7 +394,7 @@ ENTRY(cpu_arm1022_set_pte_ext)
> #endif /* CONFIG_MMU */
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __arm1022_setup, #function
> __arm1022_setup:
> diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S
> index 5697c34..ff446c5 100644
> --- a/arch/arm/mm/proc-arm1026.S
> +++ b/arch/arm/mm/proc-arm1026.S
> @@ -384,7 +384,7 @@ ENTRY(cpu_arm1026_set_pte_ext)
> mov pc, lr
>
>
> - __INIT
> + __CPUINIT
>
> .type __arm1026_setup, #function
> __arm1026_setup:
> diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S
> index 64e0b32..6a7be18 100644
> --- a/arch/arm/mm/proc-arm6_7.S
> +++ b/arch/arm/mm/proc-arm6_7.S
> @@ -238,7 +238,7 @@ ENTRY(cpu_arm7_reset)
> mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc
> mov pc, r0
>
> - __INIT
> + __CPUINIT
>
> .type __arm6_setup, #function
> __arm6_setup: mov r0, #0
> diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S
> index 9d96824..c285395 100644
> --- a/arch/arm/mm/proc-arm720.S
> +++ b/arch/arm/mm/proc-arm720.S
> @@ -113,7 +113,7 @@ ENTRY(cpu_arm720_reset)
> mcr p15, 0, ip, c1, c0, 0 @ ctrl register
> mov pc, r0
>
> - __INIT
> + __CPUINIT
>
> .type __arm710_setup, #function
> __arm710_setup:
> diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S
> index 6c1a9ab..38b27dc 100644
> --- a/arch/arm/mm/proc-arm740.S
> +++ b/arch/arm/mm/proc-arm740.S
> @@ -55,7 +55,7 @@ ENTRY(cpu_arm740_reset)
> mcr p15, 0, ip, c1, c0, 0 @ ctrl register
> mov pc, r0
>
> - __INIT
> + __CPUINIT
>
> .type __arm740_setup, #function
> __arm740_setup:
> diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S
> index 6a850db..0c9786d 100644
> --- a/arch/arm/mm/proc-arm7tdmi.S
> +++ b/arch/arm/mm/proc-arm7tdmi.S
> @@ -46,7 +46,7 @@ ENTRY(cpu_arm7tdmi_proc_fin)
> ENTRY(cpu_arm7tdmi_reset)
> mov pc, r0
>
> - __INIT
> + __CPUINIT
>
> .type __arm7tdmi_setup, #function
> __arm7tdmi_setup:
> diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S
> index 86f80aa..fecf570 100644
> --- a/arch/arm/mm/proc-arm920.S
> +++ b/arch/arm/mm/proc-arm920.S
> @@ -375,7 +375,7 @@ ENTRY(cpu_arm920_set_pte_ext)
> #endif
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __arm920_setup, #function
> __arm920_setup:
> diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S
> index f76ce9b..e3cbf87 100644
> --- a/arch/arm/mm/proc-arm922.S
> +++ b/arch/arm/mm/proc-arm922.S
> @@ -379,7 +379,7 @@ ENTRY(cpu_arm922_set_pte_ext)
> #endif /* CONFIG_MMU */
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __arm922_setup, #function
> __arm922_setup:
> diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S
> index 657bd3f..572424c 100644
> --- a/arch/arm/mm/proc-arm925.S
> +++ b/arch/arm/mm/proc-arm925.S
> @@ -428,7 +428,7 @@ ENTRY(cpu_arm925_set_pte_ext)
> #endif /* CONFIG_MMU */
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __arm925_setup, #function
> __arm925_setup:
> diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S
> index 73f1f3c..63d168b 100644
> --- a/arch/arm/mm/proc-arm926.S
> +++ b/arch/arm/mm/proc-arm926.S
> @@ -389,7 +389,7 @@ ENTRY(cpu_arm926_set_pte_ext)
> #endif
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __arm926_setup, #function
> __arm926_setup:
> diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S
> index fffb061..f6a6282 100644
> --- a/arch/arm/mm/proc-arm940.S
> +++ b/arch/arm/mm/proc-arm940.S
> @@ -264,7 +264,7 @@ ENTRY(arm940_cache_fns)
> .long arm940_dma_unmap_area
> .long arm940_dma_flush_range
>
> - __INIT
> + __CPUINIT
>
> .type __arm940_setup, #function
> __arm940_setup:
> diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S
> index 249a605..ea2e7f2 100644
> --- a/arch/arm/mm/proc-arm946.S
> +++ b/arch/arm/mm/proc-arm946.S
> @@ -317,7 +317,7 @@ ENTRY(cpu_arm946_dcache_clean_area)
> mcr p15, 0, r0, c7, c10, 4 @ drain WB
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __arm946_setup, #function
> __arm946_setup:
> diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S
> index db47566..db67e31 100644
> --- a/arch/arm/mm/proc-arm9tdmi.S
> +++ b/arch/arm/mm/proc-arm9tdmi.S
> @@ -46,7 +46,7 @@ ENTRY(cpu_arm9tdmi_proc_fin)
> ENTRY(cpu_arm9tdmi_reset)
> mov pc, r0
>
> - __INIT
> + __CPUINIT
>
> .type __arm9tdmi_setup, #function
> __arm9tdmi_setup:
> diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S
> index 7803fdf..7c9ad62 100644
> --- a/arch/arm/mm/proc-fa526.S
> +++ b/arch/arm/mm/proc-fa526.S
> @@ -134,7 +134,7 @@ ENTRY(cpu_fa526_set_pte_ext)
> #endif
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __fa526_setup, #function
> __fa526_setup:
> diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S
> index b304d01..578da69 100644
> --- a/arch/arm/mm/proc-feroceon.S
> +++ b/arch/arm/mm/proc-feroceon.S
> @@ -494,7 +494,7 @@ ENTRY(cpu_feroceon_set_pte_ext)
> #endif
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __feroceon_setup, #function
> __feroceon_setup:
> diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S
> index 5f6892f..4458ee6 100644
> --- a/arch/arm/mm/proc-mohawk.S
> +++ b/arch/arm/mm/proc-mohawk.S
> @@ -338,7 +338,7 @@ ENTRY(cpu_mohawk_set_pte_ext)
> mcr p15, 0, r0, c7, c10, 4 @ drain WB
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __mohawk_setup, #function
> __mohawk_setup:
> diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S
> index a201eb0..5aa8d59 100644
> --- a/arch/arm/mm/proc-sa110.S
> +++ b/arch/arm/mm/proc-sa110.S
> @@ -156,7 +156,7 @@ ENTRY(cpu_sa110_set_pte_ext)
> #endif
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __sa110_setup, #function
> __sa110_setup:
> diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S
> index 7ddc480..2ac4e6f 100644
> --- a/arch/arm/mm/proc-sa1100.S
> +++ b/arch/arm/mm/proc-sa1100.S
> @@ -169,7 +169,7 @@ ENTRY(cpu_sa1100_set_pte_ext)
> #endif
> mov pc, lr
>
> - __INIT
> + __CPUINIT
>
> .type __sa1100_setup, #function
> __sa1100_setup:
> diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S
> index 22aac85..037d1a4 100644
> --- a/arch/arm/mm/proc-v6.S
> +++ b/arch/arm/mm/proc-v6.S
> @@ -137,7 +137,7 @@ cpu_pj4_name:
>
> .align
>
> - __INIT
> + __CPUINIT
>
> /*
> * __v6_setup
> @@ -192,6 +192,8 @@ __v6_setup:
> v6_crval:
> crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c
>
> + __INITDATA
> +
> .type v6_processor_functions, #object
> ENTRY(v6_processor_functions)
> .word v6_early_abort
> @@ -205,6 +207,8 @@ ENTRY(v6_processor_functions)
> .word cpu_v6_set_pte_ext
> .size v6_processor_functions, . - v6_processor_functions
>
> + .section ".rodata"
> +
> .type cpu_arch_name, #object
> cpu_arch_name:
> .asciz "armv6"
> diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
> index 6a8506d..cd15adb 100644
> --- a/arch/arm/mm/proc-v7.S
> +++ b/arch/arm/mm/proc-v7.S
> @@ -169,7 +169,7 @@ cpu_v7_name:
> .ascii "ARMv7 Processor"
> .align
>
> - __INIT
> + __CPUINIT
>
> /*
> * __v7_setup
> @@ -297,6 +297,8 @@ v7_crval:
> __v7_setup_stack:
> .space 4 * 11 @ 11 registers
>
> + __INITDATA
> +
> .type v7_processor_functions, #object
> ENTRY(v7_processor_functions)
> .word v7_early_abort
> @@ -310,6 +312,8 @@ ENTRY(v7_processor_functions)
> .word cpu_v7_set_pte_ext
> .size v7_processor_functions, . - v7_processor_functions
>
> + .section ".rodata"
> +
> .type cpu_arch_name, #object
> cpu_arch_name:
> .asciz "armv7"
> diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S
> index 361a51e..cad07e4 100644
> --- a/arch/arm/mm/proc-xsc3.S
> +++ b/arch/arm/mm/proc-xsc3.S
> @@ -404,7 +404,7 @@ ENTRY(cpu_xsc3_set_pte_ext)
>
> .align
>
> - __INIT
> + __CPUINIT
>
> .type __xsc3_setup, #function
> __xsc3_setup:
> diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S
> index 1407597..cb245ed 100644
> --- a/arch/arm/mm/proc-xscale.S
> +++ b/arch/arm/mm/proc-xscale.S
> @@ -506,7 +506,7 @@ ENTRY(cpu_xscale_set_pte_ext)
>
> .align
>
> - __INIT
> + __CPUINIT
>
> .type __xscale_setup, #function
> __xscale_setup:
>
Any reason you skipped proc-arm1020.S?
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
next prev parent reply other threads:[~2010-10-04 19:25 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-04 17:09 [PATCH 03/10] ARM: hotplug cpu: Keep processor information, startup code & __lookup_processor_type Russell King - ARM Linux
2010-10-04 19:25 ` Jeff Ohlstein [this message]
2010-10-04 19:30 ` Russell King - ARM Linux
2010-10-22 18:51 ` [PATCH] ARM: Fix data abort accessing proc_info from __lookup_processor_type (Re: [PATCH 03/10] ARM: hotplug cpu: Keep processor information, startup code & __lookup_processor_type) Tony Lindgren
2010-10-22 18:51 ` Tony Lindgren
2010-10-22 20:14 ` Anand Gadiyar
2010-10-22 20:14 ` Anand Gadiyar
2010-10-23 8:30 ` Russell King - ARM Linux
2010-10-23 8:30 ` Russell King - ARM Linux
2010-10-23 18:18 ` Tony Lindgren
2010-10-23 18:18 ` Tony Lindgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CAA2A2F.7010901@codeaurora.org \
--to=johlstei@codeaurora.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.