arm: armv6-m: Support relocating vector table
An abnormal crash was encountered in ARMv6-M SoCs that don't have flash starting at 0. With Zephyr OS the reason for this crash is that, on ARMv6-M the system requires an exception vector table at the 0 address. We implement the relocate_vector_table function to move the vector table code to address 0 on systems which don't have the start of code already at 0. [kumar.gala: reworderd commit message, tweaked how we check if we need to copy vector table] Signed-off-by: Xiaorui Hu <xiaorui.hu@linaro.org> Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
This commit is contained in:
parent
a580bc5b2e
commit
eb48a0a73c
3 changed files with 17 additions and 3 deletions
|
@ -22,9 +22,20 @@
|
|||
#include <linker/linker-defs.h>
|
||||
#include <nano_internal.h>
|
||||
#include <arch/arm/cortex_m/cmsis.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef CONFIG_ARMV6_M
|
||||
static inline void relocate_vector_table(void) { /* do nothing */ }
|
||||
|
||||
#define VECTOR_ADDRESS 0
|
||||
static inline void relocate_vector_table(void)
|
||||
{
|
||||
#if defined(CONFIG_XIP) && (CONFIG_FLASH_BASE_ADDRESS != 0) || \
|
||||
!defined(CONFIG_XIP) && (CONFIG_SRAM_BASE_ADDRESS != 0)
|
||||
size_t vector_size = (size_t)_vector_end - (size_t)_vector_start;
|
||||
memcpy(VECTOR_ADDRESS, _vector_start, vector_size);
|
||||
#endif
|
||||
}
|
||||
|
||||
#elif defined(CONFIG_ARMV7_M)
|
||||
#ifdef CONFIG_XIP
|
||||
#define VECTOR_ADDRESS ((uintptr_t)&_image_rom_start + \
|
||||
|
|
|
@ -94,7 +94,7 @@ SECTIONS
|
|||
KEEP(*(.dbghdr))
|
||||
KEEP(*(".dbghdr.*"))
|
||||
#endif
|
||||
|
||||
_vector_start = .;
|
||||
. = CONFIG_TEXT_SECTION_OFFSET;
|
||||
KEEP(*(.exc_vector_table))
|
||||
KEEP(*(".exc_vector_table.*"))
|
||||
|
@ -112,7 +112,7 @@ SECTIONS
|
|||
#ifdef CONFIG_GEN_SW_ISR_TABLE
|
||||
KEEP(*(SW_ISR_TABLE))
|
||||
#endif
|
||||
|
||||
_vector_end = .;
|
||||
_image_text_start = .;
|
||||
*(.text)
|
||||
*(".text.*")
|
||||
|
|
|
@ -208,6 +208,9 @@ extern char _image_text_end[];
|
|||
extern char _image_rodata_start[];
|
||||
extern char _image_rodata_end[];
|
||||
|
||||
extern char _vector_start[];
|
||||
extern char _vector_end[];
|
||||
|
||||
/* end address of image, used by newlib for the heap */
|
||||
extern char _end[];
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue