platsupport/simple: add per cpu irq support on arm - support PER_CPU interrupt type to specify a core - use GetTriggerCore on SMP (GetTrigger fails)
diff --git a/libsel4platsupport/src/arch/arm/device.c b/libsel4platsupport/src/arch/arm/device.c index d7e5be1..2c7b005 100644 --- a/libsel4platsupport/src/arch/arm/device.c +++ b/libsel4platsupport/src/arch/arm/device.c
@@ -18,6 +18,8 @@ switch (irq->type) { case PS_TRIGGER: return arch_simple_get_IRQ_trigger(arch_simple, irq->trigger.number, irq->trigger.trigger, *dest); + case PS_PER_CPU: + return arch_simple_get_IRQ_trigger_cpu(arch_simple, irq->cpu.number, irq->cpu.trigger, irq->cpu.cpu_idx, *dest); default: ZF_LOGE("unknown irq type"); return -1;
diff --git a/libsel4simple-default/src/arch/arm/default.c b/libsel4simple-default/src/arch/arm/default.c index acc4083..a0b50c1 100644 --- a/libsel4simple-default/src/arch/arm/default.c +++ b/libsel4simple-default/src/arch/arm/default.c
@@ -27,10 +27,14 @@ return seL4_IRQControl_Get(seL4_CapIRQControl, irq, root, index, depth); } -seL4_Error simple_default_get_irq_trigger(void *data, int irq, int trigger, seL4_CNode root, +seL4_Error simple_default_get_irq_trigger(void *data, int irq, int trigger, UNUSED int core, seL4_CNode root, seL4_Word index, uint8_t depth) { +#if CONFIG_MAX_NUM_NODES > 1 + return seL4_IRQControl_GetTriggerCore(seL4_CapIRQControl, irq, trigger, root, index, depth, core); +#else return seL4_IRQControl_GetTrigger(seL4_CapIRQControl, irq, trigger, root, index, depth); +#endif } #ifdef CONFIG_ARM_SMMU
diff --git a/libsel4simple/arch_include/arm/simple/arch/simple.h b/libsel4simple/arch_include/arm/simple/arch/simple.h index 3a408de..4ae12aa 100644 --- a/libsel4simple/arch_include/arm/simple/arch/simple.h +++ b/libsel4simple/arch_include/arm/simple/arch/simple.h
@@ -34,7 +34,7 @@ */ typedef seL4_Error(*simple_get_IRQ_handler_fn)(void *data, int irq, seL4_CNode cnode, seL4_Word index, uint8_t depth); -typedef seL4_Error(*simple_get_IRQ_trigger_fn)(void *data, int irq, int trigger, seL4_CNode root, +typedef seL4_Error(*simple_get_IRQ_trigger_fn)(void *data, int irq, int trigger, int core, seL4_CNode root, seL4_Word index, uint8_t depth); typedef seL4_Error(*simple_get_iospace_cap_count_fn)(void *data, int *count); @@ -70,5 +70,20 @@ return seL4_InvalidArgument; } - return simple->irq_trigger(simple->data, irq, trigger, path.root, path.capPtr, path.capDepth); + return simple->irq_trigger(simple->data, irq, trigger, 0, path.root, path.capPtr, path.capDepth); +} + +static inline seL4_Error arch_simple_get_IRQ_trigger_cpu(arch_simple_t *simple, int irq, int trigger, int core, + cspacepath_t path) +{ + if (!simple) { + ZF_LOGE("Simple is NULL"); + return seL4_InvalidArgument; + } + if (!simple->irq_trigger) { + ZF_LOGE("Not implemented"); + return seL4_InvalidArgument; + } + + return simple->irq_trigger(simple->data, irq, trigger, core, path.root, path.capPtr, path.capDepth); }