mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 19:45:08 +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
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue