svn commit: r252192 - projects/bhyve_npt_pmap/sys/amd64/amd64
Neel Natu
neel at FreeBSD.org
Tue Jun 25 03:57:28 UTC 2013
Author: neel
Date: Tue Jun 25 03:57:27 2013
New Revision: 252192
URL: http://svnweb.freebsd.org/changeset/base/252192
Log:
vtopte()/vtopde() can never be used to lookup the PTE/PDE associated with
a guest physical address since the page tables pointed to by the nested pmap
are never installed in the host %cr3.
The recursive mapping used by these functions will end up using the page
tables associated with the host thread that provides the execution context
for the vcpu - which is clearly wrong!
Since the user virtual address space is numerically identical to the
guest physical address space this restriction can be expressed in terms
of VM_MAXUSER_ADDRESS.
This is safe because the amd64/pmap code never uses vtopte()/vtopde() for
user virtual addresses.
Modified:
projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c
Modified: projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c Tue Jun 25 02:48:36 2013 (r252191)
+++ projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c Tue Jun 25 03:57:27 2013 (r252192)
@@ -473,6 +473,8 @@ vtopte(vm_offset_t va)
{
u_int64_t mask = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
+ KASSERT(va >= VM_MAXUSER_ADDRESS, ("vtopte on a uva/gpa 0x%0lx", va));
+
return (PTmap + ((va >> PAGE_SHIFT) & mask));
}
@@ -481,6 +483,8 @@ vtopde(vm_offset_t va)
{
u_int64_t mask = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
+ KASSERT(va >= VM_MAXUSER_ADDRESS, ("vtopde on a uva/gpa 0x%0lx", va));
+
return (PDmap + ((va >> PDRSHIFT) & mask));
}
More information about the svn-src-projects
mailing list