Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/uvm/pmap Support pmap_growkernel and KASAN shadow mappin...
details: https://anonhg.NetBSD.org/src/rev/0888c47fecbf
branches: trunk
changeset: 1019688:0888c47fecbf
user: skrll <skrll%NetBSD.org@localhost>
date: Fri Mar 19 07:51:33 2021 +0000
description:
Support pmap_growkernel and KASAN shadow mapping of the new KVA.
Neither mips nor ppc booke actually use pmap_growkernel (at present).
Thanks to rin@ for testing a similar patch on ppc booke.
diffstat:
sys/arch/mips/mips/pmap_machdep.c | 6 ++++--
sys/arch/powerpc/booke/booke_pmap.c | 7 +++++--
sys/uvm/pmap/pmap.c | 33 ++++++++++++++++++++++++---------
sys/uvm/pmap/pmap.h | 7 ++++++-
4 files changed, 39 insertions(+), 14 deletions(-)
diffs (159 lines):
diff -r 2bbe5fec8a48 -r 0888c47fecbf sys/arch/mips/mips/pmap_machdep.c
--- a/sys/arch/mips/mips/pmap_machdep.c Fri Mar 19 01:02:52 2021 +0000
+++ b/sys/arch/mips/mips/pmap_machdep.c Fri Mar 19 07:51:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_machdep.c,v 1.33 2020/12/20 16:38:25 skrll Exp $ */
+/* $NetBSD: pmap_machdep.c,v 1.34 2021/03/19 07:51:33 skrll Exp $ */
/*-
* Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.33 2020/12/20 16:38:25 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.34 2021/03/19 07:51:33 skrll Exp $");
/*
* Manages physical address maps.
@@ -482,6 +482,8 @@
}
KASSERT(pmap_pte_lookup(pmap_kernel(), VM_MIN_KERNEL_ADDRESS) == sysmap);
+ /* update the top of the kernel VM - pmap_growkernel not required */
+ pmap_curmaxkvaddr = pmap_limits.virtual_end;
/*
* Initialize the pools.
*/
diff -r 2bbe5fec8a48 -r 0888c47fecbf sys/arch/powerpc/booke/booke_pmap.c
--- a/sys/arch/powerpc/booke/booke_pmap.c Fri Mar 19 01:02:52 2021 +0000
+++ b/sys/arch/powerpc/booke/booke_pmap.c Fri Mar 19 07:51:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: booke_pmap.c,v 1.31 2021/01/06 07:56:19 rin Exp $ */
+/* $NetBSD: booke_pmap.c,v 1.32 2021/03/19 07:51:33 skrll Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -37,7 +37,7 @@
#define __PMAP_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: booke_pmap.c,v 1.31 2021/01/06 07:56:19 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: booke_pmap.c,v 1.32 2021/03/19 07:51:33 skrll Exp $");
#ifdef _KERNEL_OPT
#include "opt_multiprocessor.h"
@@ -206,6 +206,9 @@
+ kv_nsegtabs * NBSEG;
}
+ /* update the top of the kernel VM - pmap_growkernel not required */
+ pmap_curmaxkvaddr = pmap_limits.virtual_end;
+
/*
* Now actually allocate the kernel PTE array (must be done
* after virtual_end is initialized).
diff -r 2bbe5fec8a48 -r 0888c47fecbf sys/uvm/pmap/pmap.c
--- a/sys/uvm/pmap/pmap.c Fri Mar 19 01:02:52 2021 +0000
+++ b/sys/uvm/pmap/pmap.c Fri Mar 19 07:51:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.60 2021/03/13 17:14:11 skrll Exp $ */
+/* $NetBSD: pmap.c,v 1.61 2021/03/19 07:51:33 skrll Exp $ */
/*-
* Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.60 2021/03/13 17:14:11 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.61 2021/03/19 07:51:33 skrll Exp $");
/*
* Manages physical address maps.
@@ -103,6 +103,7 @@
#include <sys/param.h>
+#include <sys/asan.h>
#include <sys/atomic.h>
#include <sys/buf.h>
#include <sys/cpu.h>
@@ -212,8 +213,12 @@
struct pmap * const kernel_pmap_ptr = &kernel_pmap_store.kernel_pmap;
+/* The current top of kernel VM - gets updated by pmap_growkernel */
+vaddr_t pmap_curmaxkvaddr;
+
struct pmap_limits pmap_limits = { /* VA and PA limits */
.virtual_start = VM_MIN_KERNEL_ADDRESS,
+ .virtual_end = VM_MAX_KERNEL_ADDRESS,
};
#ifdef UVMHIST
@@ -453,26 +458,36 @@
vaddr_t
pmap_growkernel(vaddr_t maxkvaddr)
{
- vaddr_t virtual_end = pmap_limits.virtual_end;
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "maxkvaddr=%#jx (%#jx)", maxkvaddr,
+ pmap_curmaxkvaddr, 0, 0);
+
+ vaddr_t virtual_end = pmap_curmaxkvaddr;
maxkvaddr = pmap_round_seg(maxkvaddr) - 1;
/*
+ * Don't exceed VM_MAX_KERNEL_ADDRESS!
+ */
+ if (maxkvaddr == 0 || maxkvaddr > VM_MAX_KERNEL_ADDRESS)
+ maxkvaddr = VM_MAX_KERNEL_ADDRESS;
+
+ /*
* Reserve PTEs for the new KVA space.
*/
for (; virtual_end < maxkvaddr; virtual_end += NBSEG) {
pmap_pte_reserve(pmap_kernel(), virtual_end, 0);
}
- /*
- * Don't exceed VM_MAX_KERNEL_ADDRESS!
- */
- if (virtual_end == 0 || virtual_end > VM_MAX_KERNEL_ADDRESS)
- virtual_end = VM_MAX_KERNEL_ADDRESS;
+ kasan_shadow_map((void *)pmap_curmaxkvaddr,
+ (size_t)(virtual_end - pmap_curmaxkvaddr));
/*
* Update new end.
*/
- pmap_limits.virtual_end = virtual_end;
+ pmap_curmaxkvaddr = virtual_end;
+
+ UVMHIST_LOG(pmaphist, " <-- done", 0, 0, 0, 0);
+
return virtual_end;
}
diff -r 2bbe5fec8a48 -r 0888c47fecbf sys/uvm/pmap/pmap.h
--- a/sys/uvm/pmap/pmap.h Fri Mar 19 01:02:52 2021 +0000
+++ b/sys/uvm/pmap/pmap.h Fri Mar 19 07:51:33 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.19 2020/12/21 08:41:38 skrll Exp $ */
+/* $NetBSD: pmap.h,v 1.20 2021/03/19 07:51:33 skrll Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -186,6 +186,11 @@
extern pmap_segtab_t pmap_kern_segtab;
+/*
+ * The current top of kernel VM
+ */
+extern vaddr_t pmap_curmaxkvaddr;
+
#define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count)
#define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
Home |
Main Index |
Thread Index |
Old Index