boot/efi/arm: remove identity mapping of EFI runtime services
EFI runtime service memory areas are remapped to a high virtual address allocated with get_next_virtual_address() to avoid any address space collision. They are also added to virtual_ranges_to_keep so that the kernel knows that these ranges should be reserved. Change-Id: I63e1a2450fceff3b2404154907a2cf59dd1b373b Reviewed-on: https://review.haiku-os.org/c/haiku/+/4863 Tested-by: Commit checker robot <[email protected]> Reviewed-by: Fredrik Holmqvist <[email protected]>
This commit is contained in:
committed by
Alex von Gluck IV
parent
a7c69a4b1f
commit
31f5f4d339
@@ -97,6 +97,18 @@ map_range(addr_t virt_addr, phys_addr_t phys_addr, size_t size, uint32_t flags)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
insert_virtual_range_to_keep(const addr_range& range)
|
||||
{
|
||||
if (gKernelArgs.arch_args.num_virtual_ranges_to_keep
|
||||
>= MAX_VIRTUAL_RANGES_TO_KEEP)
|
||||
panic("too many virtual ranges to keep");
|
||||
|
||||
gKernelArgs.arch_args.virtual_ranges_to_keep[
|
||||
gKernelArgs.arch_args.num_virtual_ranges_to_keep++] = range;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
map_range_to_new_area(addr_range& range, uint32_t flags)
|
||||
{
|
||||
@@ -110,14 +122,19 @@ map_range_to_new_area(addr_range& range, uint32_t flags)
|
||||
|
||||
map_range(virt_addr, phys_addr, range.size, flags);
|
||||
|
||||
if (gKernelArgs.arch_args.num_virtual_ranges_to_keep
|
||||
>= MAX_VIRTUAL_RANGES_TO_KEEP)
|
||||
panic("too many virtual ranges to keep");
|
||||
|
||||
range.start = virt_addr;
|
||||
|
||||
gKernelArgs.arch_args.virtual_ranges_to_keep[
|
||||
gKernelArgs.arch_args.num_virtual_ranges_to_keep++] = range;
|
||||
insert_virtual_range_to_keep(range);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
map_range_to_new_area(efi_memory_descriptor *entry, uint32_t flags)
|
||||
{
|
||||
uint64_t size = entry->NumberOfPages * B_PAGE_SIZE;
|
||||
entry->VirtualStart = get_next_virtual_address(size);
|
||||
map_range(entry->VirtualStart, entry->PhysicalStart, size, flags);
|
||||
insert_virtual_range_to_keep({start: entry->VirtualStart, size: size});
|
||||
}
|
||||
|
||||
|
||||
@@ -150,13 +167,6 @@ build_physical_memory_list(size_t memory_map_size,
|
||||
case EfiACPIReclaimMemory:
|
||||
// ACPI reclaim -- physical memory we could actually use later
|
||||
break;
|
||||
case EfiRuntimeServicesCode:
|
||||
case EfiRuntimeServicesData:
|
||||
entry->VirtualStart = entry->PhysicalStart;
|
||||
break;
|
||||
case EfiMemoryMappedIO:
|
||||
entry->VirtualStart = entry->PhysicalStart;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -316,10 +326,10 @@ arch_mmu_generate_post_efi_page_tables(size_t memory_map_size,
|
||||
for (size_t i = 0; i < memory_map_size / descriptor_size; ++i) {
|
||||
efi_memory_descriptor* entry =
|
||||
(efi_memory_descriptor *)(memory_map_addr + i * descriptor_size);
|
||||
if ((entry->Attribute & EFI_MEMORY_RUNTIME) != 0)
|
||||
map_range(entry->VirtualStart, entry->PhysicalStart,
|
||||
entry->NumberOfPages * B_PAGE_SIZE,
|
||||
if ((entry->Attribute & EFI_MEMORY_RUNTIME) != 0) {
|
||||
map_range_to_new_area(entry,
|
||||
ARM_MMU_L2_FLAG_B | ARM_MMU_L2_FLAG_C | ARM_MMU_L2_FLAG_AP_RW);
|
||||
}
|
||||
}
|
||||
|
||||
void* cookie = NULL;
|
||||
|
||||
Reference in New Issue
Block a user