/* * 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 #include #include #include _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