Functions were kept naked because they modify the stack pointer. We can hoist that up and change the board-provided entry point to be non-naked to be more robust in face of unexpected compiler optimizations. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- .../boards/microchip-ksz9477-evb/lowlevel.c | 6 ++---- arch/arm/boards/sama5d27-giantboard/lowlevel.c | 4 ++-- arch/arm/boards/sama5d27-som1/lowlevel.c | 4 ++-- arch/arm/boards/sama5d3_xplained/lowlevel.c | 6 ++---- arch/arm/mach-at91/include/mach/barebox-arm.h | 18 ++++++++++++++---- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c b/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c index 93ae4819750c..6290766caa78 100644 --- a/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c +++ b/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c @@ -32,7 +32,7 @@ static void dbgu_init(void) putc_ll('>'); } -SAMA5_ENTRY_FUNCTION(start_sama5d3_xplained_ung8071_xload_mmc, r4) +SAMA5D3_ENTRY_FUNCTION(start_sama5d3_xplained_ung8071_xload_mmc, r4) { sama5d3_lowlevel_init(); @@ -49,12 +49,10 @@ SAMA5_ENTRY_FUNCTION(start_sama5d3_xplained_ung8071_xload_mmc, r4) extern char __dtb_z_at91_microchip_ksz9477_evb_start[]; -SAMA5_ENTRY_FUNCTION(start_sama5d3_xplained_ung8071, r4) +SAMA5D3_ENTRY_FUNCTION(start_sama5d3_xplained_ung8071, r4) { void *fdt; - arm_setup_stack(SAMA5D3_SRAM_BASE + SAMA5D3_SRAM_SIZE); - if (IS_ENABLED(CONFIG_DEBUG_LL)) dbgu_init(); diff --git a/arch/arm/boards/sama5d27-giantboard/lowlevel.c b/arch/arm/boards/sama5d27-giantboard/lowlevel.c index ee8297fa4562..fac39dd066a2 100644 --- a/arch/arm/boards/sama5d27-giantboard/lowlevel.c +++ b/arch/arm/boards/sama5d27-giantboard/lowlevel.c @@ -15,7 +15,7 @@ /* PCK = 492MHz, MCK = 164MHz */ #define MASTER_CLOCK 164000000 -SAMA5_ENTRY_FUNCTION(start_sama5d27_giantboard_xload_mmc, r4) +SAMA5D2_ENTRY_FUNCTION(start_sama5d27_giantboard_xload_mmc, r4) { void __iomem *dbgu_base; @@ -36,7 +36,7 @@ SAMA5_ENTRY_FUNCTION(start_sama5d27_giantboard_xload_mmc, r4) extern char __dtb_z_at91_sama5d27_giantboard_start[]; -SAMA5_ENTRY_FUNCTION(start_sama5d27_giantboard, r4) +SAMA5D2_ENTRY_FUNCTION(start_sama5d27_giantboard, r4) { void *fdt; diff --git a/arch/arm/boards/sama5d27-som1/lowlevel.c b/arch/arm/boards/sama5d27-som1/lowlevel.c index b0937119184b..24c08d9722b3 100644 --- a/arch/arm/boards/sama5d27-som1/lowlevel.c +++ b/arch/arm/boards/sama5d27-som1/lowlevel.c @@ -39,7 +39,7 @@ static void ek_turn_led(unsigned color) } } -SAMA5_ENTRY_FUNCTION(start_sama5d27_som1_ek_xload_mmc, r4) +SAMA5D2_ENTRY_FUNCTION(start_sama5d27_som1_ek_xload_mmc, r4) { void __iomem *dbgu_base; sama5d2_lowlevel_init(); @@ -60,7 +60,7 @@ SAMA5_ENTRY_FUNCTION(start_sama5d27_som1_ek_xload_mmc, r4) extern char __dtb_z_at91_sama5d27_som1_ek_start[]; -SAMA5_ENTRY_FUNCTION(start_sama5d27_som1_ek, r4) +SAMA5D2_ENTRY_FUNCTION(start_sama5d27_som1_ek, r4) { void *fdt; diff --git a/arch/arm/boards/sama5d3_xplained/lowlevel.c b/arch/arm/boards/sama5d3_xplained/lowlevel.c index df561af36d5e..be6b2960d40d 100644 --- a/arch/arm/boards/sama5d3_xplained/lowlevel.c +++ b/arch/arm/boards/sama5d3_xplained/lowlevel.c @@ -33,7 +33,7 @@ static void dbgu_init(void) pbl_set_putc(at91_dbgu_putc, IOMEM(AT91_BASE_DBGU1)); } -SAMA5_ENTRY_FUNCTION(start_sama5d3_xplained_xload_mmc, r4) +SAMA5D3_ENTRY_FUNCTION(start_sama5d3_xplained_xload_mmc, r4) { sama5d3_lowlevel_init(); @@ -50,12 +50,10 @@ SAMA5_ENTRY_FUNCTION(start_sama5d3_xplained_xload_mmc, r4) extern char __dtb_z_at91_sama5d3_xplained_start[]; -SAMA5_ENTRY_FUNCTION(start_sama5d3_xplained, r4) +SAMA5D3_ENTRY_FUNCTION(start_sama5d3_xplained, r4) { void *fdt; - arm_setup_stack(SAMA5D3_SRAM_BASE + SAMA5D3_SRAM_SIZE); - if (IS_ENABLED(CONFIG_DEBUG_LL)) dbgu_init(); diff --git a/arch/arm/mach-at91/include/mach/barebox-arm.h b/arch/arm/mach-at91/include/mach/barebox-arm.h index 4a65c6f8fa55..36c6abadc137 100644 --- a/arch/arm/mach-at91/include/mach/barebox-arm.h +++ b/arch/arm/mach-at91/include/mach/barebox-arm.h @@ -3,19 +3,29 @@ #define AT91_BAREBOX_ARM_H_ #include <asm/barebox-arm.h> +#include <asm/common.h> +#include <mach/sama5d3.h> -#define SAMA5_ENTRY_FUNCTION(name, r4) \ +#define SAMA5_ENTRY_FUNCTION(name, stack_top, r4) \ void name (u32 r0, u32 r1, u32 r2, u32 r3); \ \ static void __##name(u32); \ \ - void NAKED __section(.text_head_entry_##name) name \ + void __naked __section(.text_head_entry_##name) name \ (u32 r0, u32 r1, u32 r2, u32 r3) \ { \ register u32 r4 asm("r4"); \ __barebox_arm_head(); \ + arm_setup_stack(stack_top); \ __##name(r4); \ } \ - static void NAKED noinline __##name \ - (u32 r4) + static void noinline __##name(u32 r4) + +/* BootROM already initialized usable stack top */ +#define SAMA5D2_ENTRY_FUNCTION(name, r4) \ + SAMA5_ENTRY_FUNCTION(name, 0, r4) + +#define SAMA5D3_ENTRY_FUNCTION(name, r4) \ + SAMA5_ENTRY_FUNCTION(name, SAMA5D3_SRAM_BASE + SAMA5D3_SRAM_SIZE, r4) + #endif -- 2.30.2