libsel4vmmplatsupport: virtio[con|net] init update

Updated the virtio console and virtio net driver initialisation
interfaces to take into consideration the new ioport interface
updates. This allows the user to pass the ioport type and reorders
the init sequence to setup the device PCI space after the ioport
range has been determined.
diff --git a/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_con.h b/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_con.h
index 0527658..4f972e4 100644
--- a/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_con.h
+++ b/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_con.h
@@ -35,8 +35,8 @@
  * @param vm vm handle
  * @param pci PCI library instance to register virtio con device
  * @param ioport IOPort library instance to register virtio con ioport
- * @param iobase starting BAR port for front end emulation to start from
- * @param iosize size of starting BAR port for front end emulation
+ * @param ioport_range BAR port for front end emulation
+ * @param iotype type of ioport i.e. whether to alloc or use given range
  * @param interrupt_pin PCI interrupt pin e.g. INTA = 1, INTB = 2 ,...
  * @param interrupt_line PCI interrupt line for virtio con IRQS
  * @param backend function pointers to backend implementation. Can be initialised by
@@ -46,8 +46,8 @@
 virtio_con_t *common_make_virtio_con(vm_t *vm,
                                      vmm_pci_space_t *pci,
                                      vmm_io_port_list_t *ioport,
-                                     unsigned int iobase,
-                                     size_t iobase_size,
+                                     ioport_range_t ioport_range,
+                                     ioport_type_t port_type,
                                      unsigned int interrupt_pin,
                                      unsigned int interrupt_line,
                                      struct console_passthrough backend);
diff --git a/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_net.h b/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_net.h
index 3c470bc..c6a6831 100644
--- a/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_net.h
+++ b/libsel4vmmplatsupport/include/sel4vmmplatsupport/drivers/virtio_net.h
@@ -39,8 +39,8 @@
  * @param vm vm handle
  * @param pci PCI library instance to register virtio net device
  * @param ioport IOPort library instance to register virtio net ioport
- * @param iobase starting BAR port for front end emulation to start from
- * @param iosize size of starting BAR port for front end emulation
+ * @param ioport_range BAR port for front end emulation
+ * @param iotype type of ioport i.e. whether to alloc or use given range
  * @param interrupt_pin PCI interrupt pin e.g. INTA = 1, INTB = 2 ,...
  * @param interrupt_line PCI interrupt line for virtio net IRQS
  * @param backend function pointers to backend implementation. Can be initialised by
@@ -49,7 +49,7 @@
  * @return pointer to an initialised virtio_net_t, NULL if error.
  */
 virtio_net_t *common_make_virtio_net(vm_t *vm, vmm_pci_space_t *pci, vmm_io_port_list_t *ioport,
-                                     unsigned int iobase, size_t iobase_size, unsigned int interrupt_pin, unsigned int interrupt_line,
+                                     ioport_range_t ioport_range, ioport_type_t port_type, unsigned int interrupt_pin, unsigned int interrupt_line,
                                      struct raw_iface_funcs backend, bool emulate_bar_access);
 
 /**
diff --git a/libsel4vmmplatsupport/src/drivers/virtio_con.c b/libsel4vmmplatsupport/src/drivers/virtio_con.c
index 03eb82a..20eac49 100644
--- a/libsel4vmmplatsupport/src/drivers/virtio_con.c
+++ b/libsel4vmmplatsupport/src/drivers/virtio_con.c
@@ -92,28 +92,29 @@
     return vmm_pci_create_passthrough_bar_emulation(entry, 1, bars);
 }
 
-
 virtio_con_t *common_make_virtio_con(vm_t *vm, vmm_pci_space_t *pci, vmm_io_port_list_t *ioport,
-                                     unsigned int iobase, size_t iobase_size, unsigned int interrupt_pin, unsigned int interrupt_line,
+                                     ioport_range_t ioport_range, ioport_type_t port_type, unsigned int interrupt_pin, unsigned int interrupt_line,
                                      struct console_passthrough backend)
 {
-    size_t iobase_size_bits = BYTES_TO_SIZE_BITS(iobase_size);
     int err = ps_new_stdlib_malloc_ops(&ops.malloc_ops);
     ZF_LOGF_IF(err, "Failed to get malloc ops");
 
-    vmm_pci_entry_t con_entry = vmm_virtio_console_pci_bar(iobase, iobase_size_bits, interrupt_pin,
-                                                           interrupt_line);
-    vmm_pci_add_entry(pci, con_entry, NULL);
-
     virtio_con_t *con;
     err = ps_calloc(&ops.malloc_ops, 1, sizeof(*con), (void **)&con);
     ZF_LOGF_IF(err, "Failed to allocate virtio con");
 
-    con->iobase = iobase;
-
-    ioport_range_t virtio_io_range = {iobase, iobase + iobase_size};
     ioport_interface_t virtio_io_interface = {con, virtio_con_io_in, virtio_con_io_out, "VIRTIO CON"};
-    vmm_io_port_add_handler(ioport, virtio_io_range, virtio_io_interface);
+    ioport_entry_t *io_entry = vmm_io_port_add_handler(ioport, ioport_range, virtio_io_interface, port_type);
+    if (!io_entry) {
+        ZF_LOGE("Failed to add vmm io port handler");
+        return NULL;
+    }
+
+    size_t iobase_size_bits = BYTES_TO_SIZE_BITS(io_entry->range.size);
+    con->iobase = io_entry->range.start;
+    vmm_pci_entry_t con_entry = vmm_virtio_console_pci_bar(io_entry->range.start, iobase_size_bits, interrupt_pin,
+                                                           interrupt_line);
+    vmm_pci_add_entry(pci, con_entry, NULL);
 
     ps_io_ops_t ioops;
     con->emul_driver_funcs = backend;
diff --git a/libsel4vmmplatsupport/src/drivers/virtio_net.c b/libsel4vmmplatsupport/src/drivers/virtio_net.c
index fb6ed38..75eebda 100644
--- a/libsel4vmmplatsupport/src/drivers/virtio_net.c
+++ b/libsel4vmmplatsupport/src/drivers/virtio_net.c
@@ -172,26 +172,29 @@
 }
 
 virtio_net_t *common_make_virtio_net(vm_t *vm, vmm_pci_space_t *pci, vmm_io_port_list_t *ioport,
-                                     unsigned int iobase, size_t iobase_size, unsigned int interrupt_pin, unsigned int interrupt_line,
+                                     ioport_range_t ioport_range, ioport_type_t port_type, unsigned int interrupt_pin, unsigned int interrupt_line,
                                      struct raw_iface_funcs backend, bool emulate_bar_access)
 {
-    size_t iobase_size_bits = BYTES_TO_SIZE_BITS(iobase_size);
     int err = ps_new_stdlib_malloc_ops(&ops.malloc_ops);
     ZF_LOGF_IF(err, "Failed to get malloc ops");
-    /* TODO: Bug with 2 pci devices below here */
-    vmm_pci_entry_t entry = vmm_virtio_net_pci_bar(iobase, iobase_size_bits, interrupt_pin, interrupt_line,
-            emulate_bar_access);
-    vmm_pci_add_entry(pci, entry, NULL);
 
     virtio_net_t *net;
     err = ps_calloc(&ops.malloc_ops, 1, sizeof(*net), (void **)&net);
     ZF_LOGF_IF(err, "Failed to allocate virtio net");
 
-    net->iobase = iobase;
-
-    ioport_range_t virtio_io_range = {iobase, iobase + iobase_size};
     ioport_interface_t virtio_io_interface = {net, virtio_net_io_in, virtio_net_io_out, "VIRTIO PCI NET"};
-    vmm_io_port_add_handler(ioport, virtio_io_range, virtio_io_interface);
+    ioport_entry_t * io_entry = vmm_io_port_add_handler(ioport, ioport_range, virtio_io_interface, port_type);
+    if (!io_entry) {
+        ZF_LOGE("Failed to add vmm io port handler");
+        return NULL;
+    }
+
+    size_t iobase_size_bits = BYTES_TO_SIZE_BITS(io_entry->range.size);
+    net->iobase = io_entry->range.start;
+
+    vmm_pci_entry_t entry = vmm_virtio_net_pci_bar(io_entry->range.start, iobase_size_bits, interrupt_pin, interrupt_line,
+            emulate_bar_access);
+    vmm_pci_add_entry(pci, entry, NULL);
 
     ps_io_ops_t ioops;
     ioops.dma_manager = (ps_dma_man_t) {