mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-12-08 06:09:58 +00:00
42 lines
1.3 KiB
C++
42 lines
1.3 KiB
C++
|
|
/*
|
||
|
|
* 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;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|