BIOS.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. #include <Kernel/Firmware/BIOS.h>
  8. #include <Kernel/Memory/MemoryManager.h>
  9. #include <Kernel/Memory/TypedMapping.h>
  10. namespace Kernel {
  11. ErrorOr<Memory::MappedROM> map_bios()
  12. {
  13. Memory::MappedROM mapping;
  14. mapping.size = 128 * KiB;
  15. mapping.paddr = PhysicalAddress(0xe0000);
  16. auto region_size = TRY(Memory::page_round_up(mapping.size));
  17. mapping.region = TRY(MM.allocate_kernel_region(mapping.paddr, region_size, {}, Memory::Region::Access::Read));
  18. return mapping;
  19. }
  20. ErrorOr<Memory::MappedROM> map_ebda()
  21. {
  22. auto ebda_segment_ptr = TRY(Memory::map_typed<u16>(PhysicalAddress(0x40e)));
  23. PhysicalAddress ebda_paddr(PhysicalAddress(*ebda_segment_ptr).get() << 4);
  24. // The EBDA size is stored in the first byte of the EBDA in 1K units
  25. size_t ebda_size = *TRY(Memory::map_typed<u8>(ebda_paddr));
  26. ebda_size *= 1024;
  27. Memory::MappedROM mapping;
  28. auto region_size = TRY(Memory::page_round_up(ebda_size));
  29. mapping.region = TRY(MM.allocate_kernel_region(ebda_paddr.page_base(), region_size, {}, Memory::Region::Access::Read));
  30. mapping.offset = ebda_paddr.offset_in_page();
  31. mapping.size = ebda_size;
  32. mapping.paddr = ebda_paddr;
  33. return mapping;
  34. }
  35. }