diff --git a/kernel/include/init/InitRD.h b/kernel/include/init/InitRD.h index de7df06b..8c6d3c93 100644 --- a/kernel/include/init/InitRD.h +++ b/kernel/include/init/InitRD.h @@ -41,6 +41,7 @@ namespace InitRD bool is_valid_header(TarHeader* header); File open(const char* filename); - void close(File& f); void for_each(void (*callback)(File& file)); + + void init(); } \ No newline at end of file diff --git a/kernel/src/init/Init.cpp b/kernel/src/init/Init.cpp index 2d485b5b..9addffed 100644 --- a/kernel/src/init/Init.cpp +++ b/kernel/src/init/Init.cpp @@ -2,6 +2,7 @@ #include "assert.h" #include "bootboot.h" #include "cpu/CPU.h" +#include "init/InitRD.h" #include "interrupts/Interrupts.h" #include "io/Serial.h" #include "log/Log.h" @@ -42,6 +43,8 @@ void Init::early_init() kernelPMM.init_from_mmap(); kernelVMM.init(); + InitRD::init(); + if (strstr(environment, "quiet=1")) { KernelLog::toggle_log_level(LogLevel::DEBUG); diff --git a/kernel/src/init/InitRD.cpp b/kernel/src/init/InitRD.cpp index efde2eff..22d6c03a 100644 --- a/kernel/src/init/InitRD.cpp +++ b/kernel/src/init/InitRD.cpp @@ -10,6 +10,8 @@ extern BOOTBOOT bootboot; +static void* initrd_base; + static inline int get_file_size_in_blocks(InitRD::File f) { return f.size_in_blocks; @@ -22,7 +24,7 @@ inline int InitRD::get_total_blocks() inline InitRD::TarHeader* InitRD::get_block(int block_index) { - return (TarHeader*)(bootboot.initrd_ptr + block_index * TAR_BLOCKSIZE); + return (TarHeader*)((uintptr_t)initrd_base + block_index * TAR_BLOCKSIZE); } inline bool InitRD::is_valid_header(TarHeader* header) @@ -42,35 +44,26 @@ InitRD::File InitRD::get_file(TarHeader* header) result.size += (multiplier * (header->size[i] - 48)); multiplier *= 8; } - 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; + result.addr = (void*)((uint64_t)header + TAR_BLOCKSIZE); + result.size_in_blocks = (result.size + (TAR_BLOCKSIZE - 1)) / TAR_BLOCKSIZE; return result; } -void InitRD::free_file(File& file) -{ - KernelMemoryManager::release_unaligned_mappings(file.addr, file.size / 4096 + 1); -} - InitRD::File InitRD::open(const char* filename) { int block = 0; int total_blocks = get_total_blocks(); while (block < total_blocks) { - TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block)); + TarHeader* hdr = (TarHeader*)get_block(block); 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) + 1; - close(f); } File nullFile; nullFile.addr = NULL; @@ -79,28 +72,26 @@ InitRD::File InitRD::open(const char* filename) return nullFile; } -void InitRD::close(File& file) -{ - free_file(file); -} - void InitRD::for_each(void (*callback)(File& f)) { int block = 0; int total_blocks = get_total_blocks(); while (block < total_blocks) { - TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block)); + TarHeader* hdr = (TarHeader*)get_block(block); 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) + 1; - KernelMemoryManager::release_unaligned_mapping(hdr); callback(f); - close(f); } +} + +void InitRD::init() +{ + initrd_base = + KernelMemoryManager::get_unaligned_mappings((void*)bootboot.initrd_ptr, bootboot.initrd_size / 4096 + 1); } \ No newline at end of file