From b9e8030aacae5ee89ee0ca5cfd7c8edd360ac01d Mon Sep 17 00:00:00 2001
From: apio <blobs.trading@gmail.com>
Date: Thu, 16 Mar 2023 23:02:53 +0100
Subject: [PATCH] kernel: Free the initial ramdisk memory after copying
 everything into the VFS

---
 kernel/src/InitRD.cpp               |  6 ++++++
 kernel/src/memory/MemoryManager.cpp | 11 +++++++++++
 kernel/src/memory/MemoryManager.h   |  1 +
 3 files changed, 18 insertions(+)

diff --git a/kernel/src/InitRD.cpp b/kernel/src/InitRD.cpp
index 1a65dae5..ad8d9bdd 100644
--- a/kernel/src/InitRD.cpp
+++ b/kernel/src/InitRD.cpp
@@ -3,7 +3,9 @@
 #include "arch/MMU.h"
 #include "boot/bootboot.h"
 #include "fs/VFS.h"
+#include "memory/MemoryManager.h"
 #include <bits/modes.h>
+#include <luna/Alignment.h>
 
 TarStream g_initrd;
 extern const BOOTBOOT bootboot;
@@ -43,5 +45,9 @@ Result<void> InitRD::populate_vfs()
             TRY(vfs_create_dir_if_not_exists(entry.name, entry.mode));
         }
     }
+
+    // Now we don't need the original initrd anymore
+    MemoryManager::free_frames(bootboot.initrd_ptr, get_blocks_from_size(bootboot.initrd_size, ARCH_PAGE_SIZE));
+
     return {};
 }
diff --git a/kernel/src/memory/MemoryManager.cpp b/kernel/src/memory/MemoryManager.cpp
index 300b5847..4d4d2d20 100644
--- a/kernel/src/memory/MemoryManager.cpp
+++ b/kernel/src/memory/MemoryManager.cpp
@@ -170,6 +170,17 @@ namespace MemoryManager
         return {};
     }
 
+    Result<void> free_frames(u64 address, usize count)
+    {
+        while (count--)
+        {
+            TRY(free_frame(address));
+            address += ARCH_PAGE_SIZE;
+        }
+
+        return {};
+    }
+
     Result<void> remap(u64 address, usize count, int flags)
     {
         CHECK_PAGE_ALIGNED(address);
diff --git a/kernel/src/memory/MemoryManager.h b/kernel/src/memory/MemoryManager.h
index bc2a11c8..98e16267 100644
--- a/kernel/src/memory/MemoryManager.h
+++ b/kernel/src/memory/MemoryManager.h
@@ -11,6 +11,7 @@ namespace MemoryManager
 
     Result<u64> alloc_frame();
     Result<void> free_frame(u64 frame);
+    Result<void> free_frames(u64 address, usize count);
 
     void lock_frame(u64 frame);
     void lock_frames(u64 frames, usize count);