:: commit 80ba39503d065e4b317cd0e212531bbe5f4b9735

mintsuki <mintsuki@protonmail.com> — 2022-03-20 19:28

parents: 414fb38492

limine: Use arrays of pointers over arrays of structs

diff --git a/common/limine.h b/common/limine.h
index 74716e3f..4e32dba1 100644
--- a/common/limine.h
+++ b/common/limine.h
@@ -83,14 +83,13 @@ struct limine_framebuffer {
     uint8_t unused;
     uint64_t edid_size;
     LIMINE_PTR(void *) edid;
-    uint8_t reserved[256];
 };
 
 struct limine_framebuffer_response {
     uint64_t revision;
 
     uint64_t fbs_count;
-    LIMINE_PTR(struct limine_framebuffer *) fbs;
+    LIMINE_PTR(LIMINE_PTR(struct limine_framebuffer *) *) fbs;
 };
 
 struct limine_framebuffer_request {
@@ -133,7 +132,7 @@ struct limine_smp_response {
     uint32_t flags;
     uint32_t bsp_lapic_id;
     uint64_t cpus_count;
-    LIMINE_PTR(struct limine_smp_info *) cpus;
+    LIMINE_PTR(LIMINE_PTR(struct limine_smp_info *) *) cpus;
 };
 
 struct limine_smp_request {
@@ -160,14 +159,13 @@ struct limine_memmap_entry {
     uint64_t base;
     uint64_t length;
     uint64_t type;
-    uint8_t reserved[256];
 };
 
 struct limine_memmap_response {
     uint64_t revision;
 
     uint64_t entries_count;
-    LIMINE_PTR(struct limine_memmap_entry *) entries;
+    LIMINE_PTR(LIMINE_PTR(struct limine_memmap_entry *) *) entries;
 };
 
 struct limine_memmap_request {
@@ -202,14 +200,13 @@ struct limine_module {
     LIMINE_PTR(char *) path;
     LIMINE_PTR(char *) cmdline;
     LIMINE_PTR(struct limine_file_location *) file_location;
-    uint8_t reserved[256];
 };
 
 struct limine_module_response {
     uint64_t revision;
 
     uint64_t modules_count;
-    LIMINE_PTR(struct limine_module *) modules;
+    LIMINE_PTR(LIMINE_PTR(struct limine_module *) *) modules;
 };
 
 struct limine_module_request {
diff --git a/common/protos/limine.c b/common/protos/limine.c
index 7562c679..7765997e 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -398,8 +398,13 @@ FEAT_START
         fclose(f);
     }
 
+    uint64_t *modules_list = ext_mem_alloc(module_count * sizeof(uint64_t));
+    for (size_t i = 0; i < module_count; i++) {
+        modules_list[i] = reported_addr(&modules[i]);
+    }
+
     module_response->modules_count = module_count;
-    module_response->modules = reported_addr(modules);
+    module_response->modules = reported_addr(modules_list);
 
     module_request->response = reported_addr(module_response);
 FEAT_END
@@ -435,8 +440,6 @@ FEAT_START
 
     // For now we only support 1 framebuffer
     struct limine_framebuffer *fbp = ext_mem_alloc(sizeof(struct limine_framebuffer));
-    framebuffer_response->fbs = reported_addr(fbp);
-    framebuffer_response->fbs_count = 1;
 
     struct edid_info_struct *edid_info = get_edid_info();
     if (edid_info != NULL) {
@@ -457,6 +460,12 @@ FEAT_START
     fbp->blue_mask_size   = fb.blue_mask_size;
     fbp->blue_mask_shift  = fb.blue_mask_shift;
 
+    uint64_t *fb_list = ext_mem_alloc(1 * sizeof(uint64_t));
+    fb_list[0] = reported_addr(fbp);
+
+    framebuffer_response->fbs_count = 1;
+    framebuffer_response->fbs = reported_addr(fb_list);
+
     framebuffer_request->response = reported_addr(framebuffer_response);
 FEAT_END
 
@@ -526,8 +535,14 @@ FEAT_START
 
     smp_response->flags |= (smp_request->flags & LIMINE_SMP_X2APIC) && x2apic_check();
     smp_response->bsp_lapic_id = bsp_lapic_id;
+
+    uint64_t *smp_list = ext_mem_alloc(cpu_count * sizeof(uint64_t));
+    for (size_t i = 0; i < cpu_count; i++) {
+        smp_list[i] = reported_addr(&smp_array[i]);
+    }
+
     smp_response->cpus_count = cpu_count;
-    smp_response->cpus = reported_addr(smp_array);
+    smp_response->cpus = reported_addr(smp_list);
 
     smp_request->response = reported_addr(smp_response);
 FEAT_END
@@ -537,10 +552,12 @@ FEAT_START
     struct limine_memmap_request *memmap_request = get_request(LIMINE_MEMMAP_REQUEST);
     struct limine_memmap_response *memmap_response;
     struct limine_memmap_entry *_memmap;
+    uint64_t *memmap_list;
 
     if (memmap_request != NULL) {
         memmap_response = ext_mem_alloc(sizeof(struct limine_memmap_response));
         _memmap = ext_mem_alloc(sizeof(struct limine_memmap_entry) * MAX_MEMMAP);
+        memmap_list = ext_mem_alloc(MAX_MEMMAP * sizeof(uint64_t));
     }
 
     size_t mmap_entries;
@@ -587,8 +604,12 @@ FEAT_START
         }
     }
 
+    for (size_t i = 0; i < mmap_entries; i++) {
+        memmap_list[i] = reported_addr(&_memmap[i]);
+    }
+
     memmap_response->entries_count = mmap_entries;
-    memmap_response->entries = reported_addr(_memmap);
+    memmap_response->entries = reported_addr(memmap_list);
 
     memmap_request->response = reported_addr(memmap_response);
 FEAT_END
diff --git a/test/limine.c b/test/limine.c
index de679c4b..931bfc95 100644
--- a/test/limine.c
+++ b/test/limine.c
@@ -169,7 +169,7 @@ FEAT_START
     struct limine_memmap_response *memmap_response = memmap_request.response;
     e9_printf("%d memory map entries", memmap_response->entries_count);
     for (size_t i = 0; i < memmap_response->entries_count; i++) {
-        struct limine_memmap_entry *e = &memmap_response->entries[i];
+        struct limine_memmap_entry *e = memmap_response->entries[i];
         e9_printf("%x->%x %s", e->base, e->base + e->length, get_memmap_type(e->type));
     }
 FEAT_END
@@ -183,7 +183,7 @@ FEAT_START
     struct limine_framebuffer_response *fb_response = framebuffer_request.response;
     e9_printf("%d framebuffer(s)", fb_response->fbs_count);
     for (size_t i = 0; i < fb_response->fbs_count; i++) {
-        struct limine_framebuffer *fb = &fb_response->fbs[i];
+        struct limine_framebuffer *fb = fb_response->fbs[i];
         e9_printf("Address: %x", fb->address);
         e9_printf("Width: %d", fb->width);
         e9_printf("Height: %d", fb->height);
@@ -210,7 +210,7 @@ FEAT_START
     struct limine_module_response *module_response = module_request.response;
     e9_printf("%d module(s)", module_response->modules_count);
     for (size_t i = 0; i < module_response->modules_count; i++) {
-        struct limine_module *m = &module_response->modules[i];
+        struct limine_module *m = module_response->modules[i];
 
         e9_printf("Base: %x", m->base);
         e9_printf("Length: %x", m->length);
@@ -273,7 +273,7 @@ FEAT_START
     e9_printf("BSP LAPIC ID: %x", smp_response->bsp_lapic_id);
     e9_printf("CPUs count: %d", smp_response->cpus_count);
     for (size_t i = 0; i < smp_response->cpus_count; i++) {
-        struct limine_smp_info *cpu = &smp_response->cpus[i];
+        struct limine_smp_info *cpu = smp_response->cpus[i];
         e9_printf("Processor ID: %x", cpu->processor_id);
         e9_printf("LAPIC ID: %x", cpu->lapic_id);
     }
tab: 248 wrap: offon