[U-Boot] [PATCH 1/2] arm64: add an option to switch visibility of CONFIG_SYS_INIT_SP_BSS_OFFSET

AKASHI Takahiro takahiro.akashi at linaro.org
Thu Jun 27 00:45:16 UTC 2019


Yamada-san,

On Wed, Jun 26, 2019 at 01:51:46PM +0900, Masahiro Yamada wrote:
> By default, CONFIG_SYS_INIT_SP_BSS_OFFSET was made invisible by not
> giving a prompt to it.
> 
> The only way to define it is to hard-code an extra entry in SoC/board
> Kconfig, like arch/arm/mach-tegra/tegra{186,210}/Kconfig.
> 
> Add a prompt to it in order to allow defconfig files to specify the
> value of CONFIG_SYS_INIT_SP_BSS_OFFSET.
> 
> With this, CONFIG_SYS_INIT_SP_BSS_OFFSET would become always visible.
> So, we need a new bool option to turn it off by default.
> 
> I move the 'default 524288' to the common place. This value is not too
> big, but is big enough to avoid the overwrap of DT in most platforms.
> If 512KB is not a suitable choice for your platform, you can change it
> from your defconfig or menuconfig etc.
> 
> Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>
> ---
> 
> Perhaps, another idea is to use "offset from TEXT_BASE",
> allowing a negative offset value.
> 
> For example, include/configs/uniphier.h defines:
> 
>   #define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_TEXT_BASE)
> 
> My intention is, allocate the early stack _before_ the U-Boot binary,
> not after it.
> 
> With this, I do not need to care about the region conflict with
> other sections.
> 
> The disadvantage of this approach is, you cannot load U-Boot
> to the very start of the memory.
> 
> Just an idea.
> 
> 
>  Makefile                                      |  4 ++--
>  arch/arm/Kconfig                              | 20 ++++++++++++++-----
>  .../armv8/linux-kernel-image-header-vars.h    |  2 +-
>  arch/arm/lib/crt0_64.S                        |  2 +-
>  arch/arm/mach-tegra/Kconfig                   |  1 +
>  arch/arm/mach-tegra/tegra186/Kconfig          |  3 ---
>  arch/arm/mach-tegra/tegra210/Kconfig          |  3 ---
>  7 files changed, 20 insertions(+), 15 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 6335834d12e1..9a5afd3098ce 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -874,7 +874,7 @@ ifneq ($(CONFIG_BUILD_TARGET),)
>  ALL-y += $(CONFIG_BUILD_TARGET:"%"=%)
>  endif
>  
> -ifneq ($(CONFIG_SYS_INIT_SP_BSS_OFFSET),)
> +ifdef CONFIG_INIT_SP_RELATIVE
>  ALL-y += init_sp_bss_offset_check

This config/target will create a dependency of u-boot.dtb target,
and it will cause an error in building dtbs for qemu_arm64
which doesn't expect any dtb. You will see messages like:
>>>
Device Tree Source is not correctly specified.
Please define 'CONFIG_DEFAULT_DEVICE_TREE'
or build with 'DEVICE_TREE=<device_tree>' argument

/home/akashi/arm/armv8/linaro/u-boot/dts/Makefile:28: recipe for target 'arch/arm/dts/unset.dtb' failed
make[2]: *** [arch/arm/dts/unset.dtb] Error 1
/home/akashi/arm/armv8/linaro/u-boot/Makefile:1052: recipe for target 'dts/dt.dtb' failed
make[1]: *** [dts/dt.dtb] Error 2
<<<

-Takahiro Akashi


>  endif
>  
> @@ -1155,7 +1155,7 @@ binary_size_check: u-boot-nodtb.bin FORCE
>  		fi \
>  	fi
>  
> -ifneq ($(CONFIG_SYS_INIT_SP_BSS_OFFSET),)
> +ifdef CONFIG_INIT_SP_RELATIVE
>  ifneq ($(CONFIG_SYS_MALLOC_F_LEN),)
>  subtract_sys_malloc_f_len = space=$$(($${space} - $(CONFIG_SYS_MALLOC_F_LEN)))
>  else
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index f5a7630e4f99..87541977259c 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -20,15 +20,25 @@ config POSITION_INDEPENDENT
>  	  information that is embedded into the binary to support U-Boot
>  	  relocating itself to the top-of-RAM later during execution.
>  
> -config SYS_INIT_SP_BSS_OFFSET
> -	int
> +config INIT_SP_RELATIVE
> +	bool "Specify the early stack pointer relative to the .bss section"
>  	help
>  	  U-Boot typically uses a hard-coded value for the stack pointer
> -	  before relocation. Define this option to instead calculate the
> +	  before relocation. Enable this option to instead calculate the
>  	  initial SP at run-time. This is useful to avoid hard-coding addresses
>  	  into U-Boot, so that can be loaded and executed at arbitrary
> -	  addresses and thus avoid using arbitrary addresses at runtime. This
> -	  option's value is the offset added to &_bss_start in order to
> +	  addresses and thus avoid using arbitrary addresses at runtime.
> +
> +	  If this option is enabled, the early stack pointer is set to
> +	  &_bss_start with a offset value added. The offset is specified by
> +	  SYS_INIT_SP_BSS_OFFSET.
> +
> +config SYS_INIT_SP_BSS_OFFSET
> +	int "Early stack offset from the .bss base address"
> +	depends on INIT_SP_RELATIVE
> +	default 524288
> +	help
> +	  This option's value is the offset added to &_bss_start in order to
>  	  calculate the stack pointer. This offset should be large enough so
>  	  that the early malloc region, global data (gd), and early stack usage
>  	  do not overlap any appended DTB.
> diff --git a/arch/arm/cpu/armv8/linux-kernel-image-header-vars.h b/arch/arm/cpu/armv8/linux-kernel-image-header-vars.h
> index fa6e86d1c24b..b4220e4936f0 100644
> --- a/arch/arm/cpu/armv8/linux-kernel-image-header-vars.h
> +++ b/arch/arm/cpu/armv8/linux-kernel-image-header-vars.h
> @@ -48,7 +48,7 @@
>  #define __MAX(a, b)		(((a) > (b)) ? (a) : (b))
>  #define __CODE_DATA_SIZE	(__bss_start - _start)
>  #define __BSS_SIZE		(__bss_end - __bss_start)
> -#ifdef CONFIG_SYS_INIT_SP_BSS_OFFSET
> +#ifdef CONFIG_INIT_SP_RELATIVE
>  #define __MAX_EXTRA_RAM_USAGE	__MAX(__BSS_SIZE, CONFIG_SYS_INIT_SP_BSS_OFFSET)
>  #else
>  #define __MAX_EXTRA_RAM_USAGE	__BSS_SIZE
> diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S
> index d6b632aa87d1..e76b25a03e8c 100644
> --- a/arch/arm/lib/crt0_64.S
> +++ b/arch/arm/lib/crt0_64.S
> @@ -72,7 +72,7 @@ ENTRY(_main)
>  	ldr	x0, =(CONFIG_TPL_STACK)
>  #elif defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
>  	ldr	x0, =(CONFIG_SPL_STACK)
> -#elif defined(CONFIG_SYS_INIT_SP_BSS_OFFSET)
> +#elif defined(CONFIG_INIT_SP_RELATIVE)
>  	adr	x0, __bss_start
>  	add	x0, x0, #CONFIG_SYS_INIT_SP_BSS_OFFSET
>  #else
> diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
> index 97e22ead5985..ff9f29f2d5d0 100644
> --- a/arch/arm/mach-tegra/Kconfig
> +++ b/arch/arm/mach-tegra/Kconfig
> @@ -86,6 +86,7 @@ config TEGRA_ARMV7_COMMON
>  config TEGRA_ARMV8_COMMON
>  	bool "Tegra 64-bit common options"
>  	select ARM64
> +	select INIT_SP_RELATIVE
>  	select LINUX_KERNEL_IMAGE_HEADER
>  	select POSITION_INDEPENDENT
>  	select TEGRA_COMMON
> diff --git a/arch/arm/mach-tegra/tegra186/Kconfig b/arch/arm/mach-tegra/tegra186/Kconfig
> index 479c0955eec6..b2e53b58caf8 100644
> --- a/arch/arm/mach-tegra/tegra186/Kconfig
> +++ b/arch/arm/mach-tegra/tegra186/Kconfig
> @@ -21,9 +21,6 @@ endchoice
>  config SYS_SOC
>  	default "tegra186"
>  
> -config SYS_INIT_SP_BSS_OFFSET
> -	default 524288
> -
>  source "board/nvidia/p2771-0000/Kconfig"
>  
>  endif
> diff --git a/arch/arm/mach-tegra/tegra210/Kconfig b/arch/arm/mach-tegra/tegra210/Kconfig
> index 250738aed312..3637473051b8 100644
> --- a/arch/arm/mach-tegra/tegra210/Kconfig
> +++ b/arch/arm/mach-tegra/tegra210/Kconfig
> @@ -40,9 +40,6 @@ endchoice
>  config SYS_SOC
>  	default "tegra210"
>  
> -config SYS_INIT_SP_BSS_OFFSET
> -	default 524288
> -
>  source "board/nvidia/e2220-1170/Kconfig"
>  source "board/nvidia/p2371-0000/Kconfig"
>  source "board/nvidia/p2371-2180/Kconfig"
> -- 
> 2.17.1
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot


More information about the U-Boot mailing list