mirror of
https://xff.cz/git/u-boot/
synced 2025-09-03 17:52:07 +02:00
arm: boot0 hook: move boot0 hook before '_start'
The boot0 hook on ARM does not insert its payload before the vector table. This is both a mismatch with thec comment above it and contradict usage of the boot0 hook on ARM64. To fix this (and unify the semantics for ARM and ARM64), we change the boot0-hook semantics on ARM to match those on ARM64: (1) if a boot0-hook is present it is inserted at the start of the image (2) if a boot0-hook is present, emitting the ARM vector table (and the _start) symbol are suppressed in vectors.S and the boot0-hook has full control over where and when it wants to emit these Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2017 Theobroma Systems Design und Consulting GmbH
|
* Copyright 2017 Theobroma Systems Design und Consulting GmbH
|
||||||
*
|
*
|
||||||
|
@@ -15,6 +15,22 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A macro to allow insertion of an ARM exception vector either
|
||||||
|
* for the non-boot0 case or by a boot0-header.
|
||||||
|
*/
|
||||||
|
.macro ARM_VECTORS
|
||||||
|
b reset
|
||||||
|
ldr pc, _undefined_instruction
|
||||||
|
ldr pc, _software_interrupt
|
||||||
|
ldr pc, _prefetch_abort
|
||||||
|
ldr pc, _data_abort
|
||||||
|
ldr pc, _not_used
|
||||||
|
ldr pc, _irq
|
||||||
|
ldr pc, _fiq
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*************************************************************************
|
*************************************************************************
|
||||||
*
|
*
|
||||||
@@ -35,6 +51,23 @@
|
|||||||
|
|
||||||
.section ".vectors", "ax"
|
.section ".vectors", "ax"
|
||||||
|
|
||||||
|
#if defined(CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK)
|
||||||
|
/*
|
||||||
|
* Various SoCs need something special and SoC-specific up front in
|
||||||
|
* order to boot, allow them to set that in their boot0.h file and then
|
||||||
|
* use it here.
|
||||||
|
*
|
||||||
|
* To allow a boot0 hook to insert a 'special' sequence after the vector
|
||||||
|
* table (e.g. for the socfpga), the presence of a boot0 hook supresses
|
||||||
|
* the below vector table and assumes that the vector table is filled in
|
||||||
|
* by the boot0 hook. The requirements for a boot0 hook thus are:
|
||||||
|
* (1) defines '_start:' as appropriate
|
||||||
|
* (2) inserts the vector table using ARM_VECTORS as appropriate
|
||||||
|
*/
|
||||||
|
#include <asm/arch/boot0.h>
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*************************************************************************
|
*************************************************************************
|
||||||
*
|
*
|
||||||
@@ -46,28 +79,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
|
#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
|
||||||
.word CONFIG_SYS_DV_NOR_BOOT_CFG
|
.word CONFIG_SYS_DV_NOR_BOOT_CFG
|
||||||
#endif
|
#endif
|
||||||
|
ARM_VECTORS
|
||||||
b reset
|
#endif /* !defined(CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK) */
|
||||||
ldr pc, _undefined_instruction
|
|
||||||
ldr pc, _software_interrupt
|
|
||||||
ldr pc, _prefetch_abort
|
|
||||||
ldr pc, _data_abort
|
|
||||||
ldr pc, _not_used
|
|
||||||
ldr pc, _irq
|
|
||||||
ldr pc, _fiq
|
|
||||||
|
|
||||||
#ifdef CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK
|
|
||||||
/*
|
|
||||||
* Various SoCs need something special and SoC-specific up front in
|
|
||||||
* order to boot, allow them to set that in their boot0.h file and then
|
|
||||||
* use it here.
|
|
||||||
*/
|
|
||||||
#include <asm/arch/boot0.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*************************************************************************
|
*************************************************************************
|
||||||
|
Reference in New Issue
Block a user