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

[Xen-changelog] [linux-2.6.18-xen] IA64: xencomm support for multi call with physdev_op and event_channel_op.



# HG changeset patch
# User Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
# Date 1228271912 -32400
# Node ID 6743af9fffc6f531a73af66a86738aa3ab4a2366
# Parent  6591b4869889bdd705267c47ac855f0c4bb7d75b
IA64: xencomm support for multi call with physdev_op and event_channel_op.

Recently the c/s of d545a95fca73 makes use of multi call
with __HYPERVISOR_event_channel_op and __HYPERVISOR_physdev_op.
This patch adds support of those hypercall.

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 arch/ia64/xen/xcom_hcall.c |   78 +++++++++++++++++++++++++++++++++++++++------
 1 files changed, 69 insertions(+), 9 deletions(-)

diff -r 6591b4869889 -r 6743af9fffc6 arch/ia64/xen/xcom_hcall.c
--- a/arch/ia64/xen/xcom_hcall.c        Wed Nov 26 10:24:15 2008 +0900
+++ b/arch/ia64/xen/xcom_hcall.c        Wed Dec 03 11:38:32 2008 +0900
@@ -70,13 +70,27 @@ xencomm_hypercall_console_io(int cmd, in
 }
 EXPORT_SYMBOL_GPL(xencomm_hypercall_console_io);
 
+static int
+xencommize_event_channel_op(struct xencomm_mini **xc_area, void *op,
+                           struct xencomm_handle **desc)
+{
+       *desc = __xencomm_map_no_alloc(op, sizeof(evtchn_op_t), *xc_area);
+       if (*desc == NULL)
+               return -EINVAL;
+       (*xc_area)++;
+       return 0;
+}
+
 int
 xencomm_hypercall_event_channel_op(int cmd, void *op)
 {
-       struct xencomm_handle *desc;
-       desc = xencomm_map_no_alloc(op, sizeof(evtchn_op_t));
-       if (desc == NULL)
-               return -EINVAL;
+       int rc;
+       struct xencomm_handle *desc;
+       XENCOMM_MINI_ALIGNED(xc_area, 2);
+
+       rc = xencommize_event_channel_op(&xc_area, op, &desc);
+       if (rc)
+               return rc;
 
        return xencomm_arch_hypercall_event_channel_op(cmd, desc);
 }
@@ -127,8 +141,9 @@ xencomm_hypercall_xen_version(int cmd, v
 }
 EXPORT_SYMBOL_GPL(xencomm_hypercall_xen_version);
 
-int
-xencomm_hypercall_physdev_op(int cmd, void *op)
+static int
+xencommize_physdev_op(struct xencomm_mini **xc_area, int cmd, void *op,
+                     struct xencomm_handle **desc)
 {
        unsigned int argsize;
        
@@ -159,9 +174,26 @@ xencomm_hypercall_physdev_op(int cmd, vo
                printk("%s: unknown physdev op %d\n", __func__, cmd);
                return -ENOSYS;
        }
-       
-       return xencomm_arch_hypercall_physdev_op
-               (cmd, xencomm_map_no_alloc(op, argsize));
+
+       *desc = __xencomm_map_no_alloc(op, argsize, *xc_area);
+       if (*desc == NULL)
+               return -EINVAL;
+       (*xc_area)++;
+       return 0;
+}
+
+int
+xencomm_hypercall_physdev_op(int cmd, void *op)
+{
+       int rc;
+       struct xencomm_handle *desc;
+       XENCOMM_MINI_ALIGNED(xc_area, 2);
+
+       rc = xencommize_physdev_op(&xc_area, cmd, op, &desc);
+       if (rc)
+               return rc;
+
+       return xencomm_arch_hypercall_physdev_op(cmd, desc);
 }
 
 static int
@@ -320,6 +352,34 @@ xencomm_hypercall_multicall(void *call_l
                                return rc;
                        mce->args[1] = (unsigned long)desc;
                        break;
+               case __HYPERVISOR_event_channel_op:
+                       rc = xencommize_event_channel_op(&xc_area,
+                                                        (void *)mce->args[1],
+                                                        &desc);
+                       if (rc)
+                               return rc;
+                       mce->args[1] = (unsigned long)desc;
+                       break;
+               case __HYPERVISOR_physdev_op:
+                       switch (mce->args[0]) {
+                       case PHYSDEVOP_eoi: {
+                               struct physdev_eoi *eoi =
+                                       (struct physdev_eoi *)mce->args[1];
+                               mce->op = __HYPERVISOR_ia64_fast_eoi;
+                               mce->args[0] = eoi->irq;
+                               break;
+                       }
+                       default:
+                               rc = xencommize_physdev_op(&xc_area,
+                                                          mce->args[0],
+                                                          (void *)mce->args[1],
+                                                          &desc);
+                               if (rc)
+                                       return rc;
+                               mce->args[1] = (unsigned long)desc;
+                               break;
+                       }
+                       break;
                case __HYPERVISOR_memory_op:
                default:
                        printk("%s: unhandled multicall op entry op %lu\n",

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


 


Rackspace

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