| /* |
| * Copyright (c) 2018 Foundries.io Ltd |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/toolchain.h> |
| |
| /* Imports */ |
| GTEXT(__initialize) |
| GTEXT(_isr_wrapper) |
| |
| /* Exports */ |
| GTEXT(__start) |
| |
| /* |
| * Interrupts work the same way for both the RI5CY and ZERO-RISCY cores |
| * in this SoC; the only difference is the location of the vectors section |
| * on flash. We thus reuse this ivt definition for each core. |
| * |
| * On interrupt, the event unit sets pc to the address in this table |
| * at byte offset 4 * (IRQ line number). |
| * |
| * The reset, illegal instruction, ecall, and load store unit error exceptions |
| * are handled by the addresses right after the IRQ table. |
| * |
| * Note: Per RV32I restrictions, "j SOME_HANDLER" can jump within a +/- 1MiB |
| * range. This is not a problem on this SoC: RI5CY is allocated 1MiB flash |
| * and ZERO-RISCY is allocated 256 KiB, and these flash banks contain the |
| * text and vectors sections, so the limits are satisfied. |
| */ |
| SECTION_FUNC(vectors, ivt) |
| .option norvc |
| |
| /* Interrupts */ |
| j _isr_wrapper /* IRQ 0 */ |
| j _isr_wrapper /* IRQ 1 */ |
| j _isr_wrapper /* IRQ 2 */ |
| j _isr_wrapper /* IRQ 3 */ |
| j _isr_wrapper /* IRQ 4 */ |
| j _isr_wrapper /* IRQ 5 */ |
| j _isr_wrapper /* IRQ 6 */ |
| j _isr_wrapper /* IRQ 7 */ |
| j _isr_wrapper /* IRQ 8 */ |
| j _isr_wrapper /* IRQ 9 */ |
| j _isr_wrapper /* IRQ 10 */ |
| j _isr_wrapper /* IRQ 11 */ |
| j _isr_wrapper /* IRQ 12 */ |
| j _isr_wrapper /* IRQ 13 */ |
| j _isr_wrapper /* IRQ 14 */ |
| j _isr_wrapper /* IRQ 15 */ |
| j _isr_wrapper /* IRQ 16 */ |
| j _isr_wrapper /* IRQ 17 */ |
| j _isr_wrapper /* IRQ 18 */ |
| j _isr_wrapper /* IRQ 19 */ |
| j _isr_wrapper /* IRQ 20 */ |
| j _isr_wrapper /* IRQ 21 */ |
| j _isr_wrapper /* IRQ 22 */ |
| j _isr_wrapper /* IRQ 23 */ |
| j _isr_wrapper /* IRQ 24 */ |
| j _isr_wrapper /* IRQ 25 */ |
| j _isr_wrapper /* IRQ 26 */ |
| j _isr_wrapper /* IRQ 27 */ |
| j _isr_wrapper /* IRQ 28 */ |
| j _isr_wrapper /* IRQ 29 */ |
| j _isr_wrapper /* IRQ 30 */ |
| j _isr_wrapper /* IRQ 31 */ |
| |
| /* Exceptions */ |
| j __start /* reset */ |
| j _isr_wrapper /* illegal instruction */ |
| j _isr_wrapper /* ecall */ |
| j _isr_wrapper /* load store eunit error */ |
| |
| SECTION_FUNC(vectors, __start) |
| /* Set mtvec to point at ivt. */ |
| la t0, ivt |
| csrw 0x305, t0 |
| /* Call into Zephyr initialization. */ |
| tail __initialize |