libsel4platsupport: Improve IRQ interface config
To make it easier to pass default options to the IRQ interface, the max
IRQ and notification IDs options are combined into a single struct. Also
define a simple default option to streamline the process of creating the
IRQ interface.
diff --git a/libsel4platsupport/include/sel4platsupport/irq.h b/libsel4platsupport/include/sel4platsupport/irq.h
index a7cf7ed..d0426e3 100644
--- a/libsel4platsupport/include/sel4platsupport/irq.h
+++ b/libsel4platsupport/include/sel4platsupport/irq.h
@@ -27,6 +27,14 @@
ps_irq_t irq;
} sel4ps_irq_t;
+typedef struct irq_interface_config {
+ size_t max_irq_ids;
+ size_t max_ntfn_ids;
+} irq_interface_config_t;
+
+/* Constant defining some defaults for IRQ interface configurations */
+#define DEFAULT_IRQ_INTERFACE_CONFIG (struct irq_interface_config) { 64, 64 }
+
/* This is the maximum number of interrupts that can be bound on a particular
* notification instance */
#define MAX_INTERRUPTS_TO_NOTIFICATIONS seL4_BadgeBits
@@ -54,7 +62,7 @@
* @return 0 on success, otherwise an error code
*/
int sel4platsupport_new_irq_ops(ps_irq_ops_t *irq_ops, vka_t *vka, simple_t *simple,
- size_t max_irq_ids, size_t max_ntfn_ids,
+ irq_interface_config_t irq_config,
ps_malloc_ops_t *malloc_ops);
/*
diff --git a/libsel4platsupport/src/irq.c b/libsel4platsupport/src/irq.c
index d070827..aac6449 100644
--- a/libsel4platsupport/src/irq.c
+++ b/libsel4platsupport/src/irq.c
@@ -339,13 +339,17 @@
return ret;
}
-int sel4platsupport_new_irq_ops(ps_irq_ops_t *irq_ops, vka_t *vka, simple_t *simple, size_t max_irq_ids,
- size_t max_ntfn_ids, ps_malloc_ops_t *malloc_ops)
+int sel4platsupport_new_irq_ops(ps_irq_ops_t *irq_ops, vka_t *vka, simple_t *simple,
+ irq_interface_config_t irq_config, ps_malloc_ops_t *malloc_ops)
{
if (!irq_ops || !vka || !simple || !malloc_ops) {
return -EINVAL;
}
+ if (irq_config.max_irq_ids == 0 || irq_config.max_ntfn_ids == 0) {
+ return -EINVAL;
+ }
+
int err = 0;
irq_cookie_t *cookie = 0;
@@ -356,31 +360,31 @@
}
/* Allocate the IRQ bookkeeping array, and set default values for some of the members */
- err = ps_calloc(malloc_ops, 1, sizeof(irq_entry_t) * max_irq_ids, (void **) & (cookie->irq_table));
+ err = ps_calloc(malloc_ops, 1, sizeof(irq_entry_t) * irq_config.max_irq_ids, (void **) & (cookie->irq_table));
if (err) {
ZF_LOGE("Failed to allocate IRQ bookkeeping array");
goto error;
}
- for (int i = 0; i < max_irq_ids; i++) {
+ for (int i = 0; i < irq_config.max_irq_ids; i++) {
cookie->irq_table[i].paired_ntfn = UNPAIRED_ID;
cookie->irq_table[i].allocated_badge_index = UNALLOCATED_BADGE_INDEX;
}
/* Allocate the notification bookkeeping array, and set default values for some of the members */
- err = ps_calloc(malloc_ops, 1, sizeof(ntfn_entry_t) * max_ntfn_ids,
+ err = ps_calloc(malloc_ops, 1, sizeof(ntfn_entry_t) * irq_config.max_ntfn_ids,
(void **) & (cookie->ntfn_table));
if (err) {
ZF_LOGE("Failed to allocate notification bookkeeping array");
goto error;
}
- for (int i = 0; i < max_ntfn_ids; i++) {
+ for (int i = 0; i < irq_config.max_ntfn_ids; i++) {
memset(cookie->ntfn_table[i].bound_irqs, UNPAIRED_ID, MAX_INTERRUPTS_TO_NOTIFICATIONS);
}
/* Figure out how many bitfields we need to keep track of the allocation status of the IDs */
size_t bits_in_seL4_Word = sizeof(seL4_Word) * CHAR_BIT;
- size_t num_irq_bitfields = ALIGN_UP(max_irq_ids, bits_in_seL4_Word) / sizeof(seL4_Word);
- size_t num_ntfn_bitfields = ALIGN_UP(max_ntfn_ids, bits_in_seL4_Word) / sizeof(seL4_Word);
+ size_t num_irq_bitfields = ALIGN_UP(irq_config.max_irq_ids, bits_in_seL4_Word) / sizeof(seL4_Word);
+ size_t num_ntfn_bitfields = ALIGN_UP(irq_config.max_ntfn_ids, bits_in_seL4_Word) / sizeof(seL4_Word);
err = ps_calloc(malloc_ops, 1, num_irq_bitfields * sizeof(seL4_Word),
(void **) & (cookie->allocated_irq_bitfields));
if (err) {
@@ -397,8 +401,8 @@
cookie->simple = simple;
cookie->vka = vka;
cookie->malloc_ops = malloc_ops;
- cookie->max_irq_ids = max_irq_ids;
- cookie->max_ntfn_ids = max_ntfn_ids;
+ cookie->max_irq_ids = irq_config.max_irq_ids;
+ cookie->max_ntfn_ids = irq_config.max_ntfn_ids;
cookie->num_irq_bitfields = num_irq_bitfields;
cookie->num_ntfn_bitfields = num_ntfn_bitfields;
@@ -412,11 +416,11 @@
error:
if (cookie) {
if (cookie->irq_table) {
- ps_free(malloc_ops, sizeof(irq_entry_t) * max_irq_ids, cookie->irq_table);
+ ps_free(malloc_ops, sizeof(irq_entry_t) * irq_config.max_irq_ids, cookie->irq_table);
}
if (cookie->ntfn_table) {
- ps_free(malloc_ops, sizeof(ntfn_entry_t) * max_ntfn_ids,
+ ps_free(malloc_ops, sizeof(ntfn_entry_t) * irq_config.max_ntfn_ids,
cookie->ntfn_table);
}