14#ifndef ZEPHYR_INCLUDE_SW_ISR_TABLE_H_
15#define ZEPHYR_INCLUDE_SW_ISR_TABLE_H_
17#if !defined(_ASMLANGUAGE)
29void _isr_wrapper(
void);
32void z_irq_spurious(
const void *unused);
39struct _isr_table_entry {
41 void (*isr)(
const void *);
48#ifndef CONFIG_DYNAMIC_INTERRUPTS
51struct _isr_table_entry _sw_isr_table[];
53struct _irq_parent_entry {
54 const struct device *dev;
75#define Z_SW_ISR_TBL_KCONFIG_BY_ALVL(l) CONCAT(CONFIG_, CONCAT(Z_STR_L, l), _LVL_ISR_TBL_OFFSET)
89#define INTC_BASE_ISR_TBL_OFFSET(node_id) \
90 Z_SW_ISR_TBL_KCONFIG_BY_ALVL(DT_INTC_GET_AGGREGATOR_LEVEL(node_id))
89#define INTC_BASE_ISR_TBL_OFFSET(node_id) \ …
99#define INTC_INST_ISR_TBL_OFFSET(inst) \
100 (INTC_BASE_ISR_TBL_OFFSET(DT_DRV_INST(inst)) + (inst * CONFIG_MAX_IRQ_PER_AGGREGATOR))
99#define INTC_INST_ISR_TBL_OFFSET(inst) \ …
112#define INTC_CHILD_ISR_TBL_OFFSET(node_id) \
113 (INTC_BASE_ISR_TBL_OFFSET(node_id) + \
114 (DT_NODE_CHILD_IDX(node_id) * CONFIG_MAX_IRQ_PER_AGGREGATOR))
112#define INTC_CHILD_ISR_TBL_OFFSET(node_id) \ …
125#define IRQ_PARENT_ENTRY_DEFINE(_name, _dev, _irq, _offset, _level) \
126 static const STRUCT_SECTION_ITERABLE_ALTERNATE(intc_table, _irq_parent_entry, _name) = { \
125#define IRQ_PARENT_ENTRY_DEFINE(_name, _dev, _irq, _offset, _level) \ …
163struct _isr_list_sname {
172#ifdef CONFIG_SHARED_INTERRUPTS
173struct z_shared_isr_table_entry {
174 struct _isr_table_entry clients[CONFIG_SHARED_IRQ_MAX_NUM_CLIENTS];
178void z_shared_isr(
const void *data);
181#ifndef CONFIG_DYNAMIC_INTERRUPTS
184struct z_shared_isr_table_entry z_shared_sw_isr_table[];
188#define ISR_FLAG_DIRECT BIT(0)
190#define _MK_ISR_NAME(x, y) __MK_ISR_NAME(x, y)
191#define __MK_ISR_NAME(x, y) __isr_ ## x ## _irq_ ## y
194#if defined(CONFIG_ISR_TABLES_LOCAL_DECLARATION)
196#define _MK_ISR_ELEMENT_NAME(func, id) __MK_ISR_ELEMENT_NAME(func, id)
197#define __MK_ISR_ELEMENT_NAME(func, id) __isr_table_entry_ ## func ## _irq_ ## id
199#define _MK_IRQ_ELEMENT_NAME(func, id) __MK_ISR_ELEMENT_NAME(func, id)
200#define __MK_IRQ_ELEMENT_NAME(func, id) __irq_table_entry_ ## func ## _irq_ ## id
202#define _MK_ISR_SECTION_NAME(prefix, file, counter) \
203 "." Z_STRINGIFY(prefix) "." file "." Z_STRINGIFY(counter)
205#define _MK_ISR_ELEMENT_SECTION(counter) _MK_ISR_SECTION_NAME(irq, __FILE__, counter)
206#define _MK_IRQ_ELEMENT_SECTION(counter) _MK_ISR_SECTION_NAME(isr, __FILE__, counter)
211#define _Z_ISR_TABLE_ENTRY(irq, func, param, sect) \
212 static Z_DECL_ALIGN(struct _isr_table_entry) \
213 __attribute__((section(sect))) \
214 __used _MK_ISR_ELEMENT_NAME(func, __COUNTER__) = { \
215 .arg = (const void *)(param), \
216 .isr = (void (*)(const void *))(void *)(func) \
219#define Z_ISR_DECLARE_C(irq, flags, func, param, counter) \
220 _Z_ISR_DECLARE_C(irq, flags, func, param, counter)
222#define _Z_ISR_DECLARE_C(irq, flags, func, param, counter) \
223 _Z_ISR_TABLE_ENTRY(irq, func, param, _MK_ISR_ELEMENT_SECTION(counter)); \
224 static Z_DECL_ALIGN(struct _isr_list_sname) Z_GENERIC_SECTION(.intList) __used \
225 _MK_ISR_NAME(func, counter) = {irq, flags, {_MK_ISR_ELEMENT_SECTION(counter)}}
232#define Z_ISR_DECLARE(irq, flags, func, param) \
233 BUILD_ASSERT(((flags) & ISR_FLAG_DIRECT) == 0, "Use Z_ISR_DECLARE_DIRECT macro"); \
234 Z_ISR_DECLARE_C(irq, flags, func, param, __COUNTER__)
240#define _Z_ISR_DIRECT_TABLE_ENTRY(irq, func, sect) \
241 COND_CODE_1(CONFIG_IRQ_VECTOR_TABLE_JUMP_BY_ADDRESS, ( \
242 static Z_DECL_ALIGN(uintptr_t) \
243 __attribute__((section(sect))) \
244 __used _MK_IRQ_ELEMENT_NAME(func, __COUNTER__) = ((uintptr_t)(func)); \
246 void __attribute__((section(sect))) __attribute__((naked)) \
248 __used _MK_IRQ_ELEMENT_NAME(func, __COUNTER__) (void) { \
249 __asm(ARCH_IRQ_VECTOR_JUMP_CODE(func)); \
254#define Z_ISR_DECLARE_DIRECT_C(irq, flags, func, counter) \
255 _Z_ISR_DECLARE_DIRECT_C(irq, flags, func, counter)
257#define _Z_ISR_DECLARE_DIRECT_C(irq, flags, func, counter) \
258 _Z_ISR_DIRECT_TABLE_ENTRY(irq, func, _MK_IRQ_ELEMENT_SECTION(counter)); \
259 static Z_DECL_ALIGN(struct _isr_list_sname) Z_GENERIC_SECTION(.intList) \
260 __used _MK_ISR_NAME(func, counter) = { \
262 ISR_FLAG_DIRECT | (flags), \
263 _MK_IRQ_ELEMENT_SECTION(counter)}
269#define Z_ISR_DECLARE_DIRECT(irq, flags, func) \
270 BUILD_ASSERT(IS_ENABLED(CONFIG_IRQ_VECTOR_TABLE_JUMP_BY_ADDRESS) || \
271 IS_ENABLED(CONFIG_IRQ_VECTOR_TABLE_JUMP_BY_CODE), \
272 "CONFIG_IRQ_VECTOR_TABLE_JUMP_BY_{ADDRESS,CODE} not set"); \
273 Z_ISR_DECLARE_DIRECT_C(irq, flags, func, __COUNTER__)
282#define Z_ISR_DECLARE(irq, flags, func, param) \
283 static Z_DECL_ALIGN(struct _isr_list) Z_GENERIC_SECTION(.intList) \
284 __used _MK_ISR_NAME(func, __COUNTER__) = \
285 {irq, flags, (void *)&func, (const void *)param}
290#define Z_ISR_DECLARE_DIRECT(irq, flags, func) \
291 Z_ISR_DECLARE(irq, ISR_FLAG_DIRECT | (flags), func, NULL)
295#define IRQ_TABLE_SIZE (CONFIG_NUM_IRQS - CONFIG_GEN_IRQ_START_VECTOR)
297#ifdef CONFIG_DYNAMIC_INTERRUPTS
298void z_isr_install(
unsigned int irq,
void (*routine)(
const void *),
301#ifdef CONFIG_SHARED_INTERRUPTS
302int z_isr_uninstall(
unsigned int irq,
void (*routine)(
const void *),
flags
Definition parser.h:97
__INT32_TYPE__ int32_t
Definition stdint.h:74