aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/mm
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mm')
-rw-r--r--kernel/mm/pmm.cpp80
1 files changed, 41 insertions, 39 deletions
diff --git a/kernel/mm/pmm.cpp b/kernel/mm/pmm.cpp
index bd8f12c..632bc1d 100644
--- a/kernel/mm/pmm.cpp
+++ b/kernel/mm/pmm.cpp
@@ -1,55 +1,57 @@
#include <mm/pmm.h>
+#include <kernel.h>
#include <stdio.h>
-PBitmap bitmap;
+pmm_list_node* head;
+pmm_list_node* tail;
-// Finds the biggest chunk of memory
-static MMEntry find_mem_chunk(limine_memmap_response* memmap) {
- uint64_t highestmem = 0;
- size_t highestindex = 0;
- limine_memmap_entry* entries = memmap->entries[0];
+void pmm_init(limine_memmap_response* memmap) {
for (size_t i = 0; i < memmap->entry_count; i++) {
- if (entries[i].type == LIMINE_MEMMAP_USABLE && entries[i].length > highestmem) {
- highestmem = entries[i].length;
- highestindex = i;
+ if (memmap->entries[i]->type != LIMINE_MEMMAP_USABLE) {
+ continue;
}
- }
-
- return MMEntry{
- entries[highestindex].base,
- entries[highestindex].length,
- MEM_USABLE
- };
-}
-void pmm_init(limine_memmap_response* memmap, uint64_t hhdm_offset) {
- MMEntry mem_entry = find_mem_chunk(memmap);
-
- // Round any numbers needed to 4K boudaries
- //mem_entry.base += 4096 - (mem_entry.base % 4096);
- mem_entry.length -= mem_entry.length % 4096;
-
- // setup bitmap at the beginning of the chunk
- bitmap.entry = mem_entry;
- bitmap.addr = (uint64_t*)(bitmap.entry.base + hhdm_offset);
- // divided by byte size since size is for iterating over the bitmap
- bitmap.size = mem_entry.length / 4096 / sizeof(uint64_t);
+ // Puts a node into each page of usable physical memory
+
+ if (head != nullptr) {
+ head->next = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset);
+ }
- printf("addr: %lx\nsize: %lx\n", (uint64_t)bitmap.addr, bitmap.size);
- printf("hhdm offset: %lx\n", hhdm_offset);
+ if (tail != nullptr) {
+ tail = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset);
+ }
- // write test
- for (size_t i = 0; i < 100; i++) {
- bitmap.addr[i] = i;
- //printf("value %d: %lx\n", i, bitmap.addr[i]);
+ for (size_t j = 0; j < memmap->entries[i]->length; j += 0x1000) {
+ pmm_list_node* page = (pmm_list_node*)(memmap->entries[i]->base + j + _hhdm_offset);
+ //head->next = page;
+ page->next = page + 0x1000;
+ head = page;
+ //tail = page;
+ }
}
- // read test
- for (size_t i = 0; i < bitmap.size; i++) {
- //printf("value %d: %lx\n");
+ // sets head->next to first set page
+ for (size_t i = 0; i < memmap->entry_count; i++) {
+ if (memmap->entries[i] == LIMINE_MEMMAP_USABLE) {
+ head->next = tail;
+ // head = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset);
+ //tail->next = head;
+ break;
+ }
}
+
+ printf("Initialized PMM\n");
}
-uint64_t get_phys_page() {
+void* palloc() {
+ pmm_list_node* node = head;
+ printf("Head: %lx\nNext: %lx\n", head, head->next);
+ head = head->next;
+ return node;
+}
+void pfree(void* page) {
+ pmm_list_node* node = (pmm_list_node*)page + _hhdm_offset;
+ node->next = head;
+ head = node;
} \ No newline at end of file