[PATCH 03/10] ARM: hotplug cpu: Keep processor information, startup code & __lookup_processor_type

Jeff Ohlstein johlstei at codeaurora.org
Mon Oct 4 15:25:35 EDT 2010


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 at 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.




More information about the linux-arm-kernel mailing list