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,

Reply via email to