limine: Use arrays of pointers over arrays of structs

This commit is contained in:
mintsuki 2022-03-20 20:28:44 +01:00
parent 414fb38492
commit 80ba39503d
3 changed files with 34 additions and 16 deletions

View File

@ -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 {

View File

@ -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

View File

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