svn commit: r245143 - in projects/amd64_xen_pv/sys/amd64: include xen
Cherry G. Mathew
cherry at FreeBSD.org
Tue Jan 8 01:40:01 UTC 2013
Author: cherry
Date: Tue Jan 8 01:40:00 2013
New Revision: 245143
URL: http://svnweb.freebsd.org/changeset/base/245143
Log:
Since we don't yet have dmap, we temporarily map in pte space before modifying it.
Approved by: gibbs (implicit)
Modified:
projects/amd64_xen_pv/sys/amd64/include/pmap.h
projects/amd64_xen_pv/sys/amd64/xen/machdep.c
projects/amd64_xen_pv/sys/amd64/xen/pmap.c
Modified: projects/amd64_xen_pv/sys/amd64/include/pmap.h
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/include/pmap.h Tue Jan 8 01:33:22 2013 (r245142)
+++ projects/amd64_xen_pv/sys/amd64/include/pmap.h Tue Jan 8 01:40:00 2013 (r245143)
@@ -190,7 +190,13 @@ extern u_int64_t KPML4phys; /* physical
* Note: these work recursively, thus vtopte of a pte will give
* the corresponding pde that in turn maps it.
*/
+
+#ifdef XEN
+pt_entry_t *vtopte_hold(vm_offset_t, void *);
+void vtopte_release(vm_offset_t, void *);
+#else
pt_entry_t *vtopte(vm_offset_t);
+#endif
#define vtophys(va) pmap_kextract(((vm_offset_t) (va)))
static __inline pt_entry_t
Modified: projects/amd64_xen_pv/sys/amd64/xen/machdep.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/machdep.c Tue Jan 8 01:33:22 2013 (r245142)
+++ projects/amd64_xen_pv/sys/amd64/xen/machdep.c Tue Jan 8 01:40:00 2013 (r245143)
@@ -554,7 +554,7 @@ initxen(struct start_info *si)
/* setup proc 0's pcb */
thread0.td_pcb->pcb_flags = 0;
- thread0.td_pcb->pcb_cr3 = KPML4phys;
+ thread0.td_pcb->pcb_cr3 = VTOP(KPML4phys);
thread0.td_frame = &proc0_tf;
env = getenv("kernelname");
Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap.c Tue Jan 8 01:33:22 2013 (r245142)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap.c Tue Jan 8 01:40:00 2013 (r245143)
@@ -669,7 +669,7 @@ pmap_init(void)
va = kmem_alloc_nofault(kernel_map, PAGE_SIZE);
KASSERT(va != 0, ("Could not allocate KVA for console page!\n"));
- pmap_kenter(va, xpmap_mtop(console_ma));
+ pmap_kenter_ma(va, console_ma);
console_page = (void *)va;
}
@@ -730,12 +730,11 @@ pmap_release(pmap_t pmap)
}
pt_entry_t *
-vtopte(uintptr_t va)
+vtopte_hold(uintptr_t va, void *addr)
{
- KASSERT(tsz != 0, ("tsz != 0"));
- char tbuf[tsz]; /* Safe to do this on the stack since tsz is
- * effectively const.
- */
+ KASSERT(addr != NULL, ("addr == NULL"));
+
+ mmu_map_t tptr = *(mmu_map_t *)addr;
const uint64_t SIGNMASK = (1UL << 48) - 1;
@@ -743,15 +742,13 @@ vtopte(uintptr_t va)
pd_entry_t *pte; /* PTE address to return */
-
- mmu_map_t tptr = tbuf;
-
struct mmu_map_mbackend mb = {
ptmb_mappedalloc,
ptmb_mappedfree,
ptmb_ptov,
ptmb_vtop
};
+
mmu_map_t_init(tptr, &mb);
if (!mmu_map_inspect_va(kernel_pmap, tptr, va)) {
@@ -763,10 +760,20 @@ vtopte(uintptr_t va)
/* add VA offset */
pte += (va & PDRMASK) >> PAGE_SHIFT;
+ return pte;
+}
+
+void
+vtopte_release(uintptr_t va, void *addr)
+{
+ mmu_map_t tptr = *(mmu_map_t *)addr;
+ const uint64_t SIGNMASK = (1UL << 48) - 1;
+
+ va &= SIGNMASK; /* Remove sign extension */
+
mmu_map_release_va(kernel_pmap, tptr, va);
mmu_map_t_fini(tptr);
- return pte;
}
#ifdef SMP
@@ -968,8 +975,7 @@ pmap_kextract_ma(vm_offset_t va)
mmu_map_t_fini(tptr);
nomapping:
- /* XXX: why do we need to enforce alignment ? */
- return ma & ~0x7UL;
+ return (ma & PG_FRAME) | (va & ~PG_FRAME);
}
/***************************************************
@@ -1029,7 +1035,6 @@ pmap_kenter_ma(vm_offset_t va, vm_paddr_
PT_SET_MA(va, ma | PG_RW | PG_V | PG_U);
PT_UPDATES_FLUSH();
- mmu_map_release_va(kernel_pmap, tptr, va);
mmu_map_t_fini(tptr);
}
@@ -1045,14 +1050,21 @@ pmap_kremove(vm_offset_t va)
{
pt_entry_t *pte;
- pte = vtopte(va);
+ char tbuf[tsz]; /* Safe to do this on the stack since tsz is
+ * effectively const.
+ */
+
+ mmu_map_t tptr = tbuf;
+
+ pte = vtopte_hold(va, &tptr);
if (pte == NULL) { /* Mapping doesn't exist */
return;
}
- PT_CLEAR_VA(pte, FALSE);
-
+ PT_CLEAR_VA(pte, TRUE);
PT_UPDATES_FLUSH();
+
+ // vtopte_release(va, &tptr);
}
/*
More information about the svn-src-projects
mailing list