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 be72abbe59..54527f2c0c 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 357bd2e02c..732d4ca5d3 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 ad42d1336a..0eea9ac40c 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 19a1dd5224..1f41695dd1 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 ae064f843a..406275bffb 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 0000000000..0a1ee1be64 --- /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 0000000000..c58af9675d --- /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 75b7a75b95..1883afc775 100644 --- a/Kernel/Firmware/MultiProcessor/Parser.cpp +++ b/Kernel/Firmware/MultiProcessor/Parser.cpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include