arm: cortex-m: allow configurable ROM offset

Currently, ARM Cortex-M image ROMs are linked starting at the flash
device's base address (CONFIG_FLASH_BASE_ADDRESS). This prevents XIP
Zephyr applications from being linked to run from elsewhere on the
flash device. Linking Zephyr applications to run from elsewhere can be
necessary when running under a bootloader (i.e., booting into a Zephyr
application from a bootloader, not using Zephyr as a bootloader).

To enable this use case, add a new config option: FLASH_LOAD_OFFSET.
This option directs the linker to treat ROM as if it started that many
bytes from the base of flash on Cortex-M targets. The option defaults
to zero to preserve backwards compatibility.

Change-Id: I64f82aee257c19c2451f9789b0ab56999775b761
Signed-off-by: Marti Bolivar <marti.bolivar@linaro.org>
This commit is contained in:
Marti Bolivar 2017-02-10 11:39:10 -05:00 committed by Kumar Gala
commit bf2d34ba30
3 changed files with 16 additions and 4 deletions

View file

@ -199,6 +199,17 @@ config FLASH_BASE_ADDRESS
This option specifies the base address of the flash on the board. It is
normally set by the board's defconfig file and the user should generally
avoid modifying it via the menu configuration.
config FLASH_LOAD_OFFSET
hex "Kernel load offset"
default 0
help
This option specifies the byte offset from FLASH_BASE_ADDRESS that the
kernel should be loaded into. Changing this value from zero will affect
the Zephyr image's link, and will decrease the total amount of flash
available for use by application code.
If unsure, leave at the default value 0.
endmenu
menu "ARM Cortex-M0/M0+/M3/M4/M7 options"

View file

@ -27,7 +27,8 @@
static inline void relocate_vector_table(void) { /* do nothing */ }
#elif defined(CONFIG_ARMV7_M)
#ifdef CONFIG_XIP
#define VECTOR_ADDRESS (CONFIG_FLASH_BASE_ADDRESS + CONFIG_TEXT_SECTION_OFFSET)
#define VECTOR_ADDRESS ((uintptr_t)&_image_rom_start + \
CONFIG_TEXT_SECTION_OFFSET)
#else
#define VECTOR_ADDRESS CONFIG_SRAM_BASE_ADDRESS
#endif