From c82abaa5d63f5259fd64c59bd70010310b4c4e4b Mon Sep 17 00:00:00 2001 From: Simon Goldschmidt Date: Mon, 11 Nov 2019 22:30:46 +0100 Subject: [PATCH] spl: fix stack usage check if gd is not initialized Most platforms do not set up gd->start_addr_sp in SPL. Since this is required for CONFIG_SPL_SYS_REPORT_SACK_F_USAGE to work correctly, set up gd->start_addr_sp in SPL to the value passed to board_init_f_init_reserve if it is not set yet. Fixes: d8c0332031 ("spl: implement stack usage check") Signed-off-by: Simon Goldschmidt --- common/init/board_init.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/common/init/board_init.c b/common/init/board_init.c index e52106966d..3bc7994586 100644 --- a/common/init/board_init.c +++ b/common/init/board_init.c @@ -18,6 +18,19 @@ __weak void arch_setup_gd(struct global_data *gd_ptr) } #endif /* !CONFIG_X86 && !CONFIG_ARM */ +/** + * This function is called from board_init_f_init_reserve to set up + * gd->start_addr_sp for stack protection if not already set otherwise + */ +__weak void board_init_f_init_stack_protection_addr(ulong base) +{ +#if CONFIG_IS_ENABLED(SYS_REPORT_STACK_F_USAGE) + /* set up stack pointer for stack usage if not set yet */ + if (!gd->start_addr_sp) + gd->start_addr_sp = base; +#endif +} + /** * This function is called after the position of the initial stack is * determined in gd->start_addr_sp. Boards can override it to set up @@ -129,6 +142,10 @@ void board_init_f_init_reserve(ulong base) #if !defined(CONFIG_ARM) arch_setup_gd(gd_ptr); #endif + + if (CONFIG_IS_ENABLED(SYS_REPORT_STACK_F_USAGE)) + board_init_f_init_stack_protection_addr(base); + /* next alloc will be higher by one GD plus 16-byte alignment */ base += roundup(sizeof(struct global_data), 16); -- 2.25.1