Module Name: src Committed By: skrll Date: Sat Mar 20 14:30:50 UTC 2021
Modified Files: src/sys/arch/aarch64/aarch64: locore.S pmapboot.c src/sys/arch/aarch64/include: pmap.h Log Message: Make pmapboot_enter panic if anything goes wrong and any mappings overlap rather than only doing it in locore.S To generate a diff of this commit: cvs rdiff -u -r1.76 -r1.77 src/sys/arch/aarch64/aarch64/locore.S cvs rdiff -u -r1.15 -r1.16 src/sys/arch/aarch64/aarch64/pmapboot.c cvs rdiff -u -r1.45 -r1.46 src/sys/arch/aarch64/include/pmap.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/locore.S diff -u src/sys/arch/aarch64/aarch64/locore.S:1.76 src/sys/arch/aarch64/aarch64/locore.S:1.77 --- src/sys/arch/aarch64/aarch64/locore.S:1.76 Sat Jan 9 15:07:42 2021 +++ src/sys/arch/aarch64/aarch64/locore.S Sat Mar 20 14:30:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.76 2021/01/09 15:07:42 jmcneill Exp $ */ +/* $NetBSD: locore.S,v 1.77 2021/03/20 14:30:50 skrll Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -38,7 +38,7 @@ #include <aarch64/hypervisor.h> #include "assym.h" -RCSID("$NetBSD: locore.S,v 1.76 2021/01/09 15:07:42 jmcneill Exp $") +RCSID("$NetBSD: locore.S,v 1.77 2021/03/20 14:30:50 skrll Exp $") #ifdef AARCH64_DEVICE_MEM_STRONGLY_ORDERED #define MAIR_DEVICE_MEM MAIR_DEVICE_nGnRnE @@ -832,7 +832,7 @@ init_mmutable: #endif /* - * int + * void * pmapboot_enter( * x0: vaddr_t va, * x1: paddr_t pa, @@ -853,7 +853,6 @@ init_mmutable: orr x4, x4, #LX_BLKPAG_UXN | LX_BLKPAG_PXN /* attr */ mov x5, x26 /* pr func */ bl pmapboot_enter - cbnz x0, init_mmutable_error #endif /* identity mapping for kernel image */ @@ -869,7 +868,6 @@ init_mmutable: orr x4, x4, #LX_BLKPAG_UXN mov x5, x26 /* pr func */ bl pmapboot_enter - cbnz x0, init_mmutable_error #ifdef FDT VPRINT("Creating identity mapping for FDT\n") @@ -884,7 +882,6 @@ init_mmutable: orr x4, x4, #LX_BLKPAG_UXN | LX_BLKPAG_PXN /* attr */ mov x5, x26 /* pr func */ bl pmapboot_enter - cbnz x0, init_mmutable_error #endif VPRINT("Creating KVA=PA tables\n") @@ -897,7 +894,6 @@ init_mmutable: orr x4, x4, #LX_BLKPAG_UXN mov x5, x26 /* pr func */ bl pmapboot_enter - cbnz x0, init_mmutable_error VPRINT("OK\n"); mov x0, xzr Index: src/sys/arch/aarch64/aarch64/pmapboot.c diff -u src/sys/arch/aarch64/aarch64/pmapboot.c:1.15 src/sys/arch/aarch64/aarch64/pmapboot.c:1.16 --- src/sys/arch/aarch64/aarch64/pmapboot.c:1.15 Sat Jan 9 13:42:25 2021 +++ src/sys/arch/aarch64/aarch64/pmapboot.c Sat Mar 20 14:30:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: pmapboot.c,v 1.15 2021/01/09 13:42:25 jmcneill Exp $ */ +/* $NetBSD: pmapboot.c,v 1.16 2021/03/20 14:30:50 skrll Exp $ */ /* * Copyright (c) 2018 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmapboot.c,v 1.15 2021/01/09 13:42:25 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmapboot.c,v 1.16 2021/03/20 14:30:50 skrll Exp $"); #include "opt_arm_debug.h" #include "opt_ddb.h" @@ -207,7 +207,7 @@ tlb_contiguous_p(vaddr_t va, paddr_t pa, * pmapboot_enter() accesses pagetables by physical address. * this should be called while identity mapping (VA=PA) available. */ -int +void pmapboot_enter(vaddr_t va, paddr_t pa, psize_t size, psize_t blocksize, pt_entry_t attr, void (*pr)(const char *, ...) __printflike(1, 2)) { @@ -232,7 +232,7 @@ pmapboot_enter(vaddr_t va, paddr_t pa, p level = 3; break; default: - return -1; + panic("%s: bad blocksize (%" PRIxPSIZE ")", __func__, blocksize); } VPRINTF("pmapboot_enter: va=0x%lx, pa=0x%lx, size=0x%lx, " @@ -260,7 +260,8 @@ pmapboot_enter(vaddr_t va, paddr_t pa, p ttbr = 1; break; default: - return -1; + panic("%s: unknown address space (%d/%" PRIxVADDR ")", __func__, + aarch64_addressspace(va), va); } while (va < va_end) { @@ -275,7 +276,7 @@ pmapboot_enter(vaddr_t va, paddr_t pa, p if (l1 == NULL) { VPRINTF("pmapboot_enter: " "cannot allocate L1 page\n"); - return -1; + panic("%s: can't allocate memory", __func__); } pte = (uint64_t)l1 | L0_TABLE; @@ -320,7 +321,7 @@ pmapboot_enter(vaddr_t va, paddr_t pa, p if (l2 == NULL) { VPRINTF("pmapboot_enter: " "cannot allocate L2 page\n"); - return -1; + panic("%s: can't allocate memory", __func__); } pte = (uint64_t)l2 | L1_TABLE; @@ -364,7 +365,7 @@ pmapboot_enter(vaddr_t va, paddr_t pa, p if (l3 == NULL) { VPRINTF("pmapboot_enter: " "cannot allocate L3 page\n"); - return -1; + panic("%s: can't allocate memory", __func__); } pte = (uint64_t)l3 | L2_TABLE; @@ -440,7 +441,8 @@ pmapboot_enter(vaddr_t va, paddr_t pa, p dsb(ish); - return nskip; + if (nskip != 0) + panic("%s: overlapping/incompatible mappings (%d)", __func__, nskip); } paddr_t pmapboot_pagebase __attribute__((__section__(".data"))); @@ -465,13 +467,12 @@ pmapboot_pagealloc(void) return (pd_entry_t *)pa; } -int +void pmapboot_enter_range(vaddr_t va, paddr_t pa, psize_t size, pt_entry_t attr, void (*pr)(const char *, ...) __printflike(1, 2)) { vaddr_t vend; vsize_t left, mapsize, nblocks; - int nskip = 0; vend = round_page(va + size); va = trunc_page(va); @@ -484,7 +485,7 @@ pmapboot_enter_range(vaddr_t va, paddr_t mapsize = nblocks * L3_SIZE; VPRINTF("Creating L3 tables: %016lx-%016lx : %016lx-%016lx\n", va, va + mapsize - 1, pa, pa + mapsize - 1); - nskip += pmapboot_enter(va, pa, mapsize, L3_SIZE, attr, pr); + pmapboot_enter(va, pa, mapsize, L3_SIZE, attr, pr); va += mapsize; pa += mapsize; left -= mapsize; @@ -497,7 +498,7 @@ pmapboot_enter_range(vaddr_t va, paddr_t mapsize = nblocks * L2_SIZE; VPRINTF("Creating L2 tables: %016lx-%016lx : %016lx-%016lx\n", va, va + mapsize - 1, pa, pa + mapsize - 1); - nskip += pmapboot_enter(va, pa, mapsize, L2_SIZE, attr, pr); + pmapboot_enter(va, pa, mapsize, L2_SIZE, attr, pr); va += mapsize; pa += mapsize; left -= mapsize; @@ -508,7 +509,7 @@ pmapboot_enter_range(vaddr_t va, paddr_t mapsize = nblocks * L1_SIZE; VPRINTF("Creating L1 tables: %016lx-%016lx : %016lx-%016lx\n", va, va + mapsize - 1, pa, pa + mapsize - 1); - nskip += pmapboot_enter(va, pa, mapsize, L1_SIZE, attr, pr); + pmapboot_enter(va, pa, mapsize, L1_SIZE, attr, pr); va += mapsize; pa += mapsize; left -= mapsize; @@ -519,7 +520,7 @@ pmapboot_enter_range(vaddr_t va, paddr_t mapsize = nblocks * L2_SIZE; VPRINTF("Creating L2 tables: %016lx-%016lx : %016lx-%016lx\n", va, va + mapsize - 1, pa, pa + mapsize - 1); - nskip += pmapboot_enter(va, pa, mapsize, L2_SIZE, attr, pr); + pmapboot_enter(va, pa, mapsize, L2_SIZE, attr, pr); va += mapsize; pa += mapsize; left -= mapsize; @@ -530,11 +531,9 @@ pmapboot_enter_range(vaddr_t va, paddr_t mapsize = nblocks * L3_SIZE; VPRINTF("Creating L3 tables: %016lx-%016lx : %016lx-%016lx\n", va, va + mapsize - 1, pa, pa + mapsize - 1); - nskip += pmapboot_enter(va, pa, mapsize, L3_SIZE, attr, pr); + pmapboot_enter(va, pa, mapsize, L3_SIZE, attr, pr); va += mapsize; pa += mapsize; left -= mapsize; } - - return nskip; } Index: src/sys/arch/aarch64/include/pmap.h diff -u src/sys/arch/aarch64/include/pmap.h:1.45 src/sys/arch/aarch64/include/pmap.h:1.46 --- src/sys/arch/aarch64/include/pmap.h:1.45 Sun Jan 31 08:14:58 2021 +++ src/sys/arch/aarch64/include/pmap.h Sat Mar 20 14:30:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.45 2021/01/31 08:14:58 skrll Exp $ */ +/* $NetBSD: pmap.h,v 1.46 2021/03/20 14:30:50 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -180,9 +180,9 @@ pt_entry_t pmap_kvattr(vaddr_t, vm_prot_ /* pmapboot.c */ pd_entry_t *pmapboot_pagealloc(void); -int pmapboot_enter(vaddr_t, paddr_t, psize_t, psize_t, pt_entry_t, +void pmapboot_enter(vaddr_t, paddr_t, psize_t, psize_t, pt_entry_t, void (*pr)(const char *, ...) __printflike(1, 2)); -int pmapboot_enter_range(vaddr_t, paddr_t, psize_t, pt_entry_t, +void pmapboot_enter_range(vaddr_t, paddr_t, psize_t, pt_entry_t, void (*)(const char *, ...) __printflike(1, 2)); int pmapboot_protect(vaddr_t, vaddr_t, vm_prot_t); void pmap_db_pte_print(pt_entry_t, int,