From d94907ae79cbbb874b47bfedfc3a18cd89317824 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Tue, 25 Feb 2020 22:22:12 -0800 Subject: [PATCH] Loading files --- src/boot/fs.cpp | 61 ++++++++++++++++++++++++++++++++++++++++----- src/boot/fs.h | 9 ++++++- src/boot/main.cpp | 17 ++++++++----- src/boot/memory.cpp | 4 +-- src/boot/memory.h | 6 +++++ 5 files changed, 82 insertions(+), 15 deletions(-) diff --git a/src/boot/fs.cpp b/src/boot/fs.cpp index b789fc2..a479105 100644 --- a/src/boot/fs.cpp +++ b/src/boot/fs.cpp @@ -1,25 +1,43 @@ #include +#include +#include #include #include #include "fs.h" #include "console.h" #include "error.h" +#include "memory.h" namespace boot { namespace fs { -file::file(uefi::protos::file *f) : - m_file(f) +file::file(uefi::protos::file *f, uefi::boot_services *bs) : + m_file(f), + m_bs(bs) { } -file::file(file &&o) : - m_file(o.m_file) +file::file(file &o) : + m_file(o.m_file), + m_bs(o.m_bs) { o.m_file = nullptr; } +file::file(file &&o) : + m_file(o.m_file), + m_bs(o.m_bs) +{ + o.m_file = nullptr; +} + +file::~file() +{ + if (m_file) + m_file->close(); +} + file file::open(const wchar_t *path) { @@ -29,7 +47,38 @@ file::open(const wchar_t *path) m_file->open(&fh, path, uefi::file_mode::read, uefi::file_attr::none), L"Could not open relative path to file"); - return file(fh); + return file(fh, m_bs); +} + +void * +file::load(size_t *out_size) +{ + uint8_t buffer[sizeof(uefi::protos::file_info) + 100]; + size_t size = sizeof(buffer); + uefi::guid info_guid = uefi::protos::file_info::guid; + + try_or_raise( + m_file->get_info(&info_guid, &size, &buffer), + L"Could not get file info"); + + uefi::protos::file_info *info = + reinterpret_cast(&buffer); + + size_t pages = memory::bytes_to_pages(info->file_size); + void *data = nullptr; + try_or_raise( + m_bs->allocate_pages( + uefi::allocate_type::any_pages, + uefi::memory_type::loader_data, + pages, &data), + L"Could not allocate pages to load file"); + + try_or_raise( + m_file->read(&size, data), + L"Could not read from file"); + + *out_size = size; + return data; } file @@ -57,7 +106,7 @@ get_boot_volume(uefi::handle image, uefi::boot_services *bs) fs->open_volume(&f), L"Could not open the boot volume"); - return file(f); + return file(f, bs); } } // namespace fs diff --git a/src/boot/fs.h b/src/boot/fs.h index b6e7440..fcd87ab 100644 --- a/src/boot/fs.h +++ b/src/boot/fs.h @@ -10,13 +10,20 @@ namespace fs { class file { public: - file(uefi::protos::file *f); file(file &&o); + file(file &o); + ~file(); file open(const wchar_t *path); + void * load(size_t *out_size); private: + friend file get_boot_volume(uefi::handle, uefi::boot_services*); + + file(uefi::protos::file *f, uefi::boot_services *bs); + uefi::protos::file *m_file; + uefi::boot_services *m_bs; }; file get_boot_volume(uefi::handle image, uefi::boot_services *bs); diff --git a/src/boot/main.cpp b/src/boot/main.cpp index 19216a3..746269f 100644 --- a/src/boot/main.cpp +++ b/src/boot/main.cpp @@ -104,19 +104,24 @@ bootloader_main_uefi(uefi::handle image, uefi::system_table *st, console &con) args->acpi_table = hw::find_acpi_table(st); fs::file disk = fs::get_boot_volume(image, bs); - fs::file kernel = disk.open(L"jsix.elf"); { status_line status(L"Loading modules"); { - status_line status(L"Finding boot device"); + status_line status(L"initrd"); + + fs::file file = disk.open(L"initrd.img"); + kernel::args::module &module = args->modules[args->num_modules++]; + module.type = kernel::args::type::initrd; + module.location = file.load(&module.size); } { - status_line status(L"Loading initrd into memory"); - status_line::warn(L"I can't even"); + status_line status(L"kernel"); - kernel::args::module &initrd = args->modules[args->num_modules++]; - initrd.type = kernel::args::type::initrd; + fs::file file = disk.open(L"jsix.elf"); + kernel::args::module &module = args->modules[args->num_modules++]; + module.type = kernel::args::type::kernel; + module.location = file.load(&module.size); } } diff --git a/src/boot/memory.cpp b/src/boot/memory.cpp index be75b8d..b10c501 100644 --- a/src/boot/memory.cpp +++ b/src/boot/memory.cpp @@ -88,7 +88,7 @@ init_pointer_fixup(uefi::boot_services *bs, uefi::runtime_services *rs) // Reserve a page for our replacement PML4, plus some pages for the kernel to use // as page tables while it gets started. - uintptr_t addr = 0; + void *addr = nullptr; try_or_raise( bs->allocate_pages( uefi::allocate_type::any_pages, @@ -97,7 +97,7 @@ init_pointer_fixup(uefi::boot_services *bs, uefi::runtime_services *rs) &addr), L"Error allocating page table pages."); - new_pml4 = (uint64_t *)addr; + new_pml4 = reinterpret_cast(addr); } void diff --git a/src/boot/memory.h b/src/boot/memory.h index c65563e..7d06cf9 100644 --- a/src/boot/memory.h +++ b/src/boot/memory.h @@ -7,6 +7,12 @@ namespace boot { namespace memory { +constexpr size_t page_size = 0x1000; + +inline constexpr size_t bytes_to_pages(size_t bytes) { + return ((bytes - 1) / page_size) + 1; +} + void init_pointer_fixup(uefi::boot_services *bs, uefi::runtime_services *rs); void mark_pointer_fixup(void **p);