From 5b0cc28bc893eb84a29df71f65af69fb5923cff8 Mon Sep 17 00:00:00 2001 From: Katharina Heidenreich Date: Thu, 2 Jul 2026 20:03:40 +0200 Subject: [PATCH] feat: update step --- kernel/include/util/utility.h | 5 ++++ kernel/src/init/init.cpp | 55 ++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/kernel/include/util/utility.h b/kernel/include/util/utility.h index bf4c3bc..ce1090e 100644 --- a/kernel/include/util/utility.h +++ b/kernel/include/util/utility.h @@ -18,6 +18,11 @@ struct remove_reference { template using remove_reference_t = typename remove_reference::type; +template +inline constexpr bool is_void_v = false; +template<> +inline constexpr bool is_void_v = true; + template constexpr remove_reference_t&& move(T&& value) { return static_cast&&>(value); diff --git a/kernel/src/init/init.cpp b/kernel/src/init/init.cpp index 0b2b9ee..f88396e 100644 --- a/kernel/src/init/init.cpp +++ b/kernel/src/init/init.cpp @@ -6,6 +6,7 @@ #include "memory/allocator.h" #include "memory/pointer.h" #include "memory/sections.h" +#include "util/utility.h" [[maybe_unused]] [[noreturn]] __attribute__((used)) static void halt() { while (true) @@ -18,23 +19,30 @@ } static int step_depth = 0; -template -static void step(const char* name, T&& fn) { + +static void print_step_boundary(const char* prefix, const char* name) { for (int i = 0; i < step_depth; ++i) { print(" "); } - print("Starting "); + print(prefix); print(name); print("\n"); +} + +template +static auto step(const char* name, Fn&& fn) { + print_step_boundary("Starting ", name); ++step_depth; - fn(); - --step_depth; - for (int i = 0; i < step_depth; ++i) { - print(" "); + if constexpr (is_void_v) { + fn(); + --step_depth; + print_step_boundary("Finished ", name); + } else { + auto result = fn(); + --step_depth; + print_step_boundary("Finished ", name); + return result; } - print("Finished "); - print(name); - print("\n"); } template @@ -145,14 +153,9 @@ void PhysicalAllocator::init(const multiboot::tag_mmap* multiboot_info) { } static void setupMemory() { - multiboot::visit_all( - overloaded{ - [](const multiboot::tag_mmap* mem) { - PhysicalAllocator::init(mem); - }, - [](const auto* tag) {} - } - ); + multiboot::visit_all(overloaded{[](const multiboot::tag_mmap* mem) { + PhysicalAllocator::init(mem); + }}); } static paddr_t rsdp_physical_of(const uint8_t* rsdp_payload) { @@ -173,8 +176,7 @@ static acpi::Rsdp findRsdp() { if (!rsdp.has_value()) { rsdp = rsdp_physical_of(tag->rsdp); } - }, - [&](const auto* tag) {} + } } ); @@ -189,18 +191,19 @@ struct AcpiDiscoveryResult { optional madt; }; -static void setupAcpi() { - auto rsdp = findRsdp(); - rsdp.for_each_table(overloaded{[&](const acpi::sdt_header_t* header) { - print(acpi::unfold_signature(header->signature).text); - print("\n"); +static AcpiDiscoveryResult setupAcpi() { + AcpiDiscoveryResult res{}; + res.rsdp = findRsdp(); + res.rsdp->for_each_table(overloaded{[&](const acpi::madt_t* header) { + res.madt = acpi::Madt{header}; }}); + return res; } [[maybe_unused]] [[noreturn]] __attribute__((used)) void init() { initFromLow(); print("Reached init\n"); step("memory", setupMemory); - step("acpi", setupAcpi); + auto acpi = step("acpi", setupAcpi); halt(); }