diff --git a/libsel4simple-default/src/libsel4simple-default.c b/libsel4simple-default/src/libsel4simple-default.c
index 76382f3..89b314c 100644
--- a/libsel4simple-default/src/libsel4simple-default.c
+++ b/libsel4simple-default/src/libsel4simple-default.c
@@ -25,7 +25,8 @@
 #include <vspace/page.h>
 #include <vka/kobject_t.h>
 
-void *simple_default_get_frame_info(void *data, void *paddr, int size_bits, seL4_CPtr *frame_cap, seL4_Word *offset) {
+void *simple_default_get_frame_info(void *data, void *paddr, int size_bits, seL4_CPtr *frame_cap, seL4_Word *offset)
+{
     unsigned int i;
     seL4_BootInfo *bi = (seL4_BootInfo *) data;
     assert(bi && paddr && offset && frame_cap);
@@ -40,7 +41,8 @@
     }
     return NULL;
 }
-seL4_Error simple_default_get_frame_cap(void *data, void *paddr, int size_bits, cspacepath_t *path) {
+seL4_Error simple_default_get_frame_cap(void *data, void *paddr, int size_bits, cspacepath_t *path)
+{
     unsigned int i;
     seL4_BootInfo *bi = (seL4_BootInfo *) data;
     assert(bi && paddr);
@@ -55,30 +57,34 @@
     return seL4_FailedLookup;
 }
 
-void *simple_default_get_frame_mapping(void *data, void *paddr, int size_bits) {
+void *simple_default_get_frame_mapping(void *data, void *paddr, int size_bits)
+{
     return NULL;
 }
 
-seL4_Error simple_default_set_ASID(void *data, seL4_CPtr vspace) {
+seL4_Error simple_default_set_ASID(void *data, seL4_CPtr vspace)
+{
     return seL4_ARCH_ASIDPool_Assign(seL4_CapInitThreadASIDPool, vspace);
 }
 
-int simple_default_cap_count(void *data) {
+int simple_default_cap_count(void *data)
+{
     assert(data);
 
-    seL4_BootInfo * bi = data;
+    seL4_BootInfo *bi = data;
 
-    return   (bi->sharedFrames.end - bi->sharedFrames.start)
+    return (bi->sharedFrames.end - bi->sharedFrames.start)
            + (bi->userImageFrames.end - bi->userImageFrames.start)
            + (bi->userImagePaging.end - bi->userImagePaging.start)
            + (bi->untyped.end - bi->untyped.start)
            + SIMPLE_NUM_INIT_CAPS; //Include all the init caps
 }
 
-seL4_CPtr simple_default_nth_cap(void *data, int n) {
+seL4_CPtr simple_default_nth_cap(void *data, int n)
+{
     assert(data);
 
-    seL4_BootInfo * bi = data;
+    seL4_BootInfo *bi = data;
     size_t shared_frame_range = bi->sharedFrames.end - bi->sharedFrames.start + SIMPLE_NUM_INIT_CAPS;
     size_t user_img_frame_range = bi->userImageFrames.end - bi->userImageFrames.start + shared_frame_range;
     size_t user_img_paging_range = bi->userImagePaging.end - bi->userImagePaging.start + user_img_frame_range;
@@ -88,7 +94,7 @@
 
     if (n < SIMPLE_NUM_INIT_CAPS) {
         /* skip seL4_CapNull */
-        true_return = (seL4_CPtr) n+1;
+        true_return = (seL4_CPtr) n + 1;
 #if !(defined(CONFIG_ARCH_IA32) || defined(CONFIG_ARCH_X86_64))
         /* skip seL4_CapIOPortControl on non-x86 */
         if (true_return >= seL4_CapIOPortControl) {
@@ -114,32 +120,36 @@
     return true_return;
 }
 
-seL4_CPtr simple_default_init_cap(void *data, seL4_CPtr cap_pos) {
+seL4_CPtr simple_default_init_cap(void *data, seL4_CPtr cap_pos)
+{
     return cap_pos;
 }
 
-uint8_t simple_default_cnode_size(void *data) {
+uint8_t simple_default_cnode_size(void *data)
+{
     assert(data);
 
     return ((seL4_BootInfo *)data)->initThreadCNodeSizeBits;
 }
 
-int simple_default_untyped_count(void *data) {
+int simple_default_untyped_count(void *data)
+{
     assert(data);
 
     return ((seL4_BootInfo *)data)->untyped.end - ((seL4_BootInfo *)data)->untyped.start;
 }
 
-seL4_CPtr simple_default_nth_untyped(void *data, int n, size_t *size_bits, uintptr_t *paddr, bool *device) {
+seL4_CPtr simple_default_nth_untyped(void *data, int n, size_t *size_bits, uintptr_t *paddr, bool *device)
+{
     assert(data);
 
     seL4_BootInfo *bi = data;
 
-    if(n < (bi->untyped.end - bi->untyped.start)) {
-        if(paddr != NULL) {
+    if (n < (bi->untyped.end - bi->untyped.start)) {
+        if (paddr != NULL) {
             *paddr = bi->untypedList[n].paddr;
         }
-        if(size_bits != NULL) {
+        if (size_bits != NULL) {
             *size_bits = bi->untypedList[n].sizeBits;
         }
         if (device != NULL) {
@@ -151,31 +161,35 @@
     return seL4_CapNull;
 }
 
-int simple_default_userimage_count(void *data) {
+int simple_default_userimage_count(void *data)
+{
     assert(data);
 
     return ((seL4_BootInfo *)data)->userImageFrames.end - ((seL4_BootInfo *)data)->userImageFrames.start;
 }
 
-seL4_CPtr simple_default_nth_userimage(void *data, int n) {
+seL4_CPtr simple_default_nth_userimage(void *data, int n)
+{
     assert(data);
 
     seL4_BootInfo *bi = data;
 
-    if(n < (bi->userImageFrames.end - bi->userImageFrames.start)) {
+    if (n < (bi->userImageFrames.end - bi->userImageFrames.start)) {
         return bi->userImageFrames.start + (n);
     }
 
     return seL4_CapNull;
 }
 
-int simple_default_core_count(void *data) {
+int simple_default_core_count(void *data)
+{
     assert(data);
 
     return ((seL4_BootInfo *)data)->numNodes;
 }
 
-void simple_default_print(void *data) {
+void simple_default_print(void *data)
+{
     if (data == NULL) {
         ZF_LOGE("Data is null!");
     }
@@ -194,7 +208,8 @@
 #endif
 }
 
-ssize_t simple_default_get_extended_bootinfo_size(void *data, seL4_Word type) {
+ssize_t simple_default_get_extended_bootinfo_size(void *data, seL4_Word type)
+{
     if (data == NULL) {
         ZF_LOGE("Data is null!");
         return -1;
@@ -205,7 +220,7 @@
     uintptr_t cur = (uintptr_t)bi + PAGE_SIZE_4K;
     uintptr_t end = cur + bi->extraLen;
     while (cur < end) {
-        seL4_BootInfoHeader *header = (seL4_BootInfoHeader*)cur;
+        seL4_BootInfoHeader *header = (seL4_BootInfoHeader *)cur;
         if (header->id == type) {
             return header->len;
         }
@@ -214,7 +229,8 @@
     return -1;
 }
 
-ssize_t simple_default_get_extended_bootinfo(void *data, seL4_Word type, void *dest, ssize_t max_len) {
+ssize_t simple_default_get_extended_bootinfo(void *data, seL4_Word type, void *dest, ssize_t max_len)
+{
     assert(data);
     seL4_BootInfo *bi = data;
 
@@ -226,10 +242,10 @@
     uintptr_t cur = (uintptr_t)bi + PAGE_SIZE_4K;
     uintptr_t end = cur + bi->extraLen;
     while (cur < end) {
-        seL4_BootInfoHeader *header = (seL4_BootInfoHeader*)cur;
+        seL4_BootInfoHeader *header = (seL4_BootInfoHeader *)cur;
         if (header->id == type) {
             ssize_t copy_len = MIN(header->len, max_len);
-            memcpy(dest, (void*)cur, copy_len);
+            memcpy(dest, (void *)cur, copy_len);
             return copy_len;
         }
         cur += header->len;
@@ -237,7 +253,8 @@
     return -1;
 }
 
-void simple_default_init_bootinfo(simple_t *simple, seL4_BootInfo *bi) {
+void simple_default_init_bootinfo(simple_t *simple, seL4_BootInfo *bi)
+{
     assert(simple);
     assert(bi);
 
