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