arch: arm: core: fix vector table relocate write to flash
Some SOCs (e.g. STM32F0) can map the flash to address 0 and the flash base address at the same time. Prevent writing to duplicate flash address which stops the SOC. Allow Cortex M SOCs to create their own vector table relocation function. Provide a relocation function for STM32F0x SOCs. Fixes #3923 Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
This commit is contained in:
parent
eaff37e21f
commit
2f7688bfd3
3 changed files with 44 additions and 1 deletions
|
@ -27,7 +27,7 @@
|
||||||
#ifdef CONFIG_ARMV6_M
|
#ifdef CONFIG_ARMV6_M
|
||||||
|
|
||||||
#define VECTOR_ADDRESS 0
|
#define VECTOR_ADDRESS 0
|
||||||
static inline void relocate_vector_table(void)
|
void __weak relocate_vector_table(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_XIP) && (CONFIG_FLASH_BASE_ADDRESS != 0) || \
|
#if defined(CONFIG_XIP) && (CONFIG_FLASH_BASE_ADDRESS != 0) || \
|
||||||
!defined(CONFIG_XIP) && (CONFIG_SRAM_BASE_ADDRESS != 0)
|
!defined(CONFIG_XIP) && (CONFIG_SRAM_BASE_ADDRESS != 0)
|
||||||
|
|
|
@ -15,6 +15,39 @@
|
||||||
#include <soc.h>
|
#include <soc.h>
|
||||||
#include <arch/cpu.h>
|
#include <arch/cpu.h>
|
||||||
#include <cortex_m/exc.h>
|
#include <cortex_m/exc.h>
|
||||||
|
#include <linker/linker-defs.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Relocate vector table to SRAM.
|
||||||
|
*
|
||||||
|
* On Cortex-M0 platforms, the Vector Base address cannot be changed.
|
||||||
|
*
|
||||||
|
* A Zephyr image that is run from the mcuboot bootloader must relocate the
|
||||||
|
* vector table to SRAM to be able to replace the vectors pointing to the
|
||||||
|
* bootloader.
|
||||||
|
*
|
||||||
|
* A zephyr image that is a bootloader does not have to relocate the
|
||||||
|
* vector table.
|
||||||
|
*
|
||||||
|
* Replaces the default function from prep_c.c.
|
||||||
|
*
|
||||||
|
* @note Zephyr applications that will not be loaded by a bootloader should
|
||||||
|
* pretend to be a bootloader if the SRAM vector table is not needed.
|
||||||
|
*/
|
||||||
|
void relocate_vector_table(void)
|
||||||
|
{
|
||||||
|
#ifndef CONFIG_IS_BOOTLOADER
|
||||||
|
extern char _ram_vector_start[];
|
||||||
|
|
||||||
|
size_t vector_size = (size_t)_vector_end - (size_t)_vector_start;
|
||||||
|
|
||||||
|
memcpy(_ram_vector_start, _vector_start, vector_size);
|
||||||
|
LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SRAM);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function configures the source of stm32cube time base.
|
* @brief This function configures the source of stm32cube time base.
|
||||||
|
|
|
@ -181,6 +181,16 @@ SECTIONS
|
||||||
|
|
||||||
GROUP_START(RAMABLE_REGION)
|
GROUP_START(RAMABLE_REGION)
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_SERIES_STM32F0X) && !defined(CONFIG_IS_BOOTLOADER)
|
||||||
|
/* Must be first in ramable region */
|
||||||
|
SECTION_PROLOGUE(.st_stm32f0x_vt,(NOLOAD),)
|
||||||
|
{
|
||||||
|
_ram_vector_start = .;
|
||||||
|
. += _vector_end - _vector_start;
|
||||||
|
_ram_vector_end = .;
|
||||||
|
} GROUP_DATA_LINK_IN(RAMABLE_REGION, RAMABLE_REGION)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_APPLICATION_MEMORY
|
#ifdef CONFIG_APPLICATION_MEMORY
|
||||||
SECTION_DATA_PROLOGUE(_APP_DATA_SECTION_NAME, (OPTIONAL),)
|
SECTION_DATA_PROLOGUE(_APP_DATA_SECTION_NAME, (OPTIONAL),)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue