14#ifndef ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_
15#define ZEPHYR_INCLUDE_ARCH_RISCV_IRQ_H_
33#define RISCV_EXC_BREAKPOINT 3
35#define RISCV_EXC_ECALLU 8
37#define RISCV_EXC_ECALLS 9
39#define RISCV_EXC_ECALLM 11
44#define RISCV_IRQ_MSOFT 3
46#define RISCV_IRQ_MEXT 11
49#define RISCV_MCAUSE_IRQ_POS 63U
50#define RISCV_MCAUSE_IRQ_BIT BIT64(RISCV_MCAUSE_IRQ_POS)
52#define RISCV_MCAUSE_IRQ_POS 31U
53#define RISCV_MCAUSE_IRQ_BIT BIT(RISCV_MCAUSE_IRQ_POS)
62#if defined(CONFIG_RISCV_HAS_PLIC) || defined(CONFIG_RISCV_HAS_CLIC) || \
63 defined(CONFIG_RISCV_HAS_AIA)
64extern void z_riscv_irq_priority_set(
unsigned int irq,
68#define z_riscv_irq_priority_set(i, p, f)
71#ifdef CONFIG_RISCV_HAS_CLIC
72extern void z_riscv_irq_vector_set(
unsigned int irq);
74#define z_riscv_irq_vector_set(i)
77#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
79 Z_ISR_DECLARE(irq_p + CONFIG_RISCV_RESERVED_IRQ_ISR_TABLES_OFFSET, \
80 0, isr_p, isr_param_p); \
81 z_riscv_irq_priority_set(irq_p, priority_p, flags_p); \
84#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
86 Z_ISR_DECLARE_DIRECT(irq_p + CONFIG_RISCV_RESERVED_IRQ_ISR_TABLES_OFFSET, \
87 ISR_FLAG_DIRECT, isr_p); \
88 z_riscv_irq_priority_set(irq_p, priority_p, flags_p); \
89 z_riscv_irq_vector_set(irq_p); \
93extern void arch_isr_direct_pm(
void);
94#define ARCH_ISR_DIRECT_PM() arch_isr_direct_pm()
96#define ARCH_ISR_DIRECT_PM() \
101#define ARCH_ISR_DIRECT_HEADER() arch_isr_direct_header()
102#define ARCH_ISR_DIRECT_FOOTER(swap) arch_isr_direct_footer(swap)
104#ifdef CONFIG_TRACING_ISR
111#ifdef CONFIG_TRACING_ISR
118extern unsigned long __soc_handle_irq(
unsigned long mcause);
125#ifdef CONFIG_RISCV_S_MODE
126 __asm__
volatile(
"csrr %0, scause" :
"=r" (cause));
128 __asm__
volatile(
"csrr %0, mcause" :
"=r" (cause));
130 cause &= CONFIG_RISCV_MCAUSE_EXCEPTION_MASK;
133 __soc_handle_irq(cause);
138#ifdef CONFIG_TRACING_ISR
146#ifdef CONFIG_RISCV_S_MODE
147#define ARCH_ISR_DIRECT_DECLARE(name) \
148 static inline int name##_body(void); \
149 __attribute__ ((interrupt("supervisor"))) void name(void) \
151 ISR_DIRECT_HEADER(); \
153 ISR_DIRECT_FOOTER(0); \
155 static inline int name##_body(void)
157#define ARCH_ISR_DIRECT_DECLARE(name) \
158 static inline int name##_body(void); \
159 __attribute__ ((interrupt)) void name(void) \
161 ISR_DIRECT_HEADER(); \
163 ISR_DIRECT_FOOTER(0); \
165 static inline int name##_body(void)
static ALWAYS_INLINE _cpu_t * arch_curr_cpu(void)
Definition arch_inlines.h:17
static void arch_isr_direct_header(void)
Definition irq.h:91
static void arch_isr_direct_footer(int maybe_swap)
Definition irq.h:98
#define arch_irq_disable(irq)
Definition irq.h:75
#define arch_irq_enable(irq)
Definition irq.h:74
#define arch_irq_is_enabled(irq)
Definition irq.h:76
void sys_trace_isr_enter(void)
Called when entering an ISR.
void sys_trace_isr_exit(void)
Called when exiting an ISR.
Public interface for configuring interrupts.
flags
Definition parser.h:97
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Software-managed ISR table.