diff --git a/modules.yaml b/modules.yaml index 031f148..acb897f 100644 --- a/modules.yaml +++ b/modules.yaml @@ -58,6 +58,7 @@ modules: - src/boot/main.cpp - src/boot/console.cpp - src/boot/error.cpp + - src/boot/fs.cpp - src/boot/hardware.cpp - src/boot/memory.cpp diff --git a/src/boot/fs.cpp b/src/boot/fs.cpp new file mode 100644 index 0000000..b789fc2 --- /dev/null +++ b/src/boot/fs.cpp @@ -0,0 +1,65 @@ +#include +#include +#include + +#include "fs.h" +#include "console.h" +#include "error.h" + +namespace boot { +namespace fs { + +file::file(uefi::protos::file *f) : + m_file(f) +{ +} + +file::file(file &&o) : + m_file(o.m_file) +{ + o.m_file = nullptr; +} + +file +file::open(const wchar_t *path) +{ + uefi::protos::file *fh = nullptr; + + try_or_raise( + m_file->open(&fh, path, uefi::file_mode::read, uefi::file_attr::none), + L"Could not open relative path to file"); + + return file(fh); +} + +file +get_boot_volume(uefi::handle image, uefi::boot_services *bs) +{ + status_line status(L"Looking up boot volume"); + + const uefi::guid le_guid = uefi::protos::loaded_image::guid; + uefi::protos::loaded_image *loaded_image = nullptr; + + try_or_raise( + bs->handle_protocol(image, &le_guid, + reinterpret_cast(&loaded_image)), + L"Could not find currently running UEFI loaded image"); + + const uefi::guid sfs_guid = uefi::protos::simple_file_system::guid; + uefi::protos::simple_file_system *fs; + try_or_raise( + bs->handle_protocol(loaded_image->device_handle, &sfs_guid, + reinterpret_cast(&fs)), + L"Could not find filesystem protocol for boot volume"); + + uefi::protos::file *f; + try_or_raise( + fs->open_volume(&f), + L"Could not open the boot volume"); + + return file(f); +} + +} // namespace fs +} // namespace boot + diff --git a/src/boot/fs.h b/src/boot/fs.h new file mode 100644 index 0000000..b6e7440 --- /dev/null +++ b/src/boot/fs.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include + +namespace boot { +namespace fs { + +class file +{ +public: + file(uefi::protos::file *f); + file(file &&o); + + file open(const wchar_t *path); + +private: + uefi::protos::file *m_file; +}; + +file get_boot_volume(uefi::handle image, uefi::boot_services *bs); + +} // namespace fs +} // namespace boot diff --git a/src/boot/main.cpp b/src/boot/main.cpp index 0588817..19216a3 100644 --- a/src/boot/main.cpp +++ b/src/boot/main.cpp @@ -9,6 +9,7 @@ #include "console.h" #include "error.h" +#include "fs.h" #include "hardware.h" #include "memory.h" @@ -85,7 +86,7 @@ detect_debug_mode(EFI_RUNTIME_SERVICES *run, kernel_args *header) { */ uefi::status -bootloader_main_uefi(uefi::system_table *st, console &con) +bootloader_main_uefi(uefi::handle image, uefi::system_table *st, console &con) { error::uefi_handler handler(con); @@ -102,6 +103,8 @@ bootloader_main_uefi(uefi::system_table *st, console &con) args->runtime_services = rs; 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"); @@ -246,7 +249,7 @@ efi_main(uefi::handle image_handle, uefi::system_table *st) error::cpu_assert_handler handler; console con(st->boot_services, st->con_out); - /*return*/ bootloader_main_uefi(st, con); + /*return*/ bootloader_main_uefi(image_handle, st, con); while(1); return uefi::status::success;