Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Oct 2013 16:46:02 +0000 (UTC)
From:      "Cherry G. Mathew" <cherry@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r256278 - projects/amd64_xen_pv/sys/amd64/xen
Message-ID:  <201310101646.r9AGk2Dq036337@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cherry
Date: Thu Oct 10 16:46:02 2013
New Revision: 256278
URL: http://svnweb.freebsd.org/changeset/base/256278

Log:
  Use pmap->pm_cr3 to cache the Machine Address of the current process VA.
  
  Approved by: gibbs(implicit)

Modified:
  projects/amd64_xen_pv/sys/amd64/xen/pmap.c

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Thu Oct 10 16:31:47 2013	(r256277)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Thu Oct 10 16:46:02 2013	(r256278)
@@ -641,6 +641,7 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 	 */
 	PMAP_LOCK_INIT(kernel_pmap);
 	kernel_pmap->pm_pml4 = (pdp_entry_t *)KPML4phys;
+	kernel_pmap->pm_cr3 = pmap_kextract_ma((vm_offset_t) KPML4phys);
 	kernel_pmap->pm_root.rt_root = 0;
 	CPU_FILL(&kernel_pmap->pm_active);	/* don't allow deactivation */
 	pmap_pv_init();
@@ -751,6 +752,7 @@ pmap_pinit0(pmap_t pmap)
 {
 	PMAP_LOCK_INIT(pmap);
 	pmap->pm_pml4 = (void *) KPML4phys;
+	pmap->pm_cr3 = pmap_kextract_ma((vm_offset_t) KPML4phys);
 	pmap->pm_root.rt_root = 0;
 	CPU_ZERO(&pmap->pm_active);
 	PCPU_SET(curpmap, pmap);
@@ -771,6 +773,8 @@ pmap_pinit(pmap_t pmap)
 	pmap->pm_pml4 = (void *) kmem_malloc(kernel_arena, PAGE_SIZE, M_ZERO);
 	if (pmap->pm_pml4 == NULL) return 0;
 
+	pmap->pm_cr3 = pmap_kextract_ma((vm_offset_t)pmap->pm_pml4);
+
 	/* 
 	 * We do not wire in kernel space, or the self-referencial
 	 * entry in userspace pmaps becase both kernel and userland
@@ -784,7 +788,7 @@ pmap_pinit(pmap_t pmap)
 
 	pmap_xen_setpages_ro((uintptr_t)pmap->pm_pml4, 1);
 
-	xen_pgdir_pin(pmap_kextract_ma((uintptr_t)pmap->pm_pml4));
+	xen_pgdir_pin(pmap->pm_cr3);
 
 	pmap->pm_root.rt_root = 0;
 	CPU_ZERO(&pmap->pm_active);
@@ -810,7 +814,7 @@ void pmap_xen_userload(pmap_t pmap)
 	PT_UPDATES_FLUSH();
 
 	/* Tell xen about user pmap switch */
-	xen_pt_user_switch(vtomach(pmap->pm_pml4));
+	xen_pt_user_switch(pmap->pm_cr3);
 }
 
 void
@@ -819,7 +823,7 @@ pmap_release(pmap_t pmap)
 	KASSERT(pmap != kernel_pmap,
 		("%s: kernel pmap released", __func__));
 
-	xen_pgdir_unpin(pmap_kextract_ma((uintptr_t)pmap->pm_pml4));
+	xen_pgdir_unpin(pmap->pm_cr3);
 	pmap_xen_setpages_rw((uintptr_t)pmap->pm_pml4, 1);
 
 	bzero(pmap->pm_pml4, PAGE_SIZE);
@@ -2108,7 +2112,6 @@ pmap_activate(struct thread *td)
 {
 	pmap_t	pmap, oldpmap;
 	u_int	cpuid;
-	u_int64_t  cr3;
 
 	critical_enter();
 	pmap = vmspace_pmap(td->td_proc->p_vmspace);
@@ -2117,14 +2120,15 @@ pmap_activate(struct thread *td)
 #ifdef SMP
 	CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
 	CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
+	CPU_SET_ATOMIC(cpuid, &pmap->pm_save);
 #else
 	CPU_CLR(cpuid, &oldpmap->pm_active);
 	CPU_SET(cpuid, &pmap->pm_active);
+	CPU_SET(cpuid, &pmap->pm_save);
 #endif
-	cr3 = pmap_kextract((vm_offset_t)pmap->pm_pml4);
-	td->td_pcb->pcb_cr3 = cr3;
+	td->td_pcb->pcb_cr3 = pmap->pm_cr3;
 	if (__predict_false(pmap == kernel_pmap)) {
-		xen_load_cr3(cr3);
+		load_cr3(pmap->pm_cr3);
 	}
 	else {
 		pmap_xen_userload(pmap);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310101646.r9AGk2Dq036337>