mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 13:38:11 +00:00
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.
This commit is contained in:
parent
7310a9a641
commit
9c6834698f
8 changed files with 65 additions and 33 deletions
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
Kernel/Firmware/BIOS.cpp
Normal file
41
Kernel/Firmware/BIOS.cpp
Normal file
|
@ -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
Kernel/Firmware/BIOS.h
Normal file
20
Kernel/Firmware/BIOS.h
Normal file
|
@ -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();
|
||||
|
||||
}
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue