You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.9 KiB
110 lines
2.9 KiB
/* |
|
* Copyright (c) 2018 Ding Tao |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
/** |
|
* @file irq_relay.S |
|
* |
|
* @brief IRQ relay vector table and relay handler for Cortex-M0 or |
|
* Armv8-M baseline SoCs |
|
* |
|
* In certain ARMv6-M and Armv8-M baseline cores the vector table address can |
|
* not be changed. Once the * vector table is occupied by bootloader, there |
|
* will be no IRQ support in the chainloaded image. |
|
* |
|
* This program will link into bootloader, once an interrupt is coming, |
|
* the bootloader can forward the interrupt to the chainloaded image. This |
|
* will support DFU on those cores. |
|
* |
|
* Note: Currently support mcuboot only. |
|
* */ |
|
|
|
#include <board.h> |
|
#include <toolchain.h> |
|
#include <linker/sections.h> |
|
#include <drivers/system_timer.h> |
|
|
|
_ASM_FILE_PROLOGUE |
|
|
|
#if defined(CONFIG_SW_VECTOR_RELAY) |
|
|
|
GDATA(_vector_table_pointer) |
|
GDATA(_main_stack) |
|
|
|
SECTION_FUNC(vector_relay_handler, __vector_relay_handler) |
|
mrs r0, ipsr; |
|
lsls r0, r0, $0x02; |
|
|
|
ldr r1, = _vector_table_pointer; |
|
ldr r1, [r1]; |
|
adds r1, r1, r0; |
|
ldr r1, [r1]; |
|
|
|
/** |
|
* The size of IRQ vector is 4 bytes, the offset within vector table |
|
* is the IRQ number times 4 (aka r0 << 2). As know as the r1 stored |
|
* the offset of real vector table, thus the (r1 = r1 + r0 << 2) will |
|
* be the real irq handle vector. |
|
* */ |
|
|
|
bx r1; |
|
|
|
GTEXT(__vector_relay_handler) |
|
|
|
SECTION_FUNC(vector_relay_table, __vector_relay_table) |
|
.word _main_stack + CONFIG_MAIN_STACK_SIZE |
|
|
|
.word __reset |
|
|
|
.word __vector_relay_handler /* nmi */ |
|
.word __vector_relay_handler /* hard fault */ |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler /* svc */ |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler /* pendsv */ |
|
.word __vector_relay_handler |
|
/* End of system exception */ |
|
|
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
.word __vector_relay_handler |
|
|
|
#endif
|
|
|