Serenity Operating System
at master 41 lines 1.4 kB view raw
1/* 2 * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include <Kernel/Firmware/BIOS.h> 9#include <Kernel/Memory/MemoryManager.h> 10#include <Kernel/Memory/TypedMapping.h> 11 12namespace Kernel { 13 14ErrorOr<Memory::MappedROM> map_bios() 15{ 16 Memory::MappedROM mapping; 17 mapping.size = 128 * KiB; 18 mapping.paddr = PhysicalAddress(0xe0000); 19 auto region_size = TRY(Memory::page_round_up(mapping.size)); 20 mapping.region = TRY(MM.allocate_kernel_region(mapping.paddr, region_size, {}, Memory::Region::Access::Read)); 21 return mapping; 22} 23 24ErrorOr<Memory::MappedROM> map_ebda() 25{ 26 auto ebda_segment_ptr = TRY(Memory::map_typed<u16>(PhysicalAddress(0x40e))); 27 PhysicalAddress ebda_paddr(PhysicalAddress(*ebda_segment_ptr).get() << 4); 28 // The EBDA size is stored in the first byte of the EBDA in 1K units 29 size_t ebda_size = *TRY(Memory::map_typed<u8>(ebda_paddr)); 30 ebda_size *= 1024; 31 32 Memory::MappedROM mapping; 33 auto region_size = TRY(Memory::page_round_up(ebda_size)); 34 mapping.region = TRY(MM.allocate_kernel_region(ebda_paddr.page_base(), region_size, {}, Memory::Region::Access::Read)); 35 mapping.offset = ebda_paddr.offset_in_page(); 36 mapping.size = ebda_size; 37 mapping.paddr = ebda_paddr; 38 return mapping; 39} 40 41}