commit
This commit is contained in:
parent
0cb59ee17f
commit
db4c8e96b8
@ -1,6 +1,9 @@
|
|||||||
|
#define MODULE "initrd"
|
||||||
|
|
||||||
#include "init/InitRD.h"
|
#include "init/InitRD.h"
|
||||||
#include "bootboot.h"
|
#include "bootboot.h"
|
||||||
#include "io/Serial.h"
|
#include "io/Serial.h"
|
||||||
|
#include "log/Log.h"
|
||||||
#include "memory/KernelMemoryManager.h"
|
#include "memory/KernelMemoryManager.h"
|
||||||
#include "std/stdlib.h"
|
#include "std/stdlib.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -39,7 +42,8 @@ InitRD::File InitRD::get_file(TarHeader* header)
|
|||||||
result.size += (multiplier * (header->size[i] - 48));
|
result.size += (multiplier * (header->size[i] - 48));
|
||||||
multiplier *= 8;
|
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;
|
result.size_in_blocks = result.size / TAR_BLOCKSIZE + 1;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -56,13 +60,17 @@ InitRD::File InitRD::open(const char* filename)
|
|||||||
while (block < total_blocks)
|
while (block < total_blocks)
|
||||||
{
|
{
|
||||||
TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block));
|
TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block));
|
||||||
|
if (hdr->typeflag == 53 || !is_valid_header(hdr))
|
||||||
|
{
|
||||||
block++;
|
block++;
|
||||||
if (hdr->typeflag == 53) { continue; } // Directory
|
KernelMemoryManager::release_unaligned_mapping(hdr);
|
||||||
if (!is_valid_header(hdr)) { continue; }
|
continue;
|
||||||
|
}
|
||||||
auto f = get_file(hdr);
|
auto f = get_file(hdr);
|
||||||
KernelMemoryManager::release_unaligned_mapping(hdr);
|
KernelMemoryManager::release_unaligned_mapping(hdr);
|
||||||
if (strncmp(hdr->name, filename, strlen(filename)) == 0) { return f; }
|
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;
|
File nullFile;
|
||||||
nullFile.addr = NULL;
|
nullFile.addr = NULL;
|
||||||
@ -83,19 +91,14 @@ void InitRD::for_each(void (*callback)(File& f))
|
|||||||
while (block < total_blocks)
|
while (block < total_blocks)
|
||||||
{
|
{
|
||||||
TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block));
|
TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block));
|
||||||
|
if (hdr->typeflag == 53 || !is_valid_header(hdr))
|
||||||
|
{
|
||||||
block++;
|
block++;
|
||||||
if (hdr->typeflag == 53)
|
|
||||||
{
|
|
||||||
KernelMemoryManager::release_unaligned_mapping(hdr);
|
|
||||||
continue;
|
|
||||||
} // Directory
|
|
||||||
if (!is_valid_header(hdr))
|
|
||||||
{
|
|
||||||
KernelMemoryManager::release_unaligned_mapping(hdr);
|
KernelMemoryManager::release_unaligned_mapping(hdr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto f = get_file(hdr);
|
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);
|
KernelMemoryManager::release_unaligned_mapping(hdr);
|
||||||
callback(f);
|
callback(f);
|
||||||
close(f);
|
close(f);
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "cpu/CPU.h"
|
#include "cpu/CPU.h"
|
||||||
#include "gdt/GDT.h"
|
#include "gdt/GDT.h"
|
||||||
#include "init/Init.h"
|
#include "init/Init.h"
|
||||||
|
#include "init/InitRD.h"
|
||||||
#include "interrupts/IDT.h"
|
#include "interrupts/IDT.h"
|
||||||
#include "interrupts/Install.h"
|
#include "interrupts/Install.h"
|
||||||
#include "interrupts/Interrupts.h"
|
#include "interrupts/Interrupts.h"
|
||||||
@ -65,8 +66,6 @@ extern "C" void _start()
|
|||||||
|
|
||||||
kinfoln("Interrupts enabled");
|
kinfoln("Interrupts enabled");
|
||||||
|
|
||||||
ASSERT(TextRenderer::try_initialize());
|
|
||||||
|
|
||||||
ACPI::SDTHeader* rootSDT = ACPI::GetRSDTOrXSDT();
|
ACPI::SDTHeader* rootSDT = ACPI::GetRSDTOrXSDT();
|
||||||
bool isXSDT = ACPI::IsXSDT();
|
bool isXSDT = ACPI::IsXSDT();
|
||||||
if (!ACPI::ValidateRSDTOrXSDT(rootSDT)) kerrorln("Invalid %s", isXSDT ? "XSDT" : "RSDT");
|
if (!ACPI::ValidateRSDTOrXSDT(rootSDT)) kerrorln("Invalid %s", isXSDT ? "XSDT" : "RSDT");
|
||||||
|
@ -34,17 +34,20 @@ void KernelMemoryManager::release_unaligned_mapping(void* mapping)
|
|||||||
{
|
{
|
||||||
uint64_t offset = (uint64_t)mapping % 4096;
|
uint64_t offset = (uint64_t)mapping % 4096;
|
||||||
kernelVMM.unmap((uint64_t)mapping - offset);
|
kernelVMM.unmap((uint64_t)mapping - offset);
|
||||||
|
KernelHeap::free_virtual_page((uint64_t)mapping - offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void KernelMemoryManager::release_unaligned_mappings(void* mapping, uint64_t count)
|
void KernelMemoryManager::release_unaligned_mappings(void* mapping, uint64_t count)
|
||||||
{
|
{
|
||||||
uint64_t offset = (uint64_t)mapping % 4096;
|
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)); }
|
for (uint64_t i = 0; i < count; i++) { kernelVMM.unmap(((uint64_t)mapping - offset) + (i * 4096)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void KernelMemoryManager::release_mapping(void* mapping)
|
void KernelMemoryManager::release_mapping(void* mapping)
|
||||||
{
|
{
|
||||||
kernelVMM.unmap((uint64_t)mapping);
|
kernelVMM.unmap((uint64_t)mapping);
|
||||||
|
KernelHeap::free_virtual_page((uint64_t)mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* KernelMemoryManager::get_page()
|
void* KernelMemoryManager::get_page()
|
||||||
|
Loading…
Reference in New Issue
Block a user