diff --git a/kernel/src/init/InitRD.cpp b/kernel/src/init/InitRD.cpp index c3dfb9d4..efde2eff 100644 --- a/kernel/src/init/InitRD.cpp +++ b/kernel/src/init/InitRD.cpp @@ -1,6 +1,9 @@ +#define MODULE "initrd" + #include "init/InitRD.h" #include "bootboot.h" #include "io/Serial.h" +#include "log/Log.h" #include "memory/KernelMemoryManager.h" #include "std/stdlib.h" #include @@ -39,7 +42,8 @@ InitRD::File InitRD::get_file(TarHeader* header) result.size += (multiplier * (header->size[i] - 48)); multiplier *= 8; } - result.addr = KernelMemoryManager::get_unaligned_mappings((void*)(header + TAR_BLOCKSIZE), result.size / 4096 + 1); + result.addr = + KernelMemoryManager::get_unaligned_mappings((void*)((uint64_t)header + TAR_BLOCKSIZE), result.size / 4096 + 1); result.size_in_blocks = result.size / TAR_BLOCKSIZE + 1; return result; } @@ -56,13 +60,17 @@ InitRD::File InitRD::open(const char* filename) while (block < total_blocks) { TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block)); - block++; - if (hdr->typeflag == 53) { continue; } // Directory - if (!is_valid_header(hdr)) { continue; } + if (hdr->typeflag == 53 || !is_valid_header(hdr)) + { + block++; + KernelMemoryManager::release_unaligned_mapping(hdr); + continue; + } auto f = get_file(hdr); KernelMemoryManager::release_unaligned_mapping(hdr); if (strncmp(hdr->name, filename, strlen(filename)) == 0) { return f; } - block += get_file_size_in_blocks(f); + block += get_file_size_in_blocks(f) + 1; + close(f); } File nullFile; nullFile.addr = NULL; @@ -83,19 +91,14 @@ void InitRD::for_each(void (*callback)(File& f)) while (block < total_blocks) { TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block)); - block++; - if (hdr->typeflag == 53) - { - KernelMemoryManager::release_unaligned_mapping(hdr); - continue; - } // Directory - if (!is_valid_header(hdr)) + if (hdr->typeflag == 53 || !is_valid_header(hdr)) { + block++; KernelMemoryManager::release_unaligned_mapping(hdr); continue; } auto f = get_file(hdr); - block += get_file_size_in_blocks(f); + block += get_file_size_in_blocks(f) + 1; KernelMemoryManager::release_unaligned_mapping(hdr); callback(f); close(f); diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp index 0202954a..fbf531d8 100644 --- a/kernel/src/main.cpp +++ b/kernel/src/main.cpp @@ -6,6 +6,7 @@ #include "cpu/CPU.h" #include "gdt/GDT.h" #include "init/Init.h" +#include "init/InitRD.h" #include "interrupts/IDT.h" #include "interrupts/Install.h" #include "interrupts/Interrupts.h" @@ -65,8 +66,6 @@ extern "C" void _start() kinfoln("Interrupts enabled"); - ASSERT(TextRenderer::try_initialize()); - ACPI::SDTHeader* rootSDT = ACPI::GetRSDTOrXSDT(); bool isXSDT = ACPI::IsXSDT(); if (!ACPI::ValidateRSDTOrXSDT(rootSDT)) kerrorln("Invalid %s", isXSDT ? "XSDT" : "RSDT"); diff --git a/kernel/src/memory/KernelMemoryManager.cpp b/kernel/src/memory/KernelMemoryManager.cpp index ed93f4e1..8888e4e2 100644 --- a/kernel/src/memory/KernelMemoryManager.cpp +++ b/kernel/src/memory/KernelMemoryManager.cpp @@ -34,17 +34,20 @@ void KernelMemoryManager::release_unaligned_mapping(void* mapping) { uint64_t offset = (uint64_t)mapping % 4096; kernelVMM.unmap((uint64_t)mapping - offset); + KernelHeap::free_virtual_page((uint64_t)mapping - offset); } void KernelMemoryManager::release_unaligned_mappings(void* mapping, uint64_t count) { uint64_t offset = (uint64_t)mapping % 4096; + KernelHeap::free_virtual_pages((uint64_t)mapping - offset, count); for (uint64_t i = 0; i < count; i++) { kernelVMM.unmap(((uint64_t)mapping - offset) + (i * 4096)); } } void KernelMemoryManager::release_mapping(void* mapping) { kernelVMM.unmap((uint64_t)mapping); + KernelHeap::free_virtual_page((uint64_t)mapping); } void* KernelMemoryManager::get_page()