From 4d05a41b30b635fa15868f58d97665e64c3695e3 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 22 Apr 2022 10:59:32 +0300 Subject: [PATCH] Kernel/SysFS: Split the bulky BIOS.h file into multiple files --- Kernel/CMakeLists.txt | 5 +- .../SysFS/Subsystems/Firmware/BIOS.h | 123 ------------------ .../Subsystems/Firmware/BIOS/Component.cpp | 34 +++++ .../Subsystems/Firmware/BIOS/Component.h | 27 ++++ .../Firmware/BIOS/DMI/Definitions.h | 46 +++++++ .../Firmware/BIOS/DMI/EntryPointBlob.cpp | 35 +++++ .../Firmware/BIOS/DMI/EntryPointBlob.h | 35 +++++ .../Subsystems/Firmware/BIOS/DMI/Table.cpp | 34 +++++ .../Subsystems/Firmware/BIOS/DMI/Table.h | 34 +++++ .../Firmware/{BIOS.cpp => BIOS/Directory.cpp} | 60 +-------- .../Subsystems/Firmware/BIOS/Directory.h | 42 ++++++ .../SysFS/Subsystems/Firmware/Directory.cpp | 2 +- 12 files changed, 297 insertions(+), 180 deletions(-) delete mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Definitions.h create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h rename Kernel/FileSystem/SysFS/Subsystems/Firmware/{BIOS.cpp => BIOS/Directory.cpp} (63%) create mode 100644 Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 54527f2c0ce..2e1d010b37c 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -148,7 +148,10 @@ set(KERNEL_SOURCES FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp - FileSystem/SysFS/Subsystems/Firmware/BIOS.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 FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp FileSystem/TmpFS.cpp diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h deleted file mode 100644 index 1f41695dd11..00000000000 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2020, Andreas Kling - * Copyright (c) 2021, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Kernel::SMBIOS { - -struct [[gnu::packed]] LegacyEntryPoint32bit { - char legacy_sig[5]; - u8 checksum2; - u16 smbios_table_length; - u32 smbios_table_ptr; - u16 smbios_tables_count; - u8 smbios_bcd_revision; -}; - -struct [[gnu::packed]] EntryPoint32bit { - char sig[4]; - u8 checksum; - u8 length; - u8 major_version; - u8 minor_version; - u16 maximum_structure_size; - u8 implementation_revision; - char formatted_area[5]; - LegacyEntryPoint32bit legacy_structure; -}; - -struct [[gnu::packed]] EntryPoint64bit { - char sig[5]; - u8 checksum; - u8 length; - u8 major_version; - u8 minor_version; - u8 document_revision; - u8 revision; - u8 reserved; - u32 table_maximum_size; - u64 table_ptr; -}; -} - -namespace Kernel { - -class BIOSSysFSComponent : public SysFSComponent { -public: - virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; - -protected: - virtual ErrorOr> try_to_generate_buffer() const = 0; - BIOSSysFSComponent(); -}; - -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 }; -}; - -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 }; -}; - -class BIOSSysFSDirectory : public SysFSDirectory { -public: - virtual StringView name() const override { return "bios"sv; } - static NonnullRefPtr must_create(FirmwareSysFSDirectory&); - - void create_components(); - -private: - explicit BIOSSysFSDirectory(FirmwareSysFSDirectory&); - - void set_dmi_64_bit_entry_initialization_values(); - void set_dmi_32_bit_entry_initialization_values(); - void initialize_dmi_exposer(); - - Optional find_dmi_entry64bit_point(); - Optional find_dmi_entry32bit_point(); - - PhysicalAddress m_dmi_entry_point; - PhysicalAddress m_smbios_structure_table; - bool m_using_64bit_dmi_entry_point { false }; - size_t m_smbios_structure_table_length { 0 }; - size_t m_dmi_entry_point_length { 0 }; -}; - -} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp new file mode 100644 index 00000000000..846aa61d4f3 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Kernel { + +UNMAP_AFTER_INIT BIOSSysFSComponent::BIOSSysFSComponent() +{ +} + +ErrorOr BIOSSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const +{ + auto blob = TRY(try_to_generate_buffer()); + + if ((size_t)offset >= blob->size()) + return 0; + + ssize_t nread = min(static_cast(blob->size() - offset), static_cast(count)); + TRY(buffer.write(blob->data() + offset, nread)); + return nread; +} + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h new file mode 100644 index 00000000000..f626812b7da --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace Kernel { + +class BIOSSysFSComponent : public SysFSComponent { +public: + virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; + +protected: + virtual ErrorOr> try_to_generate_buffer() const = 0; + BIOSSysFSComponent(); +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Definitions.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Definitions.h new file mode 100644 index 00000000000..5f575aa2ffc --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Definitions.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Kernel::SMBIOS { + +struct [[gnu::packed]] LegacyEntryPoint32bit { + char legacy_sig[5]; + u8 checksum2; + u16 smbios_table_length; + u32 smbios_table_ptr; + u16 smbios_tables_count; + u8 smbios_bcd_revision; +}; + +struct [[gnu::packed]] EntryPoint32bit { + char sig[4]; + u8 checksum; + u8 length; + u8 major_version; + u8 minor_version; + u16 maximum_structure_size; + u8 implementation_revision; + char formatted_area[5]; + LegacyEntryPoint32bit legacy_structure; +}; + +struct [[gnu::packed]] EntryPoint64bit { + char sig[5]; + u8 checksum; + u8 length; + u8 major_version; + u8 minor_version; + u8 document_revision; + u8 revision; + u8 reserved; + u32 table_maximum_size; + u64 table_ptr; +}; +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp new file mode 100644 index 00000000000..41fe2271302 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp @@ -0,0 +1,35 @@ +/* + * 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 new file mode 100644 index 00000000000..acbe8d87cea --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h @@ -0,0 +1,35 @@ +/* + * 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 new file mode 100644 index 00000000000..75b270017aa --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp @@ -0,0 +1,34 @@ +/* + * 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 new file mode 100644 index 00000000000..b7a252b0e29 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h @@ -0,0 +1,34 @@ +/* + * 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.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp similarity index 63% rename from Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp rename to Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp index 0eea9ac40c9..107cd1c6a88 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp @@ -1,13 +1,15 @@ /* - * Copyright (c) 2020, Andreas Kling - * Copyright (c) 2021, Liav A. + * Copyright (c) 2022, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include -#include +#include +#include +#include +#include #include #include #include @@ -20,58 +22,6 @@ namespace Kernel { #define SMBIOS_END_SEARCH_ADDR 0xfffff #define SMBIOS_SEARCH_AREA_SIZE (SMBIOS_END_SEARCH_ADDR - SMBIOS_BASE_SEARCH_ADDR) -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 BIOSSysFSComponent::BIOSSysFSComponent() -{ -} - -ErrorOr BIOSSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const -{ - auto blob = TRY(try_to_generate_buffer()); - - if ((size_t)offset >= blob->size()) - return 0; - - ssize_t nread = min(static_cast(blob->size() - offset), static_cast(count)); - TRY(buffer.write(blob->data() + offset, nread)); - return nread; -} - -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 }); -} - -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 }); -} - UNMAP_AFTER_INIT void BIOSSysFSDirectory::set_dmi_64_bit_entry_initialization_values() { dbgln("BIOSSysFSDirectory: SMBIOS 64bit Entry point @ {}", m_dmi_entry_point); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h new file mode 100644 index 00000000000..40f63c9f501 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace Kernel { + +class BIOSSysFSDirectory : public SysFSDirectory { +public: + virtual StringView name() const override { return "bios"sv; } + static NonnullRefPtr must_create(FirmwareSysFSDirectory&); + + void create_components(); + +private: + explicit BIOSSysFSDirectory(FirmwareSysFSDirectory&); + + void set_dmi_64_bit_entry_initialization_values(); + void set_dmi_32_bit_entry_initialization_values(); + void initialize_dmi_exposer(); + + Optional find_dmi_entry64bit_point(); + Optional find_dmi_entry32bit_point(); + + PhysicalAddress m_dmi_entry_point; + PhysicalAddress m_smbios_structure_table; + bool m_using_64bit_dmi_entry_point { false }; + size_t m_smbios_structure_table_length { 0 }; + size_t m_dmi_entry_point_length { 0 }; +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp index 294cb7625ed..cd42377cc43 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include +#include #include #include #include