Date: Mon, 11 Jun 2012 18:09:04 +0000 (UTC) From: "Cherry G. Mathew" <cherry@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r236902 - projects/amd64_xen_pv/sys/amd64/xen Message-ID: <201206111809.q5BI94hN001723@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 <vm/vm.h> +#include <vm/vm_extern.h> +#include <vm/vm_object.h> #include <vm/vm_page.h> #include <vm/vm_param.h> +#include <vm/vm_kern.h> #include <vm/pmap.h> #include <machine/md_var.h> @@ -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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206111809.q5BI94hN001723>