All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] arm64: head.S cleanup
@ 2015-03-04 11:23 Ard Biesheuvel
  2015-03-04 11:23 ` [PATCH v2 1/3] arm64: remove processor_id Ard Biesheuvel
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Ard Biesheuvel @ 2015-03-04 11:23 UTC (permalink / raw)
  To: linux-arm-kernel

This some janitorial work on head.S, just stuff I noticed when making
changes to it for other reasons.

Some may find the churn pointless, but my opinion is that .S files -if they
cannot be avoided in the first place- should be as simple and straightforward
as possible.

Ard Biesheuvel (3):
  arm64: remove processor_id
  arm64: remove __switch_data object from head.S
  arm64: remove __lookup_processor_type_data, object from head.S

 arch/arm64/kernel/head.S  | 58 ++++++++++++++---------------------------------
 arch/arm64/kernel/setup.c |  3 ---
 2 files changed, 17 insertions(+), 44 deletions(-)

-- 
1.8.3.2

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/3] arm64: remove processor_id
  2015-03-04 11:23 [PATCH v2 0/3] arm64: head.S cleanup Ard Biesheuvel
@ 2015-03-04 11:23 ` Ard Biesheuvel
  2015-03-04 11:57   ` Mark Rutland
  2015-03-04 18:08   ` Catalin Marinas
  2015-03-04 11:23 ` [PATCH v2 2/3] arm64: remove __switch_data object from head.S Ard Biesheuvel
  2015-03-04 11:23 ` [PATCH v2 3/3] arm64: remove __lookup_processor_type_data " Ard Biesheuvel
  2 siblings, 2 replies; 8+ messages in thread
From: Ard Biesheuvel @ 2015-03-04 11:23 UTC (permalink / raw)
  To: linux-arm-kernel

The global processor_id is assigned the MIDR_EL1 value of the boot
CPU in the early init code, but is never referenced afterwards.

So remove it.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 arch/arm64/kernel/head.S  | 10 +++-------
 arch/arm64/kernel/setup.c |  3 ---
 2 files changed, 3 insertions(+), 10 deletions(-)

diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 8ce88e08c030..003db2eadd7a 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -244,8 +244,7 @@ ENTRY(stext)
 	bl	el2_setup			// Drop to EL1, w20=cpu_boot_mode
 	bl	__calc_phys_offset		// x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET
 	bl	set_cpu_boot_mode_flag
-	mrs	x22, midr_el1			// x22=cpuid
-	mov	x0, x22
+	mrs	x0, midr_el1
 	bl	lookup_processor_type
 	mov	x23, x0				// x23=current cpu_table
 	/*
@@ -439,7 +438,6 @@ __switch_data:
 	.quad	__mmap_switched
 	.quad	__bss_start			// x6
 	.quad	__bss_stop			// x7
-	.quad	processor_id			// x4
 	.quad	__fdt_pointer			// x5
 	.quad	memstart_addr			// x6
 	.quad	init_thread_union + THREAD_START_SP // sp
@@ -457,11 +455,10 @@ __mmap_switched:
 	str	xzr, [x6], #8			// Clear BSS
 	b	1b
 2:
-	ldp	x4, x5, [x3], #16
+	ldr	x5, [x3], #8
 	ldr	x6, [x3], #8
 	ldr	x16, [x3]
 	mov	sp, x16
-	str	x22, [x4]			// Save processor ID
 	str	x21, [x5]			// Save FDT pointer
 	str	x24, [x6]			// Save PHYS_OFFSET
 	mov	x29, #0
@@ -633,8 +630,7 @@ ENTRY(secondary_startup)
 	/*
 	 * Common entry point for secondary CPUs.
 	 */
-	mrs	x22, midr_el1			// x22=cpuid
-	mov	x0, x22
+	mrs	x0, midr_el1
 	bl	lookup_processor_type
 	mov	x23, x0				// x23=current cpu_table
 	cbz	x23, __error_p			// invalid processor (x23=0)?
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index e8420f635bd4..8b82ef19b81b 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -63,9 +63,6 @@
 #include <asm/psci.h>
 #include <asm/efi.h>
 
-unsigned int processor_id;
-EXPORT_SYMBOL(processor_id);
-
 unsigned long elf_hwcap __read_mostly;
 EXPORT_SYMBOL_GPL(elf_hwcap);
 
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/3] arm64: remove __switch_data object from head.S
  2015-03-04 11:23 [PATCH v2 0/3] arm64: head.S cleanup Ard Biesheuvel
  2015-03-04 11:23 ` [PATCH v2 1/3] arm64: remove processor_id Ard Biesheuvel
@ 2015-03-04 11:23 ` Ard Biesheuvel
  2015-03-04 18:08   ` Catalin Marinas
  2015-03-04 11:23 ` [PATCH v2 3/3] arm64: remove __lookup_processor_type_data " Ard Biesheuvel
  2 siblings, 1 reply; 8+ messages in thread
From: Ard Biesheuvel @ 2015-03-04 11:23 UTC (permalink / raw)
  To: linux-arm-kernel

This removes the confusing __switch_data object from head.S,
and replaces it with standard PC-relative references to the
various symbols it encapsulates.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 arch/arm64/kernel/head.S | 34 +++++++++++++---------------------
 1 file changed, 13 insertions(+), 21 deletions(-)

diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 003db2eadd7a..e6216b56257a 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -263,7 +263,7 @@ ENTRY(stext)
 	 * On return, the CPU will be ready for the MMU to be turned on and
 	 * the TCR will have been set.
 	 */
-	ldr	x27, __switch_data		// address to jump to after
+	ldr	x27, =__mmap_switched		// address to jump to after
 						// MMU has been enabled
 	adrp	lr, __enable_mmu		// return (PIC) address
 	add	lr, lr, #:lo12:__enable_mmu
@@ -432,35 +432,27 @@ __create_page_tables:
 ENDPROC(__create_page_tables)
 	.ltorg
 
-	.align	3
-	.type	__switch_data, %object
-__switch_data:
-	.quad	__mmap_switched
-	.quad	__bss_start			// x6
-	.quad	__bss_stop			// x7
-	.quad	__fdt_pointer			// x5
-	.quad	memstart_addr			// x6
-	.quad	init_thread_union + THREAD_START_SP // sp
-
 /*
- * The following fragment of code is executed with the MMU on in MMU mode, and
- * uses absolute addresses; this is not position independent.
+ * The following fragment of code is executed with the MMU enabled.
  */
+	.set	initial_sp, init_thread_union + THREAD_START_SP
 __mmap_switched:
-	adr	x3, __switch_data + 8
+	adrp	x6, __bss_start
+	adrp	x7, __bss_stop
+	add	x6, x6, :lo12:__bss_start
+	add	x7, x7, :lo12:__bss_stop
 
-	ldp	x6, x7, [x3], #16
 1:	cmp	x6, x7
 	b.hs	2f
 	str	xzr, [x6], #8			// Clear BSS
 	b	1b
 2:
-	ldr	x5, [x3], #8
-	ldr	x6, [x3], #8
-	ldr	x16, [x3]
-	mov	sp, x16
-	str	x21, [x5]			// Save FDT pointer
-	str	x24, [x6]			// Save PHYS_OFFSET
+	adrp	x4, initial_sp
+	adrp	x5, __fdt_pointer
+	adrp	x6, memstart_addr
+	add	sp, x4, :lo12:initial_sp
+	str	x21, [x5, :lo12:__fdt_pointer]	// Save FDT pointer
+	str	x24, [x6, :lo12:memstart_addr]	// Save PHYS_OFFSET
 	mov	x29, #0
 	b	start_kernel
 ENDPROC(__mmap_switched)
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 3/3] arm64: remove __lookup_processor_type_data object from head.S
  2015-03-04 11:23 [PATCH v2 0/3] arm64: head.S cleanup Ard Biesheuvel
  2015-03-04 11:23 ` [PATCH v2 1/3] arm64: remove processor_id Ard Biesheuvel
  2015-03-04 11:23 ` [PATCH v2 2/3] arm64: remove __switch_data object from head.S Ard Biesheuvel
@ 2015-03-04 11:23 ` Ard Biesheuvel
  2015-03-04 18:09   ` Catalin Marinas
  2 siblings, 1 reply; 8+ messages in thread
From: Ard Biesheuvel @ 2015-03-04 11:23 UTC (permalink / raw)
  To: linux-arm-kernel

This removes __lookup_processor_type_data, replacing the original
use with a simple PC-relative address load.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 arch/arm64/kernel/head.S | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index e6216b56257a..89444070f96b 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -714,15 +714,10 @@ ENDPROC(__error)
  * This function gets the processor ID in w0 and searches the cpu_table[] for
  * a match. It returns a pointer to the struct cpu_info it found. The
  * cpu_table[] must end with an empty (all zeros) structure.
- *
- * This routine can be called via C code and it needs to work with the MMU
- * both disabled and enabled (the offset is calculated automatically).
  */
 ENTRY(lookup_processor_type)
-	adr	x1, __lookup_processor_type_data
-	ldp	x2, x3, [x1]
-	sub	x1, x1, x2			// get offset between VA and PA
-	add	x3, x3, x1			// convert VA to PA
+	adrp	x3, cpu_table
+	add	x3, x3, :lo12:cpu_table
 1:
 	ldp	w5, w6, [x3]			// load cpu_id_val and cpu_id_mask
 	cbz	w5, 2f				// end of list?
@@ -737,10 +732,3 @@ ENTRY(lookup_processor_type)
 	mov	x0, x3
 	ret
 ENDPROC(lookup_processor_type)
-
-	.align	3
-	.type	__lookup_processor_type_data, %object
-__lookup_processor_type_data:
-	.quad	.
-	.quad	cpu_table
-	.size	__lookup_processor_type_data, . - __lookup_processor_type_data
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 1/3] arm64: remove processor_id
  2015-03-04 11:23 ` [PATCH v2 1/3] arm64: remove processor_id Ard Biesheuvel
@ 2015-03-04 11:57   ` Mark Rutland
  2015-03-04 18:08   ` Catalin Marinas
  1 sibling, 0 replies; 8+ messages in thread
From: Mark Rutland @ 2015-03-04 11:57 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Ard,

On Wed, Mar 04, 2015 at 11:23:15AM +0000, Ard Biesheuvel wrote:
> The global processor_id is assigned the MIDR_EL1 value of the boot
> CPU in the early init code, but is never referenced afterwards.

I think it's also worth noting that it's also non-sensical and
misleading for big.LITTLE systems, and getting rid of it removes the
potential for confusion.

> So remove it.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
>  arch/arm64/kernel/head.S  | 10 +++-------
>  arch/arm64/kernel/setup.c |  3 ---
>  2 files changed, 3 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index 8ce88e08c030..003db2eadd7a 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -244,8 +244,7 @@ ENTRY(stext)
>  	bl	el2_setup			// Drop to EL1, w20=cpu_boot_mode
>  	bl	__calc_phys_offset		// x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET
>  	bl	set_cpu_boot_mode_flag
> -	mrs	x22, midr_el1			// x22=cpuid
> -	mov	x0, x22
> +	mrs	x0, midr_el1
>  	bl	lookup_processor_type
>  	mov	x23, x0				// x23=current cpu_table
>  	/*
> @@ -439,7 +438,6 @@ __switch_data:
>  	.quad	__mmap_switched
>  	.quad	__bss_start			// x6
>  	.quad	__bss_stop			// x7
> -	.quad	processor_id			// x4
>  	.quad	__fdt_pointer			// x5
>  	.quad	memstart_addr			// x6
>  	.quad	init_thread_union + THREAD_START_SP // sp
> @@ -457,11 +455,10 @@ __mmap_switched:
>  	str	xzr, [x6], #8			// Clear BSS
>  	b	1b
>  2:
> -	ldp	x4, x5, [x3], #16
> +	ldr	x5, [x3], #8
>  	ldr	x6, [x3], #8

Here it would be possible to instead do:

-	ldp	x4, x5, [x3], #16
+	ldp	x5, x6, [x3], #16
-	ldr	x6, [x3], #8

But given this will change in a later patch anyway I guess it doesn't
matter either way.

Other that those comments, the patch looks good to me:

Reviewed-by: Mark Rutland <mark.rutland@arm.com>

Mark.

>  	ldr	x16, [x3]
>  	mov	sp, x16
> -	str	x22, [x4]			// Save processor ID
>  	str	x21, [x5]			// Save FDT pointer
>  	str	x24, [x6]			// Save PHYS_OFFSET
>  	mov	x29, #0
> @@ -633,8 +630,7 @@ ENTRY(secondary_startup)
>  	/*
>  	 * Common entry point for secondary CPUs.
>  	 */
> -	mrs	x22, midr_el1			// x22=cpuid
> -	mov	x0, x22
> +	mrs	x0, midr_el1
>  	bl	lookup_processor_type
>  	mov	x23, x0				// x23=current cpu_table
>  	cbz	x23, __error_p			// invalid processor (x23=0)?
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index e8420f635bd4..8b82ef19b81b 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -63,9 +63,6 @@
>  #include <asm/psci.h>
>  #include <asm/efi.h>
>  
> -unsigned int processor_id;
> -EXPORT_SYMBOL(processor_id);
> -
>  unsigned long elf_hwcap __read_mostly;
>  EXPORT_SYMBOL_GPL(elf_hwcap);
>  
> -- 
> 1.8.3.2
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/3] arm64: remove processor_id
  2015-03-04 11:23 ` [PATCH v2 1/3] arm64: remove processor_id Ard Biesheuvel
  2015-03-04 11:57   ` Mark Rutland
@ 2015-03-04 18:08   ` Catalin Marinas
  1 sibling, 0 replies; 8+ messages in thread
From: Catalin Marinas @ 2015-03-04 18:08 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Mar 04, 2015 at 12:23:15PM +0100, Ard Biesheuvel wrote:
> The global processor_id is assigned the MIDR_EL1 value of the boot
> CPU in the early init code, but is never referenced afterwards.
> 
> So remove it.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 2/3] arm64: remove __switch_data object from head.S
  2015-03-04 11:23 ` [PATCH v2 2/3] arm64: remove __switch_data object from head.S Ard Biesheuvel
@ 2015-03-04 18:08   ` Catalin Marinas
  0 siblings, 0 replies; 8+ messages in thread
From: Catalin Marinas @ 2015-03-04 18:08 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Mar 04, 2015 at 12:23:16PM +0100, Ard Biesheuvel wrote:
> This removes the confusing __switch_data object from head.S,
> and replaces it with standard PC-relative references to the
> various symbols it encapsulates.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 3/3] arm64: remove __lookup_processor_type_data object from head.S
  2015-03-04 11:23 ` [PATCH v2 3/3] arm64: remove __lookup_processor_type_data " Ard Biesheuvel
@ 2015-03-04 18:09   ` Catalin Marinas
  0 siblings, 0 replies; 8+ messages in thread
From: Catalin Marinas @ 2015-03-04 18:09 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Mar 04, 2015 at 12:23:17PM +0100, Ard Biesheuvel wrote:
> This removes __lookup_processor_type_data, replacing the original
> use with a simple PC-relative address load.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

>  ENTRY(lookup_processor_type)
> -	adr	x1, __lookup_processor_type_data
> -	ldp	x2, x3, [x1]
> -	sub	x1, x1, x2			// get offset between VA and PA
> -	add	x3, x3, x1			// convert VA to PA
> +	adrp	x3, cpu_table
> +	add	x3, x3, :lo12:cpu_table

I wonder whether we should add a macro for these two instructions, it's
becoming a common pattern.

-- 
Catalin

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-03-04 18:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-04 11:23 [PATCH v2 0/3] arm64: head.S cleanup Ard Biesheuvel
2015-03-04 11:23 ` [PATCH v2 1/3] arm64: remove processor_id Ard Biesheuvel
2015-03-04 11:57   ` Mark Rutland
2015-03-04 18:08   ` Catalin Marinas
2015-03-04 11:23 ` [PATCH v2 2/3] arm64: remove __switch_data object from head.S Ard Biesheuvel
2015-03-04 18:08   ` Catalin Marinas
2015-03-04 11:23 ` [PATCH v2 3/3] arm64: remove __lookup_processor_type_data " Ard Biesheuvel
2015-03-04 18:09   ` Catalin Marinas

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.