From owner-svn-src-projects@FreeBSD.ORG Tue Jan 8 01:40:01 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 6C01CAF4; Tue, 8 Jan 2013 01:40:01 +0000 (UTC) (envelope-from cherry@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 5E2E61B8; Tue, 8 Jan 2013 01:40:01 +0000 (UTC) Received: from svn.freebsd.org (svn.FreeBSD.org [8.8.178.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r081e1Sc062773; Tue, 8 Jan 2013 01:40:01 GMT (envelope-from cherry@svn.freebsd.org) Received: (from cherry@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r081e05a062768; Tue, 8 Jan 2013 01:40:00 GMT (envelope-from cherry@svn.freebsd.org) Message-Id: <201301080140.r081e05a062768@svn.freebsd.org> From: "Cherry G. Mathew" Date: Tue, 8 Jan 2013 01:40:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r245143 - in projects/amd64_xen_pv/sys/amd64: include xen X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Jan 2013 01:40:01 -0000 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); } /*