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);
}
