Module Name: src
Committed By: maxv
Date: Fri Feb 1 11:35:13 UTC 2019
Modified Files:
src/sys/arch/x86/include: pmap.h
src/sys/arch/x86/x86: pmap.c
Log Message:
Add the remaining pmap callbacks, will be used by NVMM-VMX.
To generate a diff of this commit:
cvs rdiff -u -r1.94 -r1.95 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.318 -r1.319 src/sys/arch/x86/x86/pmap.c
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/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.94 src/sys/arch/x86/include/pmap.h:1.95
--- src/sys/arch/x86/include/pmap.h:1.94 Fri Feb 1 05:44:29 2019
+++ src/sys/arch/x86/include/pmap.h Fri Feb 1 11:35:13 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.94 2019/02/01 05:44:29 maxv Exp $ */
+/* $NetBSD: pmap.h,v 1.95 2019/02/01 11:35:13 maxv Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -263,7 +263,15 @@ struct pmap {
/* Used by NVMM. */
int (*pm_enter)(struct pmap *, vaddr_t, paddr_t, vm_prot_t, u_int);
+ bool (*pm_extract)(struct pmap *, vaddr_t, paddr_t *);
void (*pm_remove)(struct pmap *, vaddr_t, vaddr_t);
+ int (*pm_sync_pv)(struct vm_page *, vaddr_t, paddr_t, int, uint8_t *,
+ pt_entry_t *);
+ void (*pm_pp_remove_ent)(struct pmap *, struct vm_page *, pt_entry_t,
+ vaddr_t);
+ void (*pm_write_protect)(struct pmap *, vaddr_t, vaddr_t, vm_prot_t);
+ void (*pm_unwire)(struct pmap *, vaddr_t);
+
void (*pm_tlb_flush)(struct pmap *);
void *pm_data;
};
Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.318 src/sys/arch/x86/x86/pmap.c:1.319
--- src/sys/arch/x86/x86/pmap.c:1.318 Fri Feb 1 05:44:29 2019
+++ src/sys/arch/x86/x86/pmap.c Fri Feb 1 11:35:13 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.318 2019/02/01 05:44:29 maxv Exp $ */
+/* $NetBSD: pmap.c,v 1.319 2019/02/01 11:35:13 maxv Exp $ */
/*
* Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc.
@@ -130,7 +130,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.318 2019/02/01 05:44:29 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.319 2019/02/01 11:35:13 maxv Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
@@ -2387,8 +2387,14 @@ pmap_create(void)
pmap->pm_flags = 0;
pmap->pm_gc_ptp = NULL;
+ /* Used by NVMM. */
pmap->pm_enter = NULL;
+ pmap->pm_extract = NULL;
pmap->pm_remove = NULL;
+ pmap->pm_sync_pv = NULL;
+ pmap->pm_pp_remove_ent = NULL;
+ pmap->pm_write_protect = NULL;
+ pmap->pm_unwire = NULL;
pmap->pm_tlb_flush = NULL;
pmap->pm_data = NULL;
@@ -2542,7 +2548,11 @@ pmap_destroy(struct pmap *pmap)
pmap_free_ptps(pmap->pm_gc_ptp);
- pool_cache_put(&pmap_pdp_cache, pmap->pm_pdir);
+ if (__predict_false(pmap->pm_enter != NULL)) {
+ pool_cache_destruct_object(&pmap_pdp_cache, pmap->pm_pdir);
+ } else {
+ pool_cache_put(&pmap_pdp_cache, pmap->pm_pdir);
+ }
#ifdef USER_LDT
if (pmap->pm_ldt != NULL) {
@@ -3051,6 +3061,10 @@ pmap_extract(struct pmap *pmap, vaddr_t
lwp_t *l;
bool hard, rv;
+ if (__predict_false(pmap->pm_extract != NULL)) {
+ return (*pmap->pm_extract)(pmap, va, pap);
+ }
+
#ifdef __HAVE_DIRECT_MAP
if (va >= PMAP_DIRECT_BASE && va < PMAP_DIRECT_END) {
if (pap != NULL) {
@@ -3625,6 +3639,11 @@ pmap_sync_pv(struct pv_pte *pvpte, paddr
KASSERT(ptp == NULL || ptp_va2o(va, 1) == ptp->offset);
pmap = ptp_to_pmap(ptp);
+ if (__predict_false(pmap->pm_sync_pv != NULL)) {
+ return (*pmap->pm_sync_pv)(ptp, va, pa, clearbits, oattrs,
+ optep);
+ }
+
if (clearbits != ~0) {
KASSERT((clearbits & ~(PP_ATTRS_M|PP_ATTRS_U|PP_ATTRS_W)) == 0);
clearbits = pmap_pp_attrs_to_pte(clearbits);
@@ -3762,7 +3781,11 @@ startover:
if (ptp != NULL) {
KASSERT(pmap != pmap_kernel());
pmap_tlb_shootnow();
- pmap_pp_remove_ent(pmap, ptp, opte, va);
+ if (__predict_false(pmap->pm_pp_remove_ent != NULL)) {
+ (*pmap->pm_pp_remove_ent)(pmap, ptp, opte, va);
+ } else {
+ pmap_pp_remove_ent(pmap, ptp, opte, va);
+ }
pmap_destroy(pmap);
} else {
KASSERT(pmap == pmap_kernel());
@@ -3980,6 +4003,11 @@ pmap_write_protect(struct pmap *pmap, va
KASSERT(curlwp->l_md.md_gc_pmap != pmap);
+ if (__predict_false(pmap->pm_write_protect != NULL)) {
+ (*pmap->pm_write_protect)(pmap, sva, eva, prot);
+ return;
+ }
+
bit_rem = 0;
if (!(prot & VM_PROT_WRITE))
bit_rem = PG_RW;
@@ -4048,6 +4076,11 @@ pmap_unwire(struct pmap *pmap, vaddr_t v
pd_entry_t * const *pdes;
struct pmap *pmap2;
+ if (__predict_false(pmap->pm_unwire != NULL)) {
+ (*pmap->pm_unwire)(pmap, va);
+ return;
+ }
+
/* Acquire pmap. */
kpreempt_disable();
pmap_map_ptes(pmap, &pmap2, &ptes, &pdes);
@@ -4545,6 +4578,13 @@ pmap_growkernel(vaddr_t maxkvaddr)
mutex_enter(&pmaps_lock);
LIST_FOREACH(pm, &pmaps, pm_list) {
+ if (__predict_false(pm->pm_enter != NULL)) {
+ /*
+ * Not a native pmap, the kernel is not mapped,
+ * so nothing to synchronize.
+ */
+ continue;
+ }
memcpy(&pm->pm_pdir[PDIR_SLOT_KERN + old],
&kpm->pm_pdir[PDIR_SLOT_KERN + old],
newpdes * sizeof(pd_entry_t));