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

AKASHI Takahiro
2019-06-27T00:45:16Z

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@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