From owner-svn-src-projects@FreeBSD.ORG Mon Jun 11 18:09:04 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id A955C106566C; Mon, 11 Jun 2012 18:09:04 +0000 (UTC) (envelope-from cherry@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8A96A8FC0C; Mon, 11 Jun 2012 18:09:04 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q5BI94hc001725; Mon, 11 Jun 2012 18:09:04 GMT (envelope-from cherry@svn.freebsd.org) Received: (from cherry@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q5BI94hN001723; Mon, 11 Jun 2012 18:09:04 GMT (envelope-from cherry@svn.freebsd.org) Message-Id: <201206111809.q5BI94hN001723@svn.freebsd.org> From: "Cherry G. Mathew" Date: Mon, 11 Jun 2012 18:09:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r236902 - projects/amd64_xen_pv/sys/amd64/xen X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 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: Mon, 11 Jun 2012 18:09:04 -0000 Author: cherry Date: Mon Jun 11 18:09:04 2012 New Revision: 236902 URL: http://svn.freebsd.org/changeset/base/236902 Log: Map in the console shared page, which the xen domU console driver uses to communicate with the hypervisor for console i/o. While at it, enable the boot to progress a bit more with temporary shims in pmap.c 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 Mon Jun 11 18:02:30 2012 (r236901) +++ projects/amd64_xen_pv/sys/amd64/xen/pmap.c Mon Jun 11 18:09:04 2012 (r236902) @@ -129,8 +129,11 @@ __FBSDID("$FreeBSD$"); #endif #include +#include +#include #include #include +#include #include #include @@ -188,6 +191,7 @@ static vm_paddr_t ptmb_vtop(vm_offset_t } extern uint64_t xenstack; /* The stack Xen gives us at boot */ +extern char *console_page; /* The shared ring for console i/o */ /* return kernel virtual address of 'n' claimed physical pages at boot. */ static vm_offset_t @@ -198,6 +202,9 @@ vallocpages(vm_paddr_t *firstaddr, int n *firstaddr += n * PAGE_SIZE; /* Make sure we are still inside of available mapped va. */ + if (PTOV(*firstaddr) > (xenstack + 512 * 1024)) { + printk("Attempt to use unmapped va\n"); + } KASSERT(PTOV(*firstaddr) <= (xenstack + 512 * 1024), ("Attempt to use unmapped va\n")); return (ret); @@ -409,10 +416,9 @@ create_boot_pagetables(vm_paddr_t *first /* * - * Map in the xen provided shared pages. They are: - * - shared info page - * - console page (XXX:) - * - XXX: + * Map in the xen provided share page. Note: The console page is + * mapped in later in the boot process, when kmem_alloc*() is + * available. */ static void @@ -580,7 +586,7 @@ pmap_growkernel(vm_offset_t addr) int pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED; vm_page_t m = vm_page_alloc(NULL, 0, pflags); KASSERT(m != NULL, ("Backing page alloc failed!")); - vm_paddr_t pa =m->phys_addr; + vm_paddr_t pa = VM_PAGE_TO_PHYS(m); pmap_kenter(addr, pa); } @@ -595,6 +601,15 @@ pmap_init(void) gdtset = 1; /* xpq may assert for locking sanity from this point onwards */ /* XXX: switch the mmu_map.c backend to something more sane */ + + /* Get a va for console and map the console mfn into it */ + vm_paddr_t console_ma = xen_start_info->console.domU.mfn << PAGE_SHIFT; + + vm_offset_t va = kmem_alloc_nofault(kernel_map, PAGE_SIZE); + KASSERT(va != 0, ("Could not allocate KVA for console page!\n")); + PT_SET_MA(va, console_ma | PG_RW | PG_V | PG_U); + + console_page = (void *)va; } void @@ -673,11 +688,36 @@ pmap_qremove(vm_offset_t sva, int count) KASSERT(0, ("XXX: TODO\n")); } +/* + * Insert the given physical page (p) at + * the specified virtual address (v) in the + * target physical map with the protection requested. + * + * If specified, the page will be wired down, meaning + * that the related pte can not be reclaimed. + * + * NB: This is the only routine which MAY NOT lazy-evaluate + * or lose information. That is, this routine must actually + * insert this page into the given map NOW. + */ + void pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, vm_prot_t prot, boolean_t wired) { - KASSERT(0, ("XXX: TODO\n")); + va = trunc_page(va); + KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig")); + KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS, + ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", + va)); + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + VM_OBJECT_LOCKED(m->object), + ("pmap_enter: page %p is not busy", m)); + + pmap_kenter(va, VM_PAGE_TO_PHYS(m)); /* Shim to keep bootup + * happy for now */ + + /* XXX: TODO: */ } void @@ -760,7 +800,6 @@ pmap_kenter(vm_offset_t va, vm_paddr_t p ptmb_ptov, ptmb_vtop }; - mmu_map_t_init(tptr, &mb); if (!mmu_map_inspect_va(kernel_pmap, tptr, va)) { @@ -867,7 +906,7 @@ pmap_zero_page(vm_page_t m) vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)); /* XXX: temp fix, dmap not yet implemented. */ - pmap_kenter(va, m->phys_addr); + pmap_kenter(va, VM_PAGE_TO_PHYS(m)); pagezero((void *)va); } @@ -975,11 +1014,28 @@ pmap_sync_icache(pmap_t pm, vm_offset_t KASSERT(0, ("XXX: TODO\n")); } +/* + * Increase the starting virtual address of the given mapping if a + * different alignment might result in more superpage mappings. + */ void pmap_align_superpage(vm_object_t object, vm_ooffset_t offset, vm_offset_t *addr, vm_size_t size) { - KASSERT(0, ("XXX: TODO\n")); + vm_offset_t superpage_offset; + + if (size < NBPDR) + return; + if (object != NULL && (object->flags & OBJ_COLORED) != 0) + offset += ptoa(object->pg_color); + superpage_offset = offset & PDRMASK; + if (size - ((NBPDR - superpage_offset) & PDRMASK) < NBPDR || + (*addr & PDRMASK) == superpage_offset) + return; + if ((*addr & PDRMASK) < superpage_offset) + *addr = (*addr & ~PDRMASK) + superpage_offset; + else + *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset; } int