| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| /** | |
| * @file | |
| * This file contains Ibex-specific interrupt vectors. | |
| */ | |
| // These functions are declared in `sw/device/lib/handler.h`. | |
| .extern handler_exception | |
| .extern handler_irq_software | |
| .extern handler_irq_timer | |
| .extern handler_irq_external | |
| // NOTE: The "ax" flag below is necessary to ensure that this section | |
| // is allocated space in ROM by the linker. | |
| .section .vectors, "ax" | |
| .option push | |
| // Switch off compressed instructions so we know each instruction below is | |
| // exactly 4 bytes (one entry). | |
| .option norvc | |
| // Switch off linker relaxation so that the linker does not reduce the size of | |
| // any entries. | |
| .option norelax | |
| /** | |
| * `crt_interrupt_vector` is the CRT-loaded interrupt vector for Ibex. | |
| * | |
| * It contains entries that point at the functions declared in | |
| * `sw/device/lib/handler.h`. If you are getting link errors for these symbols, | |
| * then it's likely you have forgotten to add `sw_lib_irq_handlers` as a | |
| * dependency for your executable. | |
| * | |
| * Interrupt vectors in Ibex have 32 entries for 32 possible interrupts. The | |
| * vector must be 256-byte aligned, as Ibex's vectoring mechanism requires that. | |
| * | |
| * This vector has exactly 32 entries so that code after the vector will not | |
| * overlap the interrupt vector, which causes debugging confusion. | |
| * | |
| * More information about Ibex's interrupts can be found here: | |
| * https://ibex-core.readthedocs.io/en/latest/03_reference/exception_interrupts.html | |
| */ | |
| .balign 256 | |
| crt_interrupt_vector: | |
| .global crt_interrupt_vector | |
| // exception Handler and user software interrupt | |
| j handler_exception | |
| // supervisor software interrupt | |
| unimp | |
| // reserved | |
| unimp | |
| // machine software interrupt handler | |
| j handler_irq_software | |
| // user timer interrupt | |
| unimp | |
| // supervisor timer interrupt | |
| unimp | |
| // reserved | |
| unimp | |
| // machine timer interrupt handler | |
| j handler_irq_timer | |
| // user external interrupt | |
| unimp | |
| // supervisor external interrupt | |
| unimp | |
| // reserved | |
| unimp | |
| // machine external interrupt handler | |
| j handler_irq_external | |
| // reserved | |
| unimp | |
| unimp | |
| unimp | |
| unimp | |
| // vendor interrupts: on Ibex interrupt ids 30-16 are the "fast" interrupts | |
| .rept 15 | |
| unimp | |
| .endr | |
| // vendor interrupts: on Ibex interrupt id 31 is for non-maskable interrupts | |
| unimp | |
| // Set size so vector can be disassembled | |
| .size crt_interrupt_vector, .-crt_interrupt_vector | |
| .option pop |