diff --git a/src/boot/main.cpp b/src/boot/main.cpp index b41e907..0588817 100644 --- a/src/boot/main.cpp +++ b/src/boot/main.cpp @@ -94,34 +94,14 @@ bootloader_main_uefi(uefi::system_table *st, console &con) memory::init_pointer_fixup(bs, rs); - void *acpi_table = hw::find_acpi_table(st); + kernel::args::header *args = + memory::allocate_args_structure(bs, max_modules); - kernel::args::header *args = nullptr; - kernel::args::module *modules = nullptr; + args->magic = kernel::args::magic; + args->version = kernel::args::version; + args->runtime_services = rs; + args->acpi_table = hw::find_acpi_table(st); - { - status_line status(L"Setting up kernel args memory"); - - size_t args_size = - sizeof(kernel::args::header) + // The header itself - max_modules * sizeof(kernel::args::module); // The module structures - - try_or_raise( - bs->allocate_pool( - uefi::memory_type::loader_data, - args_size, - reinterpret_cast(&args)), - L"Could not allocate argument memory"); - - modules = reinterpret_cast(args + 1); - - args->magic = kernel::args::magic; - args->version = kernel::args::version; - args->runtime_services = rs; - args->acpi_table = reinterpret_cast(acpi_table); - args->modules = modules; - args->num_modules = 0; - } { status_line status(L"Loading modules"); @@ -132,7 +112,7 @@ bootloader_main_uefi(uefi::system_table *st, console &con) status_line status(L"Loading initrd into memory"); status_line::warn(L"I can't even"); - kernel::args::module &initrd = modules[args->num_modules++]; + kernel::args::module &initrd = args->modules[args->num_modules++]; initrd.type = kernel::args::type::initrd; } } diff --git a/src/boot/memory.cpp b/src/boot/memory.cpp index d5af3f6..be75b8d 100644 --- a/src/boot/memory.cpp +++ b/src/boot/memory.cpp @@ -233,5 +233,33 @@ memory_virtualize(EFI_RUNTIME_SERVICES *runsvc, struct memory_map *map) } */ +kernel::args::header * +allocate_args_structure(uefi::boot_services *bs, size_t max_modules) +{ + status_line status(L"Setting up kernel args memory"); + + kernel::args::header *args = nullptr; + + size_t args_size = + sizeof(kernel::args::header) + // The header itself + max_modules * sizeof(kernel::args::module); // The module structures + + try_or_raise( + bs->allocate_pool( + uefi::memory_type::loader_data, + args_size, + reinterpret_cast(&args)), + L"Could not allocate argument memory"); + + bs->set_mem(args, args_size, 0); + + args->modules = + reinterpret_cast(args + 1); + args->num_modules = 0; + + return args; +} + + } // namespace boot } // namespace memory diff --git a/src/boot/memory.h b/src/boot/memory.h index ce4b301..c65563e 100644 --- a/src/boot/memory.h +++ b/src/boot/memory.h @@ -2,6 +2,7 @@ #include #include #include +#include "kernel_args.h" namespace boot { namespace memory { @@ -9,6 +10,8 @@ namespace memory { void init_pointer_fixup(uefi::boot_services *bs, uefi::runtime_services *rs); void mark_pointer_fixup(void **p); +kernel::args::header * allocate_args_structure(uefi::boot_services *bs, size_t max_modules); + /* extern const EFI_MEMORY_TYPE memtype_kernel; extern const EFI_MEMORY_TYPE memtype_data;