Module Name: src Committed By: skrll Date: Sun Mar 21 07:32:44 UTC 2021
Modified Files: src/sys/arch/aarch64/aarch64: aarch64_machdep.c src/sys/arch/aarch64/include: asan.h vmparam.h Log Message: Adjust the kernel virtual address space so that KASAN will map the kernel seperately from managed kernel virtual memory and not map the unused space between the two. To generate a diff of this commit: cvs rdiff -u -r1.57 -r1.58 src/sys/arch/aarch64/aarch64/aarch64_machdep.c cvs rdiff -u -r1.16 -r1.17 src/sys/arch/aarch64/include/asan.h cvs rdiff -u -r1.17 -r1.18 src/sys/arch/aarch64/include/vmparam.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/aarch64/aarch64/aarch64_machdep.c diff -u src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.57 src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.58 --- src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.57 Sun Mar 21 07:17:12 2021 +++ src/sys/arch/aarch64/aarch64/aarch64_machdep.c Sun Mar 21 07:32:44 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: aarch64_machdep.c,v 1.57 2021/03/21 07:17:12 skrll Exp $ */ +/* $NetBSD: aarch64_machdep.c,v 1.58 2021/03/21 07:32:44 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.57 2021/03/21 07:17:12 skrll Exp $"); +__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.58 2021/03/21 07:32:44 skrll Exp $"); #include "opt_arm_debug.h" #include "opt_cpuoptions.h" @@ -96,6 +96,11 @@ vaddr_t module_start, module_end; static struct vm_map module_map_store; #endif +#ifdef KASAN +vaddr_t kasan_kernelstart; +vaddr_t kasan_kernelsize; +#endif + /* XXX */ vaddr_t physical_start; vaddr_t physical_end; @@ -195,6 +200,11 @@ cpu_kernel_vm_init(uint64_t memory_start kernstart_phys, kernend_phys, kernend_extra); fdt_memory_remove_range(kernstart_phys, kernend_phys - kernstart_phys + kernend_extra); + +#ifdef KASAN + kasan_kernelstart = kernstart; + kasan_kernelsize = L2_ROUND_BLOCK(kernend) - kernstart; +#endif } @@ -245,8 +255,10 @@ initarm_common(vaddr_t kvm_base, vsize_t kernstart = trunc_page((vaddr_t)__kernel_text); kernend = round_page((vaddr_t)_end); + kernstart_l2 = L2_TRUNC_BLOCK(kernstart); kernend_l2 = L2_ROUND_BLOCK(kernend); + kernelvmstart = kernend_l2; #ifdef MODULAR @@ -266,6 +278,10 @@ initarm_common(vaddr_t kvm_base, vsize_t kernelvmstart = module_end; #endif /* MODULAR */ + KASSERT(kernelvmstart < VM_KERNEL_VM_BASE); + + kernelvmstart = VM_KERNEL_VM_BASE; + paddr_t kernstart_phys __unused = KERN_VTOPHYS(kernstart); paddr_t kernend_phys __unused = KERN_VTOPHYS(kernend); @@ -307,12 +323,13 @@ initarm_common(vaddr_t kvm_base, vsize_t "kernel_start_l2 = 0x%016lx\n" "kernel_start = 0x%016lx\n" "kernel_end = 0x%016lx\n" + "(extra) = 0x%016lx\n" "kernel_end_l2 = 0x%016lx\n" #ifdef MODULAR "module_start = 0x%016lx\n" "module_end = 0x%016lx\n" #endif - "(kernel va area)\n" + "(kernel va area) = 0x%016lx\n" "(devmap va area) = 0x%016lx\n" "VM_MAX_KERNEL_ADDRESS = 0x%016lx\n" "------------------------------------------\n", @@ -328,11 +345,13 @@ initarm_common(vaddr_t kvm_base, vsize_t kernstart_l2, kernstart, kernend, + kernend_extra, kernend_l2, #ifdef MODULAR module_start, module_end, #endif + VM_KERNEL_VM_BASE, VM_KERNEL_IO_ADDRESS, VM_MAX_KERNEL_ADDRESS); Index: src/sys/arch/aarch64/include/asan.h diff -u src/sys/arch/aarch64/include/asan.h:1.16 src/sys/arch/aarch64/include/asan.h:1.17 --- src/sys/arch/aarch64/include/asan.h:1.16 Fri Dec 11 18:03:33 2020 +++ src/sys/arch/aarch64/include/asan.h Sun Mar 21 07:32:44 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: asan.h,v 1.16 2020/12/11 18:03:33 skrll Exp $ */ +/* $NetBSD: asan.h,v 1.17 2021/03/21 07:32:44 skrll Exp $ */ /* * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net @@ -206,10 +206,14 @@ kasan_md_init(void) CTASSERT((__MD_SHADOW_SIZE / L0_SIZE) == 64); + extern vaddr_t kasan_kernelstart; + extern vaddr_t kasan_kernelsize; + + kasan_shadow_map((void *)kasan_kernelstart, kasan_kernelsize); + /* The VAs we've created until now. */ vaddr_t eva = pmap_growkernel(VM_KERNEL_VM_BASE); - kasan_shadow_map((void *)VM_MIN_KERNEL_ADDRESS, - eva - VM_MIN_KERNEL_ADDRESS); + kasan_shadow_map((void *)VM_KERNEL_VM_BASE, eva - VM_KERNEL_VM_BASE); } static inline bool Index: src/sys/arch/aarch64/include/vmparam.h diff -u src/sys/arch/aarch64/include/vmparam.h:1.17 src/sys/arch/aarch64/include/vmparam.h:1.18 --- src/sys/arch/aarch64/include/vmparam.h:1.17 Tue Nov 10 07:51:19 2020 +++ src/sys/arch/aarch64/include/vmparam.h Sun Mar 21 07:32:44 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: vmparam.h,v 1.17 2020/11/10 07:51:19 skrll Exp $ */ +/* $NetBSD: vmparam.h,v 1.18 2021/03/21 07:32:44 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -133,6 +133,7 @@ * 0xffff_8000_0000_0000 - 1G EFI_RUNTIME * 0xffff_8000_4000_0000 - 64T (not used) * 0xffff_c000_0000_0000 - 64T KERNEL VM Space (including text/data/bss) + * (0xffff_c000_4000_0000 -1GB) KERNEL VM start of KVM * 0xffff_ffff_f000_0000 - 254M KERNEL_IO for pmap_devmap * 0xffff_ffff_ffe0_0000 - 2M RESERVED */ @@ -146,9 +147,8 @@ #define VM_KERNEL_IO_ADDRESS 0xfffffffff0000000L #define VM_KERNEL_IO_SIZE (VM_MAX_KERNEL_ADDRESS - VM_KERNEL_IO_ADDRESS) -#define VM_KERNEL_VM_BASE VM_MIN_KERNEL_ADDRESS -#define VM_KERNEL_VM_SIZE (VM_MAX_KERNEL_ADDRESS - VM_KERNEL_VM_BASE) - +#define VM_KERNEL_VM_BASE (0xffffc00040000000L) +#define VM_KERNEL_VM_SIZE (VM_KERNEL_IO_ADDRESS - VM_KERNEL_VM_BASE) /* * Reserved space for EFI runtime services */