#include #include #include #include #include #include #include #include #include #include #include namespace kapi::devices { namespace { auto static constinit cpu_bus = kstd::shared_ptr{}; } extern "C" { // We need to suppress clang-tidy linting warnings here, since these symbols are generated by the linker and we // cannot choose their names, unless we want to write a bht linker script for no reason. Additionally, these symbols // need to be arrays, because otherwise any pointer arithmetic on them, beyond trivial cases of adding 0 or 1, is // undefined behavior by the rules of the C++ abstract machine. To ensure the compiler does not try to perform // constant folding, the pointers, these arrays of unknown bound decay to, need to be laundered before dereferencing // them. // NOLINTBEGIN(readability-identifier-naming) extern kstd::observer_ptr const __start_platform_drivers[]; extern kstd::observer_ptr const __stop_platform_drivers[]; // NOLINTEND(readability-identifier-naming) } auto init_platform_drivers() -> void { auto clean_start = std::launder(__start_platform_drivers); auto clean_stop = std::launder(__stop_platform_drivers); auto descriptors = std::span{clean_start, clean_stop} | // std::views::filter([](auto p) { return p != nullptr; }); for (auto driver : descriptors) { auto instance = driver->make_instance(); kstd::println("[ARCH:DRV] registering driver '{}' ({})", instance->name(), driver->name()); kapi::devices::driver_registry::get().add(std::move(instance)); } } auto init_platform_devices() -> void { arch::devices::init_acpi_devices(); arch::devices::init_legacy_devices(); } auto get_cpu_bus() -> kstd::shared_ptr { if (!cpu_bus) { system::panic("[ARCH:DEV] The CPU topology has not yet been initialized!"); } return cpu_bus; } auto discover_cpu_topology() -> void { if (cpu_bus) { system::panic("[ARCH:DEV] The CPU topology has already been initialized!"); } cpu_bus = kstd::make_shared(); cpu_bus->facet()->enumerate(*cpu_bus); kapi::devices::get_root_bus()->add_child(cpu_bus); } } // namespace kapi::devices