:: commit 1e62d9937432d629690578bf4a818becc172e31b

mintsuki <mintsuki@protonmail.com> — 2022-03-15 20:34

parents: c180b59f96

limine: Add reserved space to size-sensitive structs

diff --git a/common/limine.h b/common/limine.h
index 38a53415..e8aa1f8e 100644
--- a/common/limine.h
+++ b/common/limine.h
@@ -61,6 +61,7 @@ struct limine_framebuffer {
     uint8_t blue_mask_size;
     uint8_t blue_mask_shift;
     uint8_t unused;
+    uint8_t reserved[256];
 };
 
 struct limine_framebuffer_response {
@@ -107,6 +108,7 @@ struct limine_memmap_entry {
     uint64_t base;
     uint64_t length;
     uint64_t type;
+    uint8_t reserved[256];
 };
 
 struct limine_memmap_response {
diff --git a/common/protos/limine.c b/common/protos/limine.c
index eadb6fe1..8e1911fc 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -33,6 +33,7 @@
 #include <limine.h>
 
 #define MAX_REQUESTS 128
+#define MAX_MEMMAP 256
 
 static uint64_t physical_base, virtual_base, slide, direct_map_offset;
 static size_t requests_count;
@@ -299,9 +300,11 @@ FEAT_END
 FEAT_START
     struct limine_memmap_request *memmap_request = get_request(LIMINE_MEMMAP_REQUEST);
     struct limine_memmap_response *memmap_response;
+    struct limine_memmap_entry *_memmap;
 
     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);
     }
 
     size_t mmap_entries;
@@ -311,38 +314,45 @@ FEAT_START
         break; // next feature
     }
 
+    if (mmap_entries > MAX_MEMMAP) {
+        panic(false, "limine: Too many memmap entries");
+    }
+
     for (size_t i = 0; i < mmap_entries; i++) {
+        _memmap[i].base = mmap[i].base;
+        _memmap[i].length = mmap[i].length;
+
         switch (mmap[i].type) {
             case MEMMAP_USABLE:
-                mmap[i].type = LIMINE_MEMMAP_USABLE;
+                _memmap[i].type = LIMINE_MEMMAP_USABLE;
                 break;
             case MEMMAP_ACPI_RECLAIMABLE:
-                mmap[i].type = LIMINE_MEMMAP_ACPI_RECLAIMABLE;
+                _memmap[i].type = LIMINE_MEMMAP_ACPI_RECLAIMABLE;
                 break;
             case MEMMAP_ACPI_NVS:
-                mmap[i].type = LIMINE_MEMMAP_ACPI_NVS;
+                _memmap[i].type = LIMINE_MEMMAP_ACPI_NVS;
                 break;
             case MEMMAP_BAD_MEMORY:
-                mmap[i].type = LIMINE_MEMMAP_BAD_MEMORY;
+                _memmap[i].type = LIMINE_MEMMAP_BAD_MEMORY;
                 break;
             case MEMMAP_BOOTLOADER_RECLAIMABLE:
-                mmap[i].type = LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE;
+                _memmap[i].type = LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE;
                 break;
             case MEMMAP_KERNEL_AND_MODULES:
-                mmap[i].type = LIMINE_MEMMAP_KERNEL_AND_MODULES;
+                _memmap[i].type = LIMINE_MEMMAP_KERNEL_AND_MODULES;
                 break;
             case MEMMAP_FRAMEBUFFER:
-                mmap[i].type = LIMINE_MEMMAP_FRAMEBUFFER;
+                _memmap[i].type = LIMINE_MEMMAP_FRAMEBUFFER;
                 break;
             default:
             case MEMMAP_RESERVED:
-                mmap[i].type = LIMINE_MEMMAP_RESERVED;
+                _memmap[i].type = LIMINE_MEMMAP_RESERVED;
                 break;
         }
     }
 
     memmap_response->entries_count = mmap_entries;
-    memmap_response->entries = reported_addr(mmap);
+    memmap_response->entries = reported_addr(_memmap);
 
     memmap_request->response = reported_addr(memmap_response);
 FEAT_END
tab: 248 wrap: offon