diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 622814cbac2..d48cf46faf7 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -127,6 +127,7 @@ set(KERNEL_SOURCES Firmware/ACPI/MultiProcessorParser.cpp Firmware/ACPI/Parser.cpp Firmware/BIOS.cpp + Firmware/SysFSFirmware.cpp FutexQueue.cpp Interrupts/APIC.cpp Interrupts/GenericInterruptHandler.cpp diff --git a/Kernel/Firmware/ACPI/Parser.cpp b/Kernel/Firmware/ACPI/Parser.cpp index 62f29801ad0..017053a393b 100644 --- a/Kernel/Firmware/ACPI/Parser.cpp +++ b/Kernel/Firmware/ACPI/Parser.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -63,14 +64,14 @@ UNMAP_AFTER_INIT ACPISysFSComponent::ACPISysFSComponent(String name, PhysicalAdd { } -UNMAP_AFTER_INIT void ACPISysFSDirectory::initialize() +UNMAP_AFTER_INIT KResultOr> ACPISysFSDirectory::try_create(FirmwareSysFSDirectory& firmware_directory) { - auto acpi_directory = adopt_ref(*new (nothrow) ACPISysFSDirectory()); - SysFSComponentRegistry::the().register_new_component(acpi_directory); + auto acpi_directory = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ACPISysFSDirectory(firmware_directory))); + return acpi_directory; } -UNMAP_AFTER_INIT ACPISysFSDirectory::ACPISysFSDirectory() - : SysFSDirectory("acpi", SysFSComponentRegistry::the().root_directory()) +UNMAP_AFTER_INIT ACPISysFSDirectory::ACPISysFSDirectory(FirmwareSysFSDirectory& firmware_directory) + : SysFSDirectory("acpi", firmware_directory) { NonnullRefPtrVector components; size_t ssdt_count = 0; diff --git a/Kernel/Firmware/ACPI/Parser.h b/Kernel/Firmware/ACPI/Parser.h index f4fbfe80038..6fe75ad869b 100644 --- a/Kernel/Firmware/ACPI/Parser.h +++ b/Kernel/Firmware/ACPI/Parser.h @@ -6,11 +6,13 @@ #pragma once +#include #include #include #include #include #include +#include #include #include #include @@ -20,10 +22,10 @@ namespace Kernel::ACPI { class ACPISysFSDirectory : public SysFSDirectory { public: - static void initialize(); + static KResultOr> try_create(FirmwareSysFSDirectory& firmware_directory); private: - ACPISysFSDirectory(); + explicit ACPISysFSDirectory(FirmwareSysFSDirectory& firmware_directory); }; class ACPISysFSComponent : public SysFSComponent { diff --git a/Kernel/Firmware/BIOS.cpp b/Kernel/Firmware/BIOS.cpp index f0842c5e3eb..7cf117c44f6 100644 --- a/Kernel/Firmware/BIOS.cpp +++ b/Kernel/Firmware/BIOS.cpp @@ -90,11 +90,11 @@ UNMAP_AFTER_INIT void BIOSSysFSDirectory::set_dmi_32_bit_entry_initialization_va m_smbios_structure_table_length = smbios_entry.ptr()->legacy_structure.smboios_table_length; } -UNMAP_AFTER_INIT void BIOSSysFSDirectory::initialize() +UNMAP_AFTER_INIT KResultOr> BIOSSysFSDirectory::try_create(FirmwareSysFSDirectory& firmware_directory) { - auto bios_directory = adopt_ref(*new (nothrow) BIOSSysFSDirectory()); - SysFSComponentRegistry::the().register_new_component(bios_directory); + auto bios_directory = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) BIOSSysFSDirectory(firmware_directory))); bios_directory->create_components(); + return bios_directory; } void BIOSSysFSDirectory::create_components() @@ -126,8 +126,8 @@ UNMAP_AFTER_INIT void BIOSSysFSDirectory::initialize_dmi_exposer() dbgln("BIOSSysFSDirectory: Data table @ {}", m_smbios_structure_table); } -UNMAP_AFTER_INIT BIOSSysFSDirectory::BIOSSysFSDirectory() - : SysFSDirectory("bios", SysFSComponentRegistry::the().root_directory()) +UNMAP_AFTER_INIT BIOSSysFSDirectory::BIOSSysFSDirectory(FirmwareSysFSDirectory& firmware_directory) + : SysFSDirectory("bios", firmware_directory) { auto entry_32bit = find_dmi_entry32bit_point(); if (entry_32bit.has_value()) { diff --git a/Kernel/Firmware/BIOS.h b/Kernel/Firmware/BIOS.h index 8e2d539d35b..aa7af999cb9 100644 --- a/Kernel/Firmware/BIOS.h +++ b/Kernel/Firmware/BIOS.h @@ -7,9 +7,11 @@ #pragma once +#include #include #include #include +#include #include #include #include @@ -92,12 +94,12 @@ private: class BIOSSysFSDirectory : public SysFSDirectory { public: - static void initialize(); + static KResultOr> try_create(FirmwareSysFSDirectory&); void create_components(); private: - BIOSSysFSDirectory(); + explicit BIOSSysFSDirectory(FirmwareSysFSDirectory&); void set_dmi_64_bit_entry_initialization_values(); void set_dmi_32_bit_entry_initialization_values(); diff --git a/Kernel/Firmware/SysFSFirmware.cpp b/Kernel/Firmware/SysFSFirmware.cpp new file mode 100644 index 00000000000..cb504815604 --- /dev/null +++ b/Kernel/Firmware/SysFSFirmware.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Kernel { + +UNMAP_AFTER_INIT void FirmwareSysFSDirectory::initialize() +{ + auto firmware_directory = adopt_ref_if_nonnull(new (nothrow) FirmwareSysFSDirectory()).release_nonnull(); + SysFSComponentRegistry::the().register_new_component(firmware_directory); + firmware_directory->create_components(); +} + +void FirmwareSysFSDirectory::create_components() +{ + auto bios_directory_or_error = BIOSSysFSDirectory::try_create(*this); + VERIFY(!bios_directory_or_error.is_error()); + auto acpi_directory_or_error = ACPI::ACPISysFSDirectory::try_create(*this); + VERIFY(!acpi_directory_or_error.is_error()); + m_components.append(bios_directory_or_error.release_value()); + m_components.append(acpi_directory_or_error.release_value()); +} + +UNMAP_AFTER_INIT FirmwareSysFSDirectory::FirmwareSysFSDirectory() + : SysFSDirectory("firmware", SysFSComponentRegistry::the().root_directory()) +{ +} + +} diff --git a/Kernel/Firmware/SysFSFirmware.h b/Kernel/Firmware/SysFSFirmware.h new file mode 100644 index 00000000000..9203e6ca94c --- /dev/null +++ b/Kernel/Firmware/SysFSFirmware.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class FirmwareSysFSDirectory : public SysFSDirectory { +public: + static void initialize(); + + void create_components(); + +private: + FirmwareSysFSDirectory(); +}; + +} diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 130cdbc5bac..854b18a4b0d 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include #include @@ -300,9 +300,7 @@ void init_stage2(void*) auto boot_profiling = kernel_command_line().is_boot_profiling_enabled(); USB::USBManagement::initialize(); - - BIOSSysFSDirectory::initialize(); - ACPI::ACPISysFSDirectory::initialize(); + FirmwareSysFSDirectory::initialize(); VirtIO::detect();