浏览代码

Kernel/SysFS: Split the bulky BIOS.h file into multiple files

Liav A 3 年之前
父节点
当前提交
4d05a41b30

+ 4 - 1
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

+ 0 - 123
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h

@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
-
-#pragma once
-
-#include <AK/RefPtr.h>
-#include <AK/Types.h>
-#include <AK/Vector.h>
-#include <Kernel/FileSystem/SysFS.h>
-#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h>
-#include <Kernel/KBuffer.h>
-#include <Kernel/Memory/MappedROM.h>
-#include <Kernel/Memory/Region.h>
-#include <Kernel/PhysicalAddress.h>
-#include <Kernel/VirtualAddress.h>
-
-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<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
-
-protected:
-    virtual ErrorOr<NonnullOwnPtr<KBuffer>> 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<DMIEntryPointExposedBlob> must_create(PhysicalAddress dmi_entry_point, size_t blob_size);
-
-private:
-    DMIEntryPointExposedBlob(PhysicalAddress dmi_entry_point, size_t blob_size);
-    virtual ErrorOr<NonnullOwnPtr<KBuffer>> 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<SMBIOSExposedTable> must_create(PhysicalAddress, size_t blob_size);
-
-private:
-    SMBIOSExposedTable(PhysicalAddress dmi_entry_point, size_t blob_size);
-    virtual ErrorOr<NonnullOwnPtr<KBuffer>> 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<BIOSSysFSDirectory> 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<PhysicalAddress> find_dmi_entry64bit_point();
-    Optional<PhysicalAddress> 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 };
-};
-
-}

+ 34 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp

@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/StringView.h>
+#include <Kernel/FileSystem/OpenFileDescription.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h>
+#include <Kernel/Firmware/BIOS.h>
+#include <Kernel/KBufferBuilder.h>
+#include <Kernel/Memory/MemoryManager.h>
+#include <Kernel/Memory/TypedMapping.h>
+#include <Kernel/Sections.h>
+
+namespace Kernel {
+
+UNMAP_AFTER_INIT BIOSSysFSComponent::BIOSSysFSComponent()
+{
+}
+
+ErrorOr<size_t> 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<off_t>(blob->size() - offset), static_cast<off_t>(count));
+    TRY(buffer.write(blob->data() + offset, nread));
+    return nread;
+}
+
+}

+ 27 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefPtr.h>
+#include <AK/Types.h>
+#include <AK/Vector.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h>
+#include <Kernel/KBuffer.h>
+#include <Kernel/PhysicalAddress.h>
+
+namespace Kernel {
+
+class BIOSSysFSComponent : public SysFSComponent {
+public:
+    virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
+
+protected:
+    virtual ErrorOr<NonnullOwnPtr<KBuffer>> try_to_generate_buffer() const = 0;
+    BIOSSysFSComponent();
+};
+
+}

+ 46 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Definitions.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Types.h>
+
+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;
+};
+}

+ 35 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp

@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/StringView.h>
+#include <Kernel/FileSystem/OpenFileDescription.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h>
+#include <Kernel/KBufferBuilder.h>
+#include <Kernel/Memory/MemoryManager.h>
+#include <Kernel/Memory/TypedMapping.h>
+#include <Kernel/Sections.h>
+
+namespace Kernel {
+
+UNMAP_AFTER_INIT NonnullRefPtr<DMIEntryPointExposedBlob> 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<NonnullOwnPtr<KBuffer>> DMIEntryPointExposedBlob::try_to_generate_buffer() const
+{
+    auto dmi_blob = TRY(Memory::map_typed<u8>((m_dmi_entry_point), m_dmi_entry_point_length));
+    return KBuffer::try_create_with_bytes(Span<u8> { dmi_blob.ptr(), m_dmi_entry_point_length });
+}
+
+}

+ 35 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h

@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefPtr.h>
+#include <AK/Types.h>
+#include <AK/Vector.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Definitions.h>
+#include <Kernel/KBuffer.h>
+#include <Kernel/Memory/Region.h>
+#include <Kernel/PhysicalAddress.h>
+
+namespace Kernel {
+
+class DMIEntryPointExposedBlob final : public BIOSSysFSComponent {
+public:
+    virtual StringView name() const override { return "smbios_entry_point"sv; }
+    static NonnullRefPtr<DMIEntryPointExposedBlob> must_create(PhysicalAddress dmi_entry_point, size_t blob_size);
+
+private:
+    DMIEntryPointExposedBlob(PhysicalAddress dmi_entry_point, size_t blob_size);
+    virtual ErrorOr<NonnullOwnPtr<KBuffer>> 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 };
+};
+
+}

+ 34 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp

@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/StringView.h>
+#include <Kernel/FileSystem/OpenFileDescription.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h>
+#include <Kernel/KBufferBuilder.h>
+#include <Kernel/Memory/TypedMapping.h>
+#include <Kernel/Sections.h>
+
+namespace Kernel {
+
+UNMAP_AFTER_INIT NonnullRefPtr<SMBIOSExposedTable> 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<NonnullOwnPtr<KBuffer>> SMBIOSExposedTable::try_to_generate_buffer() const
+{
+    auto dmi_blob = TRY(Memory::map_typed<u8>((m_smbios_structure_table), m_smbios_structure_table_length));
+    return KBuffer::try_create_with_bytes(Span<u8> { dmi_blob.ptr(), m_smbios_structure_table_length });
+}
+
+}

+ 34 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h

@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefPtr.h>
+#include <AK/Types.h>
+#include <AK/Vector.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h>
+#include <Kernel/KBuffer.h>
+#include <Kernel/Memory/Region.h>
+#include <Kernel/PhysicalAddress.h>
+
+namespace Kernel {
+
+class SMBIOSExposedTable final : public BIOSSysFSComponent {
+public:
+    virtual StringView name() const override { return "DMI"sv; }
+    static NonnullRefPtr<SMBIOSExposedTable> must_create(PhysicalAddress, size_t blob_size);
+
+private:
+    SMBIOSExposedTable(PhysicalAddress dmi_entry_point, size_t blob_size);
+    virtual ErrorOr<NonnullOwnPtr<KBuffer>> 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 };
+};
+
+}

+ 5 - 55
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp → Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp

@@ -1,13 +1,15 @@
 /*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
 #include <AK/StringView.h>
 #include <Kernel/FileSystem/OpenFileDescription.h>
-#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Definitions.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h>
 #include <Kernel/Firmware/BIOS.h>
 #include <Kernel/KBufferBuilder.h>
 #include <Kernel/Memory/MemoryManager.h>
@@ -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> 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<size_t> 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<off_t>(blob->size() - offset), static_cast<off_t>(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<NonnullOwnPtr<KBuffer>> DMIEntryPointExposedBlob::try_to_generate_buffer() const
-{
-    auto dmi_blob = TRY(Memory::map_typed<u8>((m_dmi_entry_point), m_dmi_entry_point_length));
-    return KBuffer::try_create_with_bytes(Span<u8> { dmi_blob.ptr(), m_dmi_entry_point_length });
-}
-
-UNMAP_AFTER_INIT NonnullRefPtr<SMBIOSExposedTable> 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<NonnullOwnPtr<KBuffer>> SMBIOSExposedTable::try_to_generate_buffer() const
-{
-    auto dmi_blob = TRY(Memory::map_typed<u8>((m_smbios_structure_table), m_smbios_structure_table_length));
-    return KBuffer::try_create_with_bytes(Span<u8> { 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);

+ 42 - 0
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h

@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefPtr.h>
+#include <AK/Types.h>
+#include <AK/Vector.h>
+#include <Kernel/FileSystem/SysFS.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h>
+#include <Kernel/PhysicalAddress.h>
+
+namespace Kernel {
+
+class BIOSSysFSDirectory : public SysFSDirectory {
+public:
+    virtual StringView name() const override { return "bios"sv; }
+    static NonnullRefPtr<BIOSSysFSDirectory> 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<PhysicalAddress> find_dmi_entry64bit_point();
+    Optional<PhysicalAddress> 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 };
+};
+
+}

+ 1 - 1
Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp

@@ -4,7 +4,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h>
+#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h>
 #include <Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h>
 #include <Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.h>
 #include <Kernel/Firmware/ACPI/Parser.h>