Skip to content
Snippets Groups Projects
Commit ef70a42f authored by Philipp Tomsich's avatar Philipp Tomsich
Browse files

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: default avatarPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
parent 16fa2eb9
No related branches found
No related tags found
No related merge requests found
/* /*
* Copyright 2017 Theobroma Systems Design und Consulting GmbH * Copyright 2017 Theobroma Systems Design und Consulting GmbH
* *
......
...@@ -15,6 +15,22 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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
/* /*
************************************************************************* *************************************************************************
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment