Serenity Operating System
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}