Parcourir la source

Kerenl/Firmware: Add map_ebda and map_bios methods in the original place

In a previous commit I moved everything into the new subdirectories in
FileSystem/SysFS directory without trying to actually make changes in
the code itself too much. Now it's time to split the code to make it
more readable and understandable, hence this change occurs now.
Liav A il y a 3 ans
Parent
commit
9c6834698f

+ 1 - 0
Kernel/CMakeLists.txt

@@ -153,6 +153,7 @@ set(KERNEL_SOURCES
     FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp
     FileSystem/TmpFS.cpp
     FileSystem/VirtualFileSystem.cpp
+    Firmware/BIOS.cpp
     Firmware/ACPI/Initialize.cpp
     Firmware/ACPI/Parser.cpp
     Firmware/Hypervisor/VMWareBackdoor.cpp

+ 0 - 1
Kernel/Devices/MemoryDevice.cpp

@@ -8,7 +8,6 @@
 #include <AK/StdLibExtras.h>
 #include <Kernel/Devices/DeviceManagement.h>
 #include <Kernel/Devices/MemoryDevice.h>
-#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h>
 #include <Kernel/Memory/AnonymousVMObject.h>
 #include <Kernel/Memory/TypedMapping.h>
 #include <Kernel/Sections.h>

+ 1 - 27
Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp

@@ -8,6 +8,7 @@
 #include <AK/StringView.h>
 #include <Kernel/FileSystem/OpenFileDescription.h>
 #include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h>
+#include <Kernel/Firmware/BIOS.h>
 #include <Kernel/KBufferBuilder.h>
 #include <Kernel/Memory/MemoryManager.h>
 #include <Kernel/Memory/TypedMapping.h>
@@ -157,31 +158,4 @@ UNMAP_AFTER_INIT Optional<PhysicalAddress> BIOSSysFSDirectory::find_dmi_entry32b
     return bios_or_error.value().find_chunk_starting_with("_SM_", 16);
 }
 
-ErrorOr<Memory::MappedROM> map_bios()
-{
-    Memory::MappedROM mapping;
-    mapping.size = 128 * KiB;
-    mapping.paddr = PhysicalAddress(0xe0000);
-    auto region_size = TRY(Memory::page_round_up(mapping.size));
-    mapping.region = TRY(MM.allocate_kernel_region(mapping.paddr, region_size, {}, Memory::Region::Access::Read));
-    return mapping;
-}
-
-ErrorOr<Memory::MappedROM> map_ebda()
-{
-    auto ebda_segment_ptr = TRY(Memory::map_typed<u16>(PhysicalAddress(0x40e)));
-    PhysicalAddress ebda_paddr(PhysicalAddress(*ebda_segment_ptr).get() << 4);
-    // The EBDA size is stored in the first byte of the EBDA in 1K units
-    size_t ebda_size = *TRY(Memory::map_typed<u8>(ebda_paddr));
-    ebda_size *= 1024;
-
-    Memory::MappedROM mapping;
-    auto region_size = TRY(Memory::page_round_up(ebda_size));
-    mapping.region = TRY(MM.allocate_kernel_region(ebda_paddr.page_base(), region_size, {}, Memory::Region::Access::Read));
-    mapping.offset = ebda_paddr.offset_in_page();
-    mapping.size = ebda_size;
-    mapping.paddr = ebda_paddr;
-    return mapping;
-}
-
 }

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

@@ -57,9 +57,6 @@ struct [[gnu::packed]] EntryPoint64bit {
 
 namespace Kernel {
 
-ErrorOr<Memory::MappedROM> map_bios();
-ErrorOr<Memory::MappedROM> map_ebda();
-
 class BIOSSysFSComponent : public SysFSComponent {
 public:
     virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;

+ 1 - 1
Kernel/Firmware/ACPI/Parser.cpp

@@ -13,8 +13,8 @@
 #include <Kernel/Arch/x86/IO.h>
 #include <Kernel/Bus/PCI/API.h>
 #include <Kernel/Debug.h>
-#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h>
 #include <Kernel/Firmware/ACPI/Parser.h>
+#include <Kernel/Firmware/BIOS.h>
 #include <Kernel/Memory/TypedMapping.h>
 #include <Kernel/Sections.h>
 #include <Kernel/StdLib.h>

+ 41 - 0
Kernel/Firmware/BIOS.cpp

@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <Kernel/Firmware/BIOS.h>
+#include <Kernel/Memory/MemoryManager.h>
+#include <Kernel/Memory/TypedMapping.h>
+
+namespace Kernel {
+
+ErrorOr<Memory::MappedROM> map_bios()
+{
+    Memory::MappedROM mapping;
+    mapping.size = 128 * KiB;
+    mapping.paddr = PhysicalAddress(0xe0000);
+    auto region_size = TRY(Memory::page_round_up(mapping.size));
+    mapping.region = TRY(MM.allocate_kernel_region(mapping.paddr, region_size, {}, Memory::Region::Access::Read));
+    return mapping;
+}
+
+ErrorOr<Memory::MappedROM> map_ebda()
+{
+    auto ebda_segment_ptr = TRY(Memory::map_typed<u16>(PhysicalAddress(0x40e)));
+    PhysicalAddress ebda_paddr(PhysicalAddress(*ebda_segment_ptr).get() << 4);
+    // The EBDA size is stored in the first byte of the EBDA in 1K units
+    size_t ebda_size = *TRY(Memory::map_typed<u8>(ebda_paddr));
+    ebda_size *= 1024;
+
+    Memory::MappedROM mapping;
+    auto region_size = TRY(Memory::page_round_up(ebda_size));
+    mapping.region = TRY(MM.allocate_kernel_region(ebda_paddr.page_base(), region_size, {}, Memory::Region::Access::Read));
+    mapping.offset = ebda_paddr.offset_in_page();
+    mapping.size = ebda_size;
+    mapping.paddr = ebda_paddr;
+    return mapping;
+}
+
+}

+ 20 - 0
Kernel/Firmware/BIOS.h

@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <Kernel/Memory/MappedROM.h>
+#include <Kernel/Memory/Region.h>
+#include <Kernel/PhysicalAddress.h>
+#include <Kernel/VirtualAddress.h>
+
+namespace Kernel {
+
+ErrorOr<Memory::MappedROM> map_bios();
+ErrorOr<Memory::MappedROM> map_ebda();
+
+}

+ 1 - 1
Kernel/Firmware/MultiProcessor/Parser.cpp

@@ -8,7 +8,7 @@
 
 #include <AK/StringView.h>
 #include <Kernel/Debug.h>
-#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h>
+#include <Kernel/Firmware/BIOS.h>
 #include <Kernel/Firmware/MultiProcessor/Parser.h>
 #include <Kernel/Interrupts/IOAPIC.h>
 #include <Kernel/Memory/TypedMapping.h>