Convert xen_shm_map() and xen_shm_unmap() to the Xen3 grant table

interface.
This commit is contained in:
bouyer 2006-05-25 21:26:20 +00:00
parent 8a1a8b8c5c
commit d1d1596e1e
2 changed files with 54 additions and 15 deletions

View File

@ -1,7 +1,7 @@
/* $NetBSD: xen_shm_machdep.c,v 1.14 2006/01/15 22:09:51 bouyer Exp $ */ /* $NetBSD: xen_shm_machdep.c,v 1.15 2006/05/25 21:26:20 bouyer Exp $ */
/* /*
* Copyright (c) 2005 Manuel Bouyer. * Copyright (c) 2006 Manuel Bouyer.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -120,13 +120,24 @@ xen_shm_init()
} }
int int
#ifdef XEN3
xen_shm_map(int nentries, int domid, grant_ref_t gref, vaddr_t *vap,
grant_handle_t *handlep, int flags)
#else
xen_shm_map(paddr_t *ma, int nentries, int domid, vaddr_t *vap, int flags) xen_shm_map(paddr_t *ma, int nentries, int domid, vaddr_t *vap, int flags)
#endif
{ {
int i, s; int s;
vaddr_t new_va; vaddr_t new_va;
u_long new_va_pg; u_long new_va_pg;
#ifdef XEN3
int err;
gnttab_map_grant_ref_t op;
#else
int i;
multicall_entry_t mcl[XENSHM_MAX_PAGES_PER_REQUEST]; multicall_entry_t mcl[XENSHM_MAX_PAGES_PER_REQUEST];
int remap_prot = PG_V | PG_RW | PG_U | PG_M; int remap_prot = PG_V | PG_RW | PG_U | PG_M;
#endif
#ifdef DIAGNOSTIC #ifdef DIAGNOSTIC
if (nentries > XENSHM_MAX_PAGES_PER_REQUEST) { if (nentries > XENSHM_MAX_PAGES_PER_REQUEST) {
@ -168,6 +179,18 @@ xen_shm_map(paddr_t *ma, int nentries, int domid, vaddr_t *vap, int flags)
splx(s); splx(s);
new_va = new_va_pg << PAGE_SHIFT; new_va = new_va_pg << PAGE_SHIFT;
#ifdef XEN3
op.host_addr = new_va;
op.dom = domid;
op.ref = gref;
op.flags = GNTMAP_host_map | ((flags & XSHM_RO) ? GNTMAP_readonly : 0);
err = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
if (__predict_false(err))
panic("xen_shm_map: HYPERVISOR_grant_table_op failed");
if (__predict_false(op.status))
return op.status;
*handlep = op.handle;
#else /* !XEN3 */
for (i = 0; i < nentries; i++, new_va_pg++) { for (i = 0; i < nentries; i++, new_va_pg++) {
mcl[i].op = __HYPERVISOR_update_va_mapping_otherdomain; mcl[i].op = __HYPERVISOR_update_va_mapping_otherdomain;
mcl[i].args[0] = new_va_pg; mcl[i].args[0] = new_va_pg;
@ -203,20 +226,26 @@ xen_shm_map(paddr_t *ma, int nentries, int domid, vaddr_t *vap, int flags)
return EINVAL; return EINVAL;
} }
} }
#endif /* !XEN3 */
*vap = new_va; *vap = new_va;
return 0; return 0;
} }
void void
#ifdef XEN3
xen_shm_unmap(vaddr_t va, int nentries, grant_handle_t handle)
#else
xen_shm_unmap(vaddr_t va, paddr_t *pa, int nentries, int domid) xen_shm_unmap(vaddr_t va, paddr_t *pa, int nentries, int domid)
#endif
{ {
#ifdef XEN3 #ifdef XEN3
multicall_entry_t mcl[XENSHM_MAX_PAGES_PER_REQUEST + 1]; gnttab_unmap_grant_ref_t op;
struct mmuext_op extop; int ret;
#else #else
multicall_entry_t mcl[XENSHM_MAX_PAGES_PER_REQUEST]; multicall_entry_t mcl[XENSHM_MAX_PAGES_PER_REQUEST];
int i;
#endif #endif
int i, s; int s;
struct xen_shm_callback_entry *xshmc; struct xen_shm_callback_entry *xshmc;
#ifdef DIAGNOSTIC #ifdef DIAGNOSTIC
@ -226,6 +255,16 @@ xen_shm_unmap(vaddr_t va, paddr_t *pa, int nentries, int domid)
} }
#endif #endif
#ifdef XEN3
op.host_addr = va;
op.dev_bus_addr = 0;
op.handle = handle;
ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
&op, 1);
if (__predict_false(ret))
panic("xen_shm_unmap: unmap failed");
va = va >> PAGE_SHIFT;
#else /* !XEN3 */
va = va >> PAGE_SHIFT; va = va >> PAGE_SHIFT;
for (i = 0; i < nentries; i++) { for (i = 0; i < nentries; i++) {
mcl[i].op = __HYPERVISOR_update_va_mapping; mcl[i].op = __HYPERVISOR_update_va_mapping;
@ -244,17 +283,10 @@ xen_shm_unmap(vaddr_t va, paddr_t *pa, int nentries, int domid)
#endif #endif
_xen_shm_vaddr2ma[va + i - xen_shm_base_address_pg] = -1; _xen_shm_vaddr2ma[va + i - xen_shm_base_address_pg] = -1;
} }
#ifdef XEN3
mcl[nentries].op = __HYPERVISOR_mmuext_op;
extop.cmd = MMUEXT_TLB_FLUSH_LOCAL;
mcl[i].args[0] = (long)&extop;
if (HYPERVISOR_multicall(mcl, nentries + 1) != 0)
panic("xen_shm_unmap");
#else
mcl[nentries - 1].args[2] = UVMF_FLUSH_TLB; mcl[nentries - 1].args[2] = UVMF_FLUSH_TLB;
if (HYPERVISOR_multicall(mcl, nentries) != 0) if (HYPERVISOR_multicall(mcl, nentries) != 0)
panic("xen_shm_unmap"); panic("xen_shm_unmap");
#endif #endif /* !XEN3 */
s = splvm(); /* splvm is the lowest level blocking disk and net IRQ */ s = splvm(); /* splvm is the lowest level blocking disk and net IRQ */
if (extent_free(xen_shm_ex, va, nentries, EX_NOWAIT) != 0) if (extent_free(xen_shm_ex, va, nentries, EX_NOWAIT) != 0)
panic("xen_shm_unmap: extent_free"); panic("xen_shm_unmap: extent_free");

View File

@ -1,4 +1,4 @@
/* $NetBSD: xen_shm.h,v 1.5 2005/12/11 12:19:48 christos Exp $ */ /* $NetBSD: xen_shm.h,v 1.6 2006/05/25 21:26:20 bouyer Exp $ */
/* /*
* Copyright (c) 2005 Manuel Bouyer. * Copyright (c) 2005 Manuel Bouyer.
@ -30,6 +30,7 @@
* *
*/ */
#include "opt_xen.h"
#include <machine/param.h> #include <machine/param.h>
#define XENSHM_MAX_PAGES_PER_REQUEST (MAXPHYS >> PAGE_SHIFT) #define XENSHM_MAX_PAGES_PER_REQUEST (MAXPHYS >> PAGE_SHIFT)
@ -40,10 +41,16 @@
* space, do I/O to it, and unmap it. * space, do I/O to it, and unmap it.
*/ */
#ifdef XEN3
int xen_shm_map(int, int, grant_ref_t, vaddr_t *, grant_handle_t *, int);
void xen_shm_unmap(vaddr_t, int, grant_handle_t);
#else
int xen_shm_map(paddr_t *, int, int, vaddr_t *, int); int xen_shm_map(paddr_t *, int, int, vaddr_t *, int);
void xen_shm_unmap(vaddr_t, paddr_t *, int, int); void xen_shm_unmap(vaddr_t, paddr_t *, int, int);
#endif
int xen_shm_callback(int (*)(void *), void *); int xen_shm_callback(int (*)(void *), void *);
int xen_shm_vaddr2ma(vaddr_t, paddr_t *); int xen_shm_vaddr2ma(vaddr_t, paddr_t *);
/* flags for xen_shm_map() */ /* flags for xen_shm_map() */
#define XSHM_CALLBACK 0x01 /* called from a callback */ #define XSHM_CALLBACK 0x01 /* called from a callback */
#define XSHM_RO 0x02 /* map the guest's memory read-only */