I.... think I fixed the initrd code?
This commit is contained in:
parent
245d5e514d
commit
31460fe148
@ -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();
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user