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 <[email protected]>
@@ -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 <[email protected]>
@@ -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,