spl: fix stack usage check if gd is not initialized
authorSimon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Mon, 11 Nov 2019 21:30:46 +0000 (22:30 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 10 Jan 2020 15:25:13 +0000 (10:25 -0500)
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 <simon.k.r.goldschmidt@gmail.com>
common/init/board_init.c

index e52106966d49ba308c0e930dc86eb6e0d18677ab..3bc7994586cf561b7353c835ec395b63e2b876a0 100644 (file)
@@ -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);