From 9c6834698f3523c86442276d0b7df03b99778dd1 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 22 Apr 2022 10:34:15 +0300 Subject: [PATCH] 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. --- Kernel/CMakeLists.txt | 1 + Kernel/Devices/MemoryDevice.cpp | 1 - .../SysFS/Subsystems/Firmware/BIOS.cpp | 28 +------------ .../SysFS/Subsystems/Firmware/BIOS.h | 3 -- Kernel/Firmware/ACPI/Parser.cpp | 2 +- Kernel/Firmware/BIOS.cpp | 41 +++++++++++++++++++ Kernel/Firmware/BIOS.h | 20 +++++++++ Kernel/Firmware/MultiProcessor/Parser.cpp | 2 +- 8 files changed, 65 insertions(+), 33 deletions(-) create mode 100644 Kernel/Firmware/BIOS.cpp create mode 100644 Kernel/Firmware/BIOS.h diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index be72abbe594..54527f2c0ce 100644 --- a/Kernel/CMakeLists.txt +++ b/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 diff --git a/Kernel/Devices/MemoryDevice.cpp b/Kernel/Devices/MemoryDevice.cpp index 357bd2e02c2..732d4ca5d3e 100644 --- a/Kernel/Devices/MemoryDevice.cpp +++ b/Kernel/Devices/MemoryDevice.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp index ad42d1336a2..0eea9ac40c9 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -157,31 +158,4 @@ UNMAP_AFTER_INIT Optional BIOSSysFSDirectory::find_dmi_entry32b return bios_or_error.value().find_chunk_starting_with("_SM_", 16); } -ErrorOr 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 map_ebda() -{ - auto ebda_segment_ptr = TRY(Memory::map_typed(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(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; -} - } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h index 19a1dd52242..1f41695dd11 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS.h @@ -57,9 +57,6 @@ struct [[gnu::packed]] EntryPoint64bit { namespace Kernel { -ErrorOr map_bios(); -ErrorOr map_ebda(); - class BIOSSysFSComponent : public SysFSComponent { public: virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; diff --git a/Kernel/Firmware/ACPI/Parser.cpp b/Kernel/Firmware/ACPI/Parser.cpp index ae064f843af..406275bffb5 100644 --- a/Kernel/Firmware/ACPI/Parser.cpp +++ b/Kernel/Firmware/ACPI/Parser.cpp @@ -13,8 +13,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/Kernel/Firmware/BIOS.cpp b/Kernel/Firmware/BIOS.cpp new file mode 100644 index 00000000000..0a1ee1be640 --- /dev/null +++ b/Kernel/Firmware/BIOS.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Kernel { + +ErrorOr 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 map_ebda() +{ + auto ebda_segment_ptr = TRY(Memory::map_typed(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(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; +} + +} diff --git a/Kernel/Firmware/BIOS.h b/Kernel/Firmware/BIOS.h new file mode 100644 index 00000000000..c58af9675dc --- /dev/null +++ b/Kernel/Firmware/BIOS.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include + +namespace Kernel { + +ErrorOr map_bios(); +ErrorOr map_ebda(); + +} diff --git a/Kernel/Firmware/MultiProcessor/Parser.cpp b/Kernel/Firmware/MultiProcessor/Parser.cpp index 75b7a75b95d..1883afc7753 100644 --- a/Kernel/Firmware/MultiProcessor/Parser.cpp +++ b/Kernel/Firmware/MultiProcessor/Parser.cpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include