[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XenPPC] [pushed] [ppc] implement HYPERVISOR_grant_table_op()



# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID cf43edb4abe5691e0214d7ca354591cdede8c3a4
# Parent  f77f8c43a9091dc9db869f927eb348f5bde1f165
[ppc] implement HYPERVISOR_grant_table_op()
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>

diff -r f77f8c43a909 -r cf43edb4abe5 arch/powerpc/platforms/xen/hcall.c
--- a/arch/powerpc/platforms/xen/hcall.c        Wed May 24 13:17:46 2006 -0500
+++ b/arch/powerpc/platforms/xen/hcall.c        Wed May 24 15:00:05 2006 -0500
@@ -11,6 +11,7 @@
 #include <xen/interface/sched.h>
 #include <xen/interface/event_channel.h>
 #include <xen/interface/physdev.h>
+#include <xen/interface/grant_table.h>
 #include <xen/public/privcmd.h>
 #include <asm/hypercall.h>
 #include <asm/page.h>
@@ -122,6 +123,62 @@ int HYPERVISOR_physdev_op(int cmd, void 
        return rc;
 }
 EXPORT_SYMBOL(HYPERVISOR_physdev_op);
+
+int HYPERVISOR_grant_table_op(unsigned int cmd, void *op, unsigned int count)
+{
+       struct xencomm_desc *desc;
+       struct xencomm_desc *frame_list;
+       long rc;
+       int argsize;
+
+       switch (cmd) {
+       case GNTTABOP_map_grant_ref:
+               argsize = sizeof(struct gnttab_map_grant_ref);
+               break;
+       case GNTTABOP_unmap_grant_ref:
+               argsize = sizeof(struct gnttab_unmap_grant_ref);
+               break;
+       case GNTTABOP_setup_table: {
+               struct gnttab_setup_table setup;
+
+               memcpy(&setup, op, sizeof(setup));
+               argsize = sizeof(setup);
+
+               rc = xencomm_create(xen_guest_handle(setup.frame_list),
+                               setup.nr_frames * 
sizeof(*xen_guest_handle(setup.frame_list)),
+                               &frame_list, GFP_KERNEL);
+               if (rc)
+                       return rc;
+
+               set_xen_guest_handle(setup.frame_list, (void 
*)__pa(frame_list));
+               op = &setup;
+               }
+               break;
+       case GNTTABOP_dump_table:
+               argsize = sizeof(struct gnttab_dump_table);
+               break;
+       case GNTTABOP_transfer:
+               argsize = sizeof(struct gnttab_transfer);
+               break;
+       default:
+               printk("%s: unknown grant table op %d\n", __func__, cmd);
+               return -ENOSYS;
+       }
+
+       rc = xencomm_create(op, argsize, &desc, GFP_KERNEL);
+       if (rc)
+               return rc;
+
+       rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_grant_table_op), cmd,
+                       __pa(desc), count);
+
+       if (cmd == GNTTABOP_setup_table)
+               xencomm_free(frame_list);
+       xencomm_free(desc);
+
+       return rc;
+}
+EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
 
 static int xenppc_privcmd_dom0_op(privcmd_hypercall_t *hypercall)
 {
diff -r f77f8c43a909 -r cf43edb4abe5 include/asm-powerpc/xen/asm/hypercall.h
--- a/include/asm-powerpc/xen/asm/hypercall.h   Wed May 24 13:17:46 2006 -0500
+++ b/include/asm-powerpc/xen/asm/hypercall.h   Wed May 24 15:00:05 2006 -0500
@@ -41,6 +41,8 @@ extern int HYPERVISOR_event_channel_op(i
 extern int HYPERVISOR_event_channel_op(int cmd, void *op);
 extern int HYPERVISOR_xen_version(int cmd, void *arg);
 extern int HYPERVISOR_physdev_op(int cmd, void *op);
+extern int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop,
+               unsigned int count);
 
 static inline int HYPERVISOR_sched_op(int cmd, unsigned long arg)
 {



_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.