libsel4platsupport: Fix 'new_fdt_ops'

Previously, we assumed that not being able to copy the FDT was a failure
condition. However, on some platforms, this is actually a valid
condition, e.g. x86 or platforms for which the kernel does not have a
DTS for. This commit fixes that assumption so that calling 'fdt_get'
with the interface returns a NULL pointer.
diff --git a/libsel4platsupport/src/io.c b/libsel4platsupport/src/io.c
index ed14c57..52b6944 100644
--- a/libsel4platsupport/src/io.c
+++ b/libsel4platsupport/src/io.c
@@ -291,32 +291,36 @@
     }
 
     ssize_t block_size = simple_get_extended_bootinfo_length(simple, SEL4_BOOTINFO_HEADER_FDT);
+    if (block_size > 0) {
+        int error = ps_calloc(malloc_ops, 1, block_size, &io_fdt->cookie);
+        if (error) {
+            ZF_LOGE("Failed to allocate %zu bytes for the FDT", block_size);
+            return -1;
+        }
 
-    int error = ps_calloc(malloc_ops, 1, block_size, &io_fdt->cookie);
-    if (error) {
-        ZF_LOGE("Failed to allocate %zu bytes for the FDT", block_size);
-        return -1;
+        /* Copy the FDT from the extended bootinfo */
+        ssize_t copied_size = simple_get_extended_bootinfo(simple, SEL4_BOOTINFO_HEADER_FDT,
+                                                           io_fdt->cookie, block_size);
+        if (copied_size != block_size) {
+            ZF_LOGE("Failed to copy the FDT");
+            ZF_LOGF_IF(ps_free(malloc_ops, block_size, io_fdt->cookie),
+                       "Failed to clean-up after a failed operation!");
+            return -1;
+        }
+
+        /* Cut off the bootinfo header from the start of the buffer */
+        ssize_t fdt_size = block_size - sizeof(seL4_BootInfoHeader);
+        void *fdt_start = io_fdt->cookie + sizeof(seL4_BootInfoHeader);
+        memmove(io_fdt->cookie, fdt_start, fdt_size);
+
+        /* Trim off the extra bytes at the end of the FDT */
+        void *fdt_end = io_fdt->cookie + fdt_size;
+        memset(fdt_end, 0, sizeof(seL4_BootInfoHeader));
+    } else {
+        /* No FDT is available so just set the cookie to NULL */
+        io_fdt->cookie = NULL;
     }
 
-    /* Copy the FDT from the extended bootinfo */
-    ssize_t copied_size = simple_get_extended_bootinfo(simple, SEL4_BOOTINFO_HEADER_FDT,
-                                                       io_fdt->cookie, block_size);
-    if (copied_size != block_size) {
-        ZF_LOGE("Failed to copy the FDT");
-        ZF_LOGF_IF(ps_free(malloc_ops, block_size, io_fdt->cookie),
-                   "Failed to clean-up after a failed operation!");
-        return -1;
-    }
-
-    /* Cut off the bootinfo header from the start of the buffer */
-    ssize_t fdt_size = block_size - sizeof(seL4_BootInfoHeader);
-    void *fdt_start = io_fdt->cookie + sizeof(seL4_BootInfoHeader);
-    memmove(io_fdt->cookie, fdt_start, fdt_size);
-
-    /* Trim off the extra bytes at the end of the FDT */
-    void *fdt_end = io_fdt->cookie + fdt_size;
-    memset(fdt_end, 0, sizeof(seL4_BootInfoHeader));
-
     /* Set the function pointer inside the io_fdt interface */
     io_fdt->get_fn = sel4platsupport_io_fdt_get;