diff options
| author | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2025-01-21 19:30:30 -0500 |
|---|---|---|
| committer | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2025-01-21 19:30:30 -0500 |
| commit | 360a38f3be9c7e45c407ff65736d8098f5ca658b (patch) | |
| tree | e122382abdc8c278e1c4d19cfa6f8939eb627b65 /kernel/mm/pmm.cpp | |
| parent | 0cfee3a1a16d3b04829a646b94e45685ee878876 (diff) | |
Diffstat (limited to 'kernel/mm/pmm.cpp')
| -rw-r--r-- | kernel/mm/pmm.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/kernel/mm/pmm.cpp b/kernel/mm/pmm.cpp index 685f038..d25e673 100644 --- a/kernel/mm/pmm.cpp +++ b/kernel/mm/pmm.cpp @@ -2,8 +2,13 @@ #include <kernel.h> #include <stdio.h> +#define PAGE_SIZE 0x1000ul +// makes sure double frees aren't happening (probably) +#define PMM_MAGIC_NUM 0xE1321ul + struct freelist { freelist* next = nullptr; + uint64_t magic_num; }; freelist* head = nullptr; @@ -15,8 +20,9 @@ void pmm_init(limine_memmap_response* memmap) { if (memmap->entries[i]->type == LIMINE_MEMMAP_USABLE) { printf("%d\n", i); // iterates through all addresses - for (uint64_t addr = memmap->entries[i]->base; addr < (memmap->entries[i]->length + memmap->entries[i]->base); addr += 0x1000ul) { + for (uint64_t addr = memmap->entries[i]->base; addr < (memmap->entries[i]->length + memmap->entries[i]->base); addr += PAGE_SIZE) { freelist* temp = (freelist*)(addr + _hhdm_offset); + temp->magic_num = PMM_MAGIC_NUM; if (head) { temp->next = head; head = temp; @@ -33,12 +39,20 @@ void pmm_init(limine_memmap_response* memmap) { uint64_t page_alloc() { freelist* alloced = head; + alloced->magic_num = 0; head = head->next; return (uint64_t)alloced; } void page_free(uint64_t page) { freelist* freed = (freelist*)page; + + // double free check + if (freed->magic_num == PMM_MAGIC_NUM) { + return; + } + freed->next = head; + freed->magic_num = PMM_MAGIC_NUM; head = freed; }
\ No newline at end of file |
