[PATCH 2/8] arm64/kernel: reuse boot_args array to get to __fdt_pointer

James Morse james.morse at arm.com
Mon Apr 4 08:13:58 PDT 2016


Hi Ard,

On 04/04/16 15:52, Ard Biesheuvel wrote:
> Since we record the boot_args [x0 .. x3] early at boot anyway, there is
> no need to keep the FDT address in a callee saved register with file scope
> in head.S. So simply refer to boot_args[0] directly in the call to
> setup_machine(), and drop the handling of x21 from head.S entirely.

Won't this break Big Endian?
(or more accurately: bootloader-endian != kernel-endian)

The stores in preserve_boot_args happen before the EE/E0E bits have been
set/cleared by el2_setup(), so they happen with boot-loader:endianness. The
loads after el2_setup() happen with kernel:endianness.


Thanks,

James


> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
> ---
>  arch/arm64/kernel/head.S  | 14 ++++++--------
>  arch/arm64/kernel/setup.c |  4 +---
>  2 files changed, 7 insertions(+), 11 deletions(-)
> 
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index 69b33535911e..9d8f928c355c 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -234,16 +234,15 @@ ENDPROC(stext)
>   * Preserve the arguments passed by the bootloader in x0 .. x3
>   */
>  preserve_boot_args:
> -	mov	x21, x0				// x21=FDT
> -
> -	adr_l	x0, boot_args			// record the contents of
> -	stp	x21, x1, [x0]			// x0 .. x3 at kernel entry
> -	stp	x2, x3, [x0, #16]
> +	adr_l	x4, boot_args			// record the contents of
> +	stp	x0, x1, [x4]			// x0 .. x3 at kernel entry
> +	stp	x2, x3, [x4, #16]
>  
>  	dmb	sy				// needed before dc ivac with
>  						// MMU off
>  
> -	add	x1, x0, #0x20			// 4 x 8 bytes
> +	mov	x0, x4
> +	add	x1, x4, #0x20			// 4 x 8 bytes
>  	b	__inval_cache_range		// tail call
>  ENDPROC(preserve_boot_args)
>  
> @@ -480,7 +479,6 @@ __mmap_switched:
>  	mov	x4, sp
>  	and	x4, x4, #~(THREAD_SIZE - 1)
>  	msr	sp_el0, x4			// Save thread_info
> -	str_l	x21, __fdt_pointer, x5		// Save FDT pointer
>  
>  	ldr_l	x4, kimage_vaddr		// Save the offset between
>  	sub	x4, x4, x24			// the kernel virtual and
> @@ -492,7 +490,7 @@ __mmap_switched:
>  #endif
>  #ifdef CONFIG_RANDOMIZE_BASE
>  	cbnz	x23, 0f				// already running randomized?
> -	mov	x0, x21				// pass FDT address in x0
> +	ldr_l	x0, boot_args			// pass FDT address in x0
>  	bl	kaslr_early_init		// parse FDT for KASLR options
>  	cbz	x0, 0f				// KASLR disabled? just proceed
>  	mov	x23, x0				// record KASLR offset
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index 9dc67769b6a4..83a3e484a90a 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -64,8 +64,6 @@
>  #include <asm/xen/hypervisor.h>
>  #include <asm/mmu_context.h>
>  
> -phys_addr_t __fdt_pointer __initdata;
> -
>  /*
>   * Standard memory resources
>   */
> @@ -304,7 +302,7 @@ void __init setup_arch(char **cmdline_p)
>  	early_fixmap_init();
>  	early_ioremap_init();
>  
> -	setup_machine_fdt(__fdt_pointer);
> +	setup_machine_fdt(boot_args[0]);
>  
>  	parse_early_param();
>  
> 




More information about the linux-arm-kernel mailing list