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

[XenPPC] [rfc][patch] privcmp from user and kernel



Hollis,
I think I got this right, I need to make the priv hcall available for
the kernel as well. Does this look right to you?

Ignore the HYPERVISOR_multicall() for now.

---

diff -r 28208ae097cb arch/powerpc/platforms/xen/hcall.c
--- a/arch/powerpc/platforms/xen/hcall.c        Mon Jun 05 16:55:22 2006 -0500
+++ b/arch/powerpc/platforms/xen/hcall.c        Tue Jun 06 13:21:39 2006 -0400
@@ -179,6 +179,13 @@ int HYPERVISOR_grant_table_op(unsigned i
        return rc;
 }
 EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
+
+int HYPERVISOR_multicall(void *call_list, int nr_calls)
+{
+       BUG_ON(1);
+       return -ENOSYS;
+}
+EXPORT_SYMBOL(HYPERVISOR_multicall);
 
 static int xenppc_privcmd_dom0_op(privcmd_hypercall_t *hypercall)
 {
@@ -314,56 +321,83 @@ out:
        return ret;
 }
 
-static int xenppc_privcmd_memory_op(privcmd_hypercall_t *hypercall)
-{
-       xen_memory_reservation_t kern_op;
-       xen_memory_reservation_t __user *user_op;
+int HYPERVISOR_memory_op(unsigned int cmd, void *arg)
+{
+       int ret;
        struct xencomm_desc *op_desc;
-       const unsigned long cmd = hypercall->arg[0];
-       int ret = 0;
-
-       user_op = (xen_memory_reservation_t __user *)hypercall->arg[1];
-       if (copy_from_user(&kern_op, user_op, sizeof(xen_memory_reservation_t)))
-               return -EFAULT;
-
-       ret = xencomm_create(&kern_op, sizeof(xen_memory_reservation_t),
+       xen_memory_reservation_t *mop;
+
+
+       mop = (xen_memory_reservation_t *)arg;
+       ret = xencomm_create(mop, sizeof(xen_memory_reservation_t),
                             &op_desc, GFP_KERNEL);
        if (ret)
                return ret;
 
        switch (cmd) {
        case XENMEM_increase_reservation:
-       case XENMEM_decrease_reservation: {
+       case XENMEM_decrease_reservation:
+       {
                struct xencomm_desc *desc = NULL;
-               if (xen_guest_handle(kern_op.extent_start)) {
+
+               if (xen_guest_handle(mop->extent_start)) {
                        ret = xencomm_create(
-                               xen_guest_handle(kern_op.extent_start),
-                               kern_op.nr_extents *
-                               sizeof(*xen_guest_handle(kern_op.extent_start)),
+                               xen_guest_handle(mop->extent_start),
+                               mop->nr_extents *
+                               sizeof(*xen_guest_handle(mop->extent_start)),
                                &desc, GFP_KERNEL);
                        if (ret)
-                               goto out;
-
-                       set_xen_guest_handle(kern_op.extent_start,
-                                                (void *)__pa(desc));
+                               return ret;
+
+                       set_xen_guest_handle(mop->extent_start,
+                                            (void *)__pa(desc));
                }
 
-               ret = plpar_hcall_norets(XEN_MARK(hypercall->op), cmd, 
__pa(op_desc));
+               ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_memory_op),
+                                        cmd, __pa(op_desc));
 
                xencomm_free(desc);
-               }
-               break;
-       default:
-               printk("%s: unknown memory cmd %ld\n", __func__, cmd);
+       }
+               break;
+               
+       case XENMEM_maximum_ram_page:
+               /* arg is NULL so we can call thru here */
+               ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_memory_op),
+                                       cmd, NULL);
+               break;
+       case XENMEM_populate_physmap:
+       case XENMEM_current_reservation:
+       case XENMEM_maximum_reservation:
+       case XENMEM_machphys_mfn_list:
+       case XENMEM_add_to_physmap:
+       case XENMEM_translate_gpfn_list:
+       default:
+               printk("%s: unknown grant table op %d\n", __func__, cmd);
                ret = -ENOSYS;
-               goto out;
-       }
-
-       if (copy_to_user(user_op, &kern_op, sizeof(xen_memory_reservation_t)))
+       }
+       xencomm_free(op_desc);
+       return ret;
+
+}
+EXPORT_SYMBOL(memory_op);
+
+static int xenppc_privcmd_memory_op(privcmd_hypercall_t *hypercall)
+{
+       xen_memory_reservation_t kern_op;
+       xen_memory_reservation_t __user *user_op;
+       const unsigned long cmd = hypercall->arg[0];
+       int ret = 0;
+
+       user_op = (xen_memory_reservation_t __user *)hypercall->arg[1];
+       if (copy_from_user(&kern_op, user_op,
+                          sizeof(xen_memory_reservation_t)))
                return -EFAULT;
 
-out:
-       xencomm_free(op_desc);
+       if (!HYPERVISOR_memory_op(cmd, &kern_op)) {
+               if (copy_to_user(user_op, &kern_op,
+                                sizeof(xen_memory_reservation_t)))
+                       return -EFAULT;
+       }
        return ret;
 }

_______________________________________________
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®.