Date: Fri, 28 Nov 2008 16:25:43 +0000 (UTC) From: Doug Rabson <dfr@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r185388 - user/dfr/xenhvm/6/sys/xen Message-ID: <200811281625.mASGPhBc023570@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dfr Date: Fri Nov 28 16:25:43 2008 New Revision: 185388 URL: http://svn.freebsd.org/changeset/base/185388 Log: Add Xen HVM support. Modified: user/dfr/xenhvm/6/sys/xen/gnttab.c user/dfr/xenhvm/6/sys/xen/gnttab.h Modified: user/dfr/xenhvm/6/sys/xen/gnttab.c ============================================================================== --- user/dfr/xenhvm/6/sys/xen/gnttab.c Fri Nov 28 15:50:35 2008 (r185387) +++ user/dfr/xenhvm/6/sys/xen/gnttab.c Fri Nov 28 16:25:43 2008 (r185388) @@ -452,6 +452,8 @@ unmap_pte_fn(pte_t *pte, struct page *pm } #endif +#ifndef XENHVM + static int gnttab_map(unsigned int start_idx, unsigned int end_idx) { @@ -484,6 +486,8 @@ gnttab_map(unsigned int start_idx, unsig PANIC_IF(area == 0); shared = (grant_entry_t *)area; } + + for (i = 0; i < nr_gframes; i++) PT_SET_MA(((caddr_t)shared) + i*PAGE_SIZE, ((vm_paddr_t)frames[i]) << PAGE_SHIFT | PG_RW | PG_V); @@ -514,6 +518,59 @@ gnttab_suspend(void) return (0); } +#else /* XENHVM */ + +#include <dev/xen/xenpci/xenpcivar.h> + +static unsigned long resume_frames; + +static int gnttab_map(unsigned int start_idx, unsigned int end_idx) +{ + struct xen_add_to_physmap xatp; + unsigned int i = end_idx; + + /* Loop backwards, so that the first hypercall has the largest index, + * ensuring that the table will grow only once. + */ + do { + xatp.domid = DOMID_SELF; + xatp.idx = i; + xatp.space = XENMAPSPACE_grant_table; + xatp.gpfn = (resume_frames >> PAGE_SHIFT) + i; + if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) + panic("HYPERVISOR_memory_op failed to map gnttab"); + } while (i-- > start_idx); + + shared = pmap_mapdev(resume_frames, (end_idx + 1) * PAGE_SIZE); + + return (0); +} + +int +gnttab_resume(void) +{ + int error; + unsigned int max_nr_gframes, nr_gframes; + + nr_gframes = nr_grant_frames; + max_nr_gframes = max_nr_grant_frames(); + if (max_nr_gframes < nr_gframes) + return -ENOSYS; + + if (!resume_frames) { + error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes, + &resume_frames); + if (error) { + printf("error mapping gnttab share frames\n"); + return (error); + } + } + + return (gnttab_map(0, nr_gframes - 1)); +} + +#endif + static int gnttab_expand(unsigned int req_entries) { @@ -564,7 +621,7 @@ gnttab_init(void *unused) goto ini_nomem; } - if (gnttab_resume() < 0) + if (gnttab_resume()) return -ENODEV; nr_init_grefs = nr_grant_frames * GREFS_PER_GRANT_FRAME; @@ -576,7 +633,8 @@ gnttab_init(void *unused) gnttab_free_count = nr_init_grefs - NR_RESERVED_ENTRIES; gnttab_free_head = NR_RESERVED_ENTRIES; - printk("Grant table initialized\n"); + if (bootverbose) + printf("Grant table initialized\n"); return 0; ini_nomem: Modified: user/dfr/xenhvm/6/sys/xen/gnttab.h ============================================================================== --- user/dfr/xenhvm/6/sys/xen/gnttab.h Fri Nov 28 15:50:35 2008 (r185387) +++ user/dfr/xenhvm/6/sys/xen/gnttab.h Fri Nov 28 16:25:43 2008 (r185388) @@ -43,6 +43,7 @@ #include <machine/xen/hypervisor.h> #include <xen/interface/grant_table.h> +#include <xen/interface/memory.h> #include <machine/xen/xen-os.h> #include <machine/xen/hypervisor.h> #include <machine/xen/features.h>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811281625.mASGPhBc023570>