aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/mm/pmm.cpp
diff options
context:
space:
mode:
authorEmu <89668582+EmulatedSeasons@users.noreply.github.com>2024-05-31 23:38:46 -0400
committerGitHub <noreply@github.com>2024-05-31 23:38:46 -0400
commit27a44e0d79d1c6e01cd832feb8ad958d5999b5e3 (patch)
tree3759eb02fcad7a609a064080d81b7c6f9dbec4c8 /kernel/mm/pmm.cpp
parent639240bbf498195912d8ceb6cb396b89391a5b1b (diff)
parentfd5a1699592ce0afafc42ebf22401596abcdfc28 (diff)
Merge pull request #1 from EmulatedSeasons/limineswitch
Limineswitch
Diffstat (limited to 'kernel/mm/pmm.cpp')
-rw-r--r--kernel/mm/pmm.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/kernel/mm/pmm.cpp b/kernel/mm/pmm.cpp
new file mode 100644
index 0000000..bd8f12c
--- /dev/null
+++ b/kernel/mm/pmm.cpp
@@ -0,0 +1,55 @@
+#include <mm/pmm.h>
+#include <stdio.h>
+
+PBitmap bitmap;
+
+// 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];
+ 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;
+ }
+ }
+
+ 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);
+
+ printf("addr: %lx\nsize: %lx\n", (uint64_t)bitmap.addr, bitmap.size);
+ printf("hhdm offset: %lx\n", 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]);
+ }
+
+ // read test
+ for (size_t i = 0; i < bitmap.size; i++) {
+ //printf("value %d: %lx\n");
+ }
+}
+
+uint64_t get_phys_page() {
+
+} \ No newline at end of file