| /* |
| * Copyright (c) 2018 Ding Tao <miyatsu@qq.com> |
| * |
| * 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 <toolchain.h> |
| #include <linker/sections.h> |
| |
| _ASM_FILE_PROLOGUE |
| |
| #if defined(CONFIG_SW_VECTOR_RELAY) |
| |
| GDATA(_vector_table_pointer) |
| GDATA(z_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 z_main_stack + CONFIG_MAIN_STACK_SIZE |
| |
| .word z_arm_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 |