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);
}