diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 7869644de0..0923972992 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -155,8 +155,6 @@ set(KERNEL_SOURCES FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.cpp FileSystem/SysFS/Subsystems/Devices/DeviceComponent.cpp FileSystem/SysFS/Subsystems/Devices/Directory.cpp - FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp - FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp FileSystem/SysFS/Subsystems/Firmware/Directory.cpp diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp index 846aa61d4f..131f611d2f 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp @@ -15,7 +15,16 @@ namespace Kernel { -UNMAP_AFTER_INIT BIOSSysFSComponent::BIOSSysFSComponent() +NonnullRefPtr BIOSSysFSComponent::must_create(Type type, PhysicalAddress blob_paddr, size_t blob_size) +{ + return adopt_ref_if_nonnull(new (nothrow) BIOSSysFSComponent(type, blob_paddr, blob_size)).release_nonnull(); +} + +UNMAP_AFTER_INIT BIOSSysFSComponent::BIOSSysFSComponent(Type type, PhysicalAddress blob_paddr, size_t blob_size) + : SysFSComponent() + , m_blob_paddr(blob_paddr) + , m_blob_length(blob_size) + , m_type(type) { } @@ -31,4 +40,22 @@ ErrorOr BIOSSysFSComponent::read_bytes(off_t offset, size_t count, UserO return nread; } +StringView BIOSSysFSComponent::name() const +{ + switch (m_type) { + case Type::DMIEntryPoint: + return "smbios_entry_point"sv; + case Type::SMBIOSTable: + return "DMI"sv; + default: + break; + } + VERIFY_NOT_REACHED(); +} + +ErrorOr> BIOSSysFSComponent::try_to_generate_buffer() const +{ + auto blob = TRY(Memory::map_typed((m_blob_paddr), m_blob_length)); + return KBuffer::try_create_with_bytes(Span { blob.ptr(), m_blob_length }); +} } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h index f626812b7d..a58ec9fc7c 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h @@ -15,13 +15,26 @@ namespace Kernel { -class BIOSSysFSComponent : public SysFSComponent { +class BIOSSysFSComponent final : public SysFSComponent { public: + enum class Type { + DMIEntryPoint, + SMBIOSTable, + }; + +public: + static NonnullRefPtr must_create(Type, PhysicalAddress, size_t blob_size); + virtual StringView name() const override; virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; -protected: - virtual ErrorOr> try_to_generate_buffer() const = 0; - BIOSSysFSComponent(); -}; +private: + ErrorOr> try_to_generate_buffer() const; + BIOSSysFSComponent(Type, PhysicalAddress, size_t blob_size); + virtual size_t size() const override { return m_blob_length; } + + PhysicalAddress const m_blob_paddr; + size_t const m_blob_length { 0 }; + Type const m_type { Type::DMIEntryPoint }; +}; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp deleted file mode 100644 index 41fe227130..0000000000 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2022, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include -#include -#include -#include - -namespace Kernel { - -UNMAP_AFTER_INIT NonnullRefPtr DMIEntryPointExposedBlob::must_create(PhysicalAddress dmi_entry_point, size_t blob_size) -{ - return adopt_ref(*new (nothrow) DMIEntryPointExposedBlob(dmi_entry_point, blob_size)); -} - -UNMAP_AFTER_INIT DMIEntryPointExposedBlob::DMIEntryPointExposedBlob(PhysicalAddress dmi_entry_point, size_t blob_size) - : BIOSSysFSComponent() - , m_dmi_entry_point(dmi_entry_point) - , m_dmi_entry_point_length(blob_size) -{ -} - -ErrorOr> DMIEntryPointExposedBlob::try_to_generate_buffer() const -{ - auto dmi_blob = TRY(Memory::map_typed((m_dmi_entry_point), m_dmi_entry_point_length)); - return KBuffer::try_create_with_bytes(Span { dmi_blob.ptr(), m_dmi_entry_point_length }); -} - -} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h deleted file mode 100644 index acbe8d87ce..0000000000 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2022, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Kernel { - -class DMIEntryPointExposedBlob final : public BIOSSysFSComponent { -public: - virtual StringView name() const override { return "smbios_entry_point"sv; } - static NonnullRefPtr must_create(PhysicalAddress dmi_entry_point, size_t blob_size); - -private: - DMIEntryPointExposedBlob(PhysicalAddress dmi_entry_point, size_t blob_size); - virtual ErrorOr> try_to_generate_buffer() const override; - - virtual size_t size() const override { return m_dmi_entry_point_length; } - - PhysicalAddress m_dmi_entry_point; - size_t const m_dmi_entry_point_length { 0 }; -}; - -} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp deleted file mode 100644 index 75b270017a..0000000000 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2022, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include -#include -#include - -namespace Kernel { - -UNMAP_AFTER_INIT NonnullRefPtr SMBIOSExposedTable::must_create(PhysicalAddress smbios_structure_table, size_t smbios_structure_table_length) -{ - return adopt_ref(*new (nothrow) SMBIOSExposedTable(smbios_structure_table, smbios_structure_table_length)); -} - -UNMAP_AFTER_INIT SMBIOSExposedTable::SMBIOSExposedTable(PhysicalAddress smbios_structure_table, size_t smbios_structure_table_length) - : BIOSSysFSComponent() - , m_smbios_structure_table(smbios_structure_table) - , m_smbios_structure_table_length(smbios_structure_table_length) -{ -} - -ErrorOr> SMBIOSExposedTable::try_to_generate_buffer() const -{ - auto dmi_blob = TRY(Memory::map_typed((m_smbios_structure_table), m_smbios_structure_table_length)); - return KBuffer::try_create_with_bytes(Span { dmi_blob.ptr(), m_smbios_structure_table_length }); -} - -} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h deleted file mode 100644 index b7a252b0e2..0000000000 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2022, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -namespace Kernel { - -class SMBIOSExposedTable final : public BIOSSysFSComponent { -public: - virtual StringView name() const override { return "DMI"sv; } - static NonnullRefPtr must_create(PhysicalAddress, size_t blob_size); - -private: - SMBIOSExposedTable(PhysicalAddress dmi_entry_point, size_t blob_size); - virtual ErrorOr> try_to_generate_buffer() const override; - - virtual size_t size() const override { return m_smbios_structure_table_length; } - - PhysicalAddress m_smbios_structure_table; - size_t const m_smbios_structure_table_length { 0 }; -}; - -} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp index 107cd1c6a8..665fe1e635 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp @@ -6,9 +6,8 @@ #include #include +#include #include -#include -#include #include #include #include @@ -59,8 +58,8 @@ void BIOSSysFSDirectory::create_components() dbgln("BIOSSysFSDirectory: invalid smbios structure table length"); return; } - m_components.append(DMIEntryPointExposedBlob::must_create(m_dmi_entry_point, m_dmi_entry_point_length)); - m_components.append(SMBIOSExposedTable::must_create(m_smbios_structure_table, m_smbios_structure_table_length)); + m_components.append(BIOSSysFSComponent::must_create(BIOSSysFSComponent::Type::DMIEntryPoint, m_dmi_entry_point, m_dmi_entry_point_length)); + m_components.append(BIOSSysFSComponent::must_create(BIOSSysFSComponent::Type::SMBIOSTable, m_smbios_structure_table, m_smbios_structure_table_length)); } UNMAP_AFTER_INIT void BIOSSysFSDirectory::initialize_dmi_exposer()