From 1f46427d16f0f099ae2acf98680f81295d6fa895 Mon Sep 17 00:00:00 2001 From: David Karoly Date: Sun, 28 Nov 2021 16:13:11 +0100 Subject: [PATCH] kernel/arch/arm: introduce virtual_ranges_to_keep Change-Id: I36b8b871a103f2be87c600fc0b0a12f7ceff0ae4 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4743 Tested-by: Commit checker robot Reviewed-by: Adrien Destugues --- .../kernel/arch/arm/arch_kernel_args.h | 6 ++++ src/system/kernel/arch/arm/arch_vm.cpp | 34 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/headers/private/kernel/arch/arm/arch_kernel_args.h b/headers/private/kernel/arch/arm/arch_kernel_args.h index 78b34058d7..513848004b 100644 --- a/headers/private/kernel/arch/arm/arch_kernel_args.h +++ b/headers/private/kernel/arch/arm/arch_kernel_args.h @@ -16,6 +16,8 @@ #define _PACKED __attribute__((packed)) +#define MAX_VIRTUAL_RANGES_TO_KEEP 32 + // kernel args typedef struct { @@ -30,6 +32,10 @@ typedef struct { uint32 vir_pgdir; uint32 next_pagetable; + // The virtual ranges we want to keep in the kernel. + uint32 num_virtual_ranges_to_keep; + addr_range virtual_ranges_to_keep[MAX_VIRTUAL_RANGES_TO_KEEP]; + // needed for UEFI, otherwise kernel acpi support can't find ACPI root FixedWidthPointer acpi_root; FixedWidthPointer fdt; diff --git a/src/system/kernel/arch/arm/arch_vm.cpp b/src/system/kernel/arch/arm/arch_vm.cpp index a17f317d70..22610da76c 100644 --- a/src/system/kernel/arch/arm/arch_vm.cpp +++ b/src/system/kernel/arch/arm/arch_vm.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include //#include @@ -55,6 +56,39 @@ arch_vm_init_post_area(kernel_args *args) status_t arch_vm_init_end(kernel_args *args) { + TRACE(("arch_vm_init_end(): %" B_PRIu32 " virtual ranges to keep:\n", + args->arch_args.num_virtual_ranges_to_keep)); + + for (int i = 0; i < (int)args->arch_args.num_virtual_ranges_to_keep; i++) { + addr_range &range = args->arch_args.virtual_ranges_to_keep[i]; + + TRACE((" start: %p, size: %#" B_PRIxSIZE "\n", (void*)range.start, range.size)); + + // skip ranges outside the kernel address space + if (!IS_KERNEL_ADDRESS(range.start)) { + TRACE((" no kernel address, skipping...\n")); + continue; + } + + phys_addr_t physicalAddress; + void *address = (void*)range.start; + if (vm_get_page_mapping(VMAddressSpace::KernelID(), range.start, + &physicalAddress) != B_OK) + panic("arch_vm_init_end(): No page mapping for %p\n", address); + + area_id area = vm_map_physical_memory(VMAddressSpace::KernelID(), + "boot loader reserved area", &address, + B_EXACT_ADDRESS, range.size, + B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, + physicalAddress, true); + + if (area < 0) { + panic("arch_vm_init_end(): Failed to create area for boot loader " + "reserved area: %p - %p\n", (void*)range.start, + (void*)(range.start + range.size)); + } + } + // Throw away all mappings that are unused by the kernel vm_free_unused_boot_loader_range(KERNEL_LOAD_BASE, KERNEL_SIZE);