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

[Xen-changelog] [linux-2.6.18-xen] [IA64] Linux xencomm consolidation



# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1187293491 21600
# Node ID b5fdf02c38f4765697196f5fad5d1262f2c157f4
# Parent  60d8f0befd1810571b562a5120ced76868c86096
[IA64] Linux xencomm consolidation

Use common xencomm.c and remove ia64 xencomm.c

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 arch/ia64/xen/xcom_mini.c         |  488 --------------------------------------
 arch/ia64/Kconfig                 |    1 
 arch/ia64/kernel/setup.c          |    2 
 arch/ia64/xen/Makefile            |    2 
 arch/ia64/xen/hypervisor.c        |    2 
 arch/ia64/xen/xcom_hcall.c        |  445 +++++++++++++++++++++++++---------
 arch/ia64/xen/xcom_privcmd.c      |  219 +++++++++--------
 arch/ia64/xen/xencomm.c           |  158 ------------
 include/asm-ia64/hypercall.h      |   15 -
 include/asm-ia64/sal.h            |    6 
 include/asm-ia64/xen/xcom_hcall.h |   29 --
 include/asm-ia64/xen/xencomm.h    |   47 ---
 12 files changed, 467 insertions(+), 947 deletions(-)

diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/Kconfig
--- a/arch/ia64/Kconfig Thu Aug 16 10:58:46 2007 -0600
+++ b/arch/ia64/Kconfig Thu Aug 16 13:44:51 2007 -0600
@@ -61,6 +61,7 @@ config XEN
 config XEN
        bool "Xen hypervisor support"
        default y
+       select XEN_XENCOMM
        help
          Enable Xen hypervisor support.  Resulting kernel runs
          both as a guest OS on Xen and natively on hardware.
diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c  Thu Aug 16 10:58:46 2007 -0600
+++ b/arch/ia64/kernel/setup.c  Thu Aug 16 13:44:51 2007 -0600
@@ -449,7 +449,7 @@ setup_arch (char **cmdline_p)
                struct xen_ia64_opt_feature optf;
 
                /* Must be done before any hypercall.  */
-               xencomm_init();
+               xencomm_initialize();
 
                setup_xen_features();
                /* Register a call for panic conditions. */
diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/xen/Makefile
--- a/arch/ia64/xen/Makefile    Thu Aug 16 10:58:46 2007 -0600
+++ b/arch/ia64/xen/Makefile    Thu Aug 16 13:44:51 2007 -0600
@@ -3,7 +3,7 @@
 #
 
 obj-y := hypercall.o xenivt.o xenentry.o xensetup.o xenpal.o xenhpski.o \
-        hypervisor.o util.o xencomm.o xcom_hcall.o xcom_mini.o \
+        hypervisor.o util.o xencomm.o xcom_hcall.o \
         xcom_privcmd.o xen_dma.o
 
 obj-$(CONFIG_IA64_GENERIC) += machvec.o
diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/xen/hypervisor.c
--- a/arch/ia64/xen/hypervisor.c        Thu Aug 16 10:58:46 2007 -0600
+++ b/arch/ia64/xen/hypervisor.c        Thu Aug 16 13:44:51 2007 -0600
@@ -447,7 +447,7 @@ HYPERVISOR_grant_table_op(unsigned int c
                                (struct gnttab_map_grant_ref*)uop + i);
                }
        }
-       return xencomm_mini_hypercall_grant_table_op(cmd, uop, count);
+       return xencomm_hypercall_grant_table_op(cmd, uop, count);
 }
 EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
 
diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/xen/xcom_hcall.c
--- a/arch/ia64/xen/xcom_hcall.c        Thu Aug 16 10:58:46 2007 -0600
+++ b/arch/ia64/xen/xcom_hcall.c        Thu Aug 16 13:44:51 2007 -0600
@@ -14,6 +14,11 @@
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
  *          Tristan Gingold <tristan.gingold@xxxxxxxx>
+ *
+ *          Copyright (c) 2007
+ *          Isaku Yamahata <yamahata at valinux co jp>
+ *                          VA Linux Systems Japan K.K.
+ *          consolidate mini and inline version.
  */
 #include <linux/types.h>
 #include <linux/errno.h>
@@ -42,8 +47,8 @@
 
 /* Xencomm notes:
  * This file defines hypercalls to be used by xencomm.  The hypercalls simply
- * create inlines descriptors for pointers and then call the raw arch hypercall
- * xencomm_arch_hypercall_XXX
+ * create inlines or mini descriptors for pointers and then call the raw arch
+ * hypercall xencomm_arch_hypercall_XXX
  *
  * If the arch wants to directly use these hypercalls, simply define macros
  * in asm/hypercall.h, eg:
@@ -52,107 +57,206 @@
  * The arch may also define HYPERVISOR_xxx as a function and do more operations
  * before/after doing the hypercall.
  *
- * Note: because only inline descriptors are created these functions must only
- * be called with in kernel memory parameters.
+ * Note: because only inline or mini descriptors are created these functions
+ * must only be called with in kernel memory parameters.
  */
 
 int
 xencomm_hypercall_console_io(int cmd, int count, char *str)
 {
        return xencomm_arch_hypercall_console_io
-               (cmd, count, xencomm_create_inline(str));
-}
+               (cmd, count, xencomm_map_no_alloc(str, count));
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_console_io);
 
 int
 xencomm_hypercall_event_channel_op(int cmd, void *op)
 {
-       return xencomm_arch_hypercall_event_channel_op
-               (cmd, xencomm_create_inline(op));
-}
+       struct xencomm_handle *desc;
+       desc = xencomm_map_no_alloc(op, sizeof(evtchn_op_t));
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_event_channel_op(cmd, desc);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_event_channel_op);
 
 int
 xencomm_hypercall_xen_version(int cmd, void *arg)
 {
+       struct xencomm_handle *desc;
+       unsigned int argsize;
+
        switch (cmd) {
        case XENVER_version:
+               /* do not actually pass an argument */
+               return xencomm_arch_hypercall_xen_version(cmd, 0);
        case XENVER_extraversion:
+               argsize = sizeof(xen_extraversion_t);
+               break;
        case XENVER_compile_info:
+               argsize = sizeof(xen_compile_info_t);
+               break;
        case XENVER_capabilities:
+               argsize = sizeof(xen_capabilities_info_t);
+               break;
        case XENVER_changeset:
+               argsize = sizeof(xen_changeset_info_t);
+               break;
        case XENVER_platform_parameters:
+               argsize = sizeof(xen_platform_parameters_t);
+               break;
        case XENVER_pagesize:
+               argsize = (arg == NULL) ? 0 : sizeof(void *);
+               break;
        case XENVER_get_features:
-               break;
-       default:
-               printk("%s: unknown version cmd %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       return xencomm_arch_hypercall_xen_version
-               (cmd, xencomm_create_inline(arg));
-}
+               argsize = (arg == NULL) ? 0 : sizeof(xen_feature_info_t);
+               break;
+
+       default:
+               printk("%s: unknown version op %d\n", __func__, cmd);
+               return -ENOSYS;
+       }
+
+       desc = xencomm_map_no_alloc(arg, argsize);
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_xen_version(cmd, desc);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_xen_version);
 
 int
 xencomm_hypercall_physdev_op(int cmd, void *op)
 {
+       unsigned int argsize;
+       
+       switch (cmd) {
+       case PHYSDEVOP_apic_read:
+       case PHYSDEVOP_apic_write:
+               argsize = sizeof(physdev_apic_t);
+               break;
+       case PHYSDEVOP_alloc_irq_vector:
+       case PHYSDEVOP_free_irq_vector:
+               argsize = sizeof(physdev_irq_t);
+               break;
+       case PHYSDEVOP_irq_status_query:
+               argsize = sizeof(physdev_irq_status_query_t);
+               break;
+
+       default:
+               printk("%s: unknown physdev op %d\n", __func__, cmd);
+               return -ENOSYS;
+       }
+       
        return xencomm_arch_hypercall_physdev_op
-               (cmd, xencomm_create_inline(op));
-}
-
-static void *
-xencommize_grant_table_op(unsigned int cmd, void *op, unsigned int count)
-{
+               (cmd, xencomm_map_no_alloc(op, argsize));
+}
+
+static int
+xencommize_grant_table_op(struct xencomm_mini **xc_area,
+                         unsigned int cmd, void *op, unsigned int count,
+                         struct xencomm_handle **desc)
+{
+       struct xencomm_handle *desc1;
+       unsigned 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_unmap_and_replace:
+               argsize = sizeof(struct gnttab_unmap_and_replace);
                break;
        case GNTTABOP_setup_table:
        {
                struct gnttab_setup_table *setup = op;
-               struct xencomm_handle *frame_list;
-
-               frame_list = xencomm_create_inline
-                       (xen_guest_handle(setup->frame_list));
-
-               set_xen_guest_handle(setup->frame_list, (void *)frame_list);
+
+               argsize = sizeof(*setup);
+
+               if (count != 1)
+                       return -EINVAL;
+               desc1 = __xencomm_map_no_alloc
+                       (xen_guest_handle(setup->frame_list),
+                        setup->nr_frames *
+                        sizeof(*xen_guest_handle(setup->frame_list)),
+                        *xc_area);
+               if (desc1 == NULL)
+                       return -EINVAL;
+               (*xc_area)++;
+               set_xen_guest_handle(setup->frame_list, (void *)desc1);
                break;
        }
        case GNTTABOP_dump_table:
+               argsize = sizeof(struct gnttab_dump_table);
+               break;
        case GNTTABOP_transfer:
+               argsize = sizeof(struct gnttab_transfer);
+               break;
        case GNTTABOP_copy:
-               break;
-       default:
-               printk("%s: unknown grant table op %d\n", __func__, cmd);
+               argsize = sizeof(struct gnttab_copy);
+               break;
+       case GNTTABOP_query_size:
+               argsize = sizeof(struct gnttab_query_size);
+               break;
+       default:
+               printk("%s: unknown hypercall grant table op %d\n",
+                      __func__, cmd);
                BUG();
        }
 
-       return  xencomm_create_inline(op);
-}
-
-int
-xencomm_hypercall_grant_table_op(unsigned int cmd, void *op, unsigned int 
count)
-{
-       void *desc = xencommize_grant_table_op (cmd, op, count);
+       *desc = __xencomm_map_no_alloc(op, count * argsize, *xc_area);
+       if (*desc == NULL)
+               return -EINVAL;
+       (*xc_area)++;
+
+       return 0;
+}
+
+int
+xencomm_hypercall_grant_table_op(unsigned int cmd, void *op,
+                                      unsigned int count)
+{
+       int rc;
+       struct xencomm_handle *desc;
+       XENCOMM_MINI_ALIGNED(xc_area, 2);
+
+       rc = xencommize_grant_table_op(&xc_area, cmd, op, count, &desc);
+       if (rc)
+               return rc;
 
        return xencomm_arch_hypercall_grant_table_op(cmd, desc, count);
 }
+EXPORT_SYMBOL_GPL(xencomm_hypercall_grant_table_op);
 
 int
 xencomm_hypercall_sched_op(int cmd, void *arg)
 {
+       struct xencomm_handle *desc;
+       unsigned int argsize;
+
        switch (cmd) {
        case SCHEDOP_yield:
        case SCHEDOP_block:
+               argsize = 0;
+               break;
        case SCHEDOP_shutdown:
+               argsize = sizeof(sched_shutdown_t);
+               break;
        case SCHEDOP_remote_shutdown:
+               argsize = sizeof(sched_remote_shutdown_t);
                break;
        case SCHEDOP_poll:
        {
                sched_poll_t *poll = arg;
                struct xencomm_handle *ports;
 
-               ports = xencomm_create_inline(xen_guest_handle(poll->ports));
+               argsize = sizeof(sched_poll_t);
+               ports = xencomm_map_no_alloc(xen_guest_handle(poll->ports),
+                                    sizeof(*xen_guest_handle(poll->ports)));
 
                set_xen_guest_handle(poll->ports, (void *)ports);
                break;
@@ -162,14 +266,22 @@ xencomm_hypercall_sched_op(int cmd, void
                return -ENOSYS;
        }
        
-       return xencomm_arch_hypercall_sched_op(cmd, xencomm_create_inline(arg));
-}
+       desc = xencomm_map_no_alloc(arg, argsize);
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_sched_op(cmd, desc);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_sched_op);
 
 int
 xencomm_hypercall_multicall(void *call_list, int nr_calls)
 {
+       int rc;
        int i;
        multicall_entry_t *mce;
+       struct xencomm_handle *desc;
+       XENCOMM_MINI_ALIGNED(xc_area, nr_calls * 2);
 
        for (i = 0; i < nr_calls; i++) {
                mce = (multicall_entry_t *)call_list + i;
@@ -180,9 +292,13 @@ xencomm_hypercall_multicall(void *call_l
                        /* No-op on ia64.  */
                        break;
                case __HYPERVISOR_grant_table_op:
-                       mce->args[1] = (unsigned long)xencommize_grant_table_op
-                               (mce->args[0], (void *)mce->args[1],
-                                mce->args[2]);
+                       rc = xencommize_grant_table_op
+                               (&xc_area,
+                                mce->args[0], (void *)mce->args[1],
+                                mce->args[2], &desc);
+                       if (rc)
+                               return rc;
+                       mce->args[1] = (unsigned long)desc;
                        break;
                case __HYPERVISOR_memory_op:
                default:
@@ -192,17 +308,26 @@ xencomm_hypercall_multicall(void *call_l
                }
        }
 
-       return xencomm_arch_hypercall_multicall
-               (xencomm_create_inline(call_list), nr_calls);
-}
+       desc = xencomm_map_no_alloc(call_list,
+                                   nr_calls * sizeof(multicall_entry_t));
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_multicall(desc, nr_calls);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_multicall);
 
 int
 xencomm_hypercall_callback_op(int cmd, void *arg)
 {
+       unsigned int argsize;
        switch (cmd)
        {
        case CALLBACKOP_register:
+               argsize = sizeof(struct callback_register);
+               break;
        case CALLBACKOP_unregister:
+               argsize = sizeof(struct callback_unregister);
                break;
        default:
                printk("%s: unknown callback op %d\n", __func__, cmd);
@@ -210,16 +335,24 @@ xencomm_hypercall_callback_op(int cmd, v
        }
 
        return xencomm_arch_hypercall_callback_op
-               (cmd, xencomm_create_inline(arg));
-}
-
-static void
-xencommize_memory_reservation (xen_memory_reservation_t *mop)
-{
-       struct xencomm_handle *desc;
-
-       desc = xencomm_create_inline(xen_guest_handle(mop->extent_start));
+               (cmd, xencomm_map_no_alloc(arg, argsize));
+}
+
+static int
+xencommize_memory_reservation(struct xencomm_mini *xc_area,
+                             xen_memory_reservation_t *mop)
+{
+       struct xencomm_handle *desc;
+
+       desc = __xencomm_map_no_alloc(xen_guest_handle(mop->extent_start),
+                       mop->nr_extents *
+                       sizeof(*xen_guest_handle(mop->extent_start)),
+                       xc_area);
+       if (desc == NULL)
+               return -EINVAL;
+
        set_xen_guest_handle(mop->extent_start, (void *)desc);
+       return 0;
 }
 
 int
@@ -230,39 +363,61 @@ xencomm_hypercall_memory_op(unsigned int
        xen_memory_map_t *memmap = NULL;
        XEN_GUEST_HANDLE(void) buffer;
        int rc;
+       struct xencomm_handle *desc;
+       unsigned int argsize;
+       XENCOMM_MINI_ALIGNED(xc_area, 2);
 
        switch (cmd) {
        case XENMEM_increase_reservation:
        case XENMEM_decrease_reservation:
        case XENMEM_populate_physmap:
                xmr = (xen_memory_reservation_t *)arg;
-               xen_guest_handle(extent_start_va[0]) =
-                       xen_guest_handle(xmr->extent_start);
-               xencommize_memory_reservation((xen_memory_reservation_t *)arg);
+               set_xen_guest_handle(extent_start_va[0],
+                                    xen_guest_handle(xmr->extent_start));
+
+               argsize = sizeof(*xmr);
+               rc = xencommize_memory_reservation(xc_area, xmr);
+               if (rc)
+                       return rc;
+               xc_area++;
                break;
                
        case XENMEM_maximum_ram_page:
+               argsize = 0;
                break;
 
        case XENMEM_exchange:
                xme_in  = &((xen_memory_exchange_t *)arg)->in;
                xme_out = &((xen_memory_exchange_t *)arg)->out;
-               xen_guest_handle(extent_start_va[0]) =
-                       xen_guest_handle(xme_in->extent_start);
-               xen_guest_handle(extent_start_va[1]) =
-                       xen_guest_handle(xme_out->extent_start);
-               xencommize_memory_reservation
-                       (&((xen_memory_exchange_t *)arg)->in);
-               xencommize_memory_reservation
-                       (&((xen_memory_exchange_t *)arg)->out);
+               set_xen_guest_handle(extent_start_va[0],
+                                    xen_guest_handle(xme_in->extent_start));
+               set_xen_guest_handle(extent_start_va[1],
+                                    xen_guest_handle(xme_out->extent_start));
+
+               argsize = sizeof(xen_memory_exchange_t);
+               rc = xencommize_memory_reservation(xc_area, xme_in);
+               if (rc)
+                       return rc;
+               xc_area++;
+               rc = xencommize_memory_reservation(xc_area, xme_out);
+               if (rc)
+                       return rc;
+               xc_area++;
+               break;
+
+       case XENMEM_add_to_physmap:
+               argsize = sizeof(xen_add_to_physmap_t);
                break;
 
        case XENMEM_machine_memory_map:
+               argsize = sizeof(*memmap);
                memmap = (xen_memory_map_t *)arg;
-               xen_guest_handle(buffer) = xen_guest_handle(memmap->buffer);
-               set_xen_guest_handle(memmap->buffer,
-                       (void *)xencomm_create_inline(
-                               xen_guest_handle(memmap->buffer)));
+               set_xen_guest_handle(buffer, xen_guest_handle(memmap->buffer));
+               desc = xencomm_map_no_alloc(xen_guest_handle(memmap->buffer),
+                                             memmap->nr_entries);
+               if (desc == NULL)
+                       return -EINVAL;
+               set_xen_guest_handle(memmap->buffer, (void *)desc);
                break;
 
        default:
@@ -270,45 +425,59 @@ xencomm_hypercall_memory_op(unsigned int
                return -ENOSYS;
        }
 
-       rc =  xencomm_arch_hypercall_memory_op(cmd, xencomm_create_inline(arg));
+       desc = xencomm_map_no_alloc(arg, argsize);
+       if (desc == NULL)
+               return -EINVAL;
+
+       rc = xencomm_arch_hypercall_memory_op(cmd, desc);
 
        switch (cmd) {
        case XENMEM_increase_reservation:
        case XENMEM_decrease_reservation:
        case XENMEM_populate_physmap:
-               xen_guest_handle(xmr->extent_start) =
-                       xen_guest_handle(extent_start_va[0]);
+               set_xen_guest_handle(xmr->extent_start,
+                                    xen_guest_handle(extent_start_va[0]));
                break;
 
        case XENMEM_exchange:
-               xen_guest_handle(xme_in->extent_start) =
-                       xen_guest_handle(extent_start_va[0]);
-               xen_guest_handle(xme_out->extent_start) =
-                       xen_guest_handle(extent_start_va[1]);
+               set_xen_guest_handle(xme_in->extent_start,
+                                    xen_guest_handle(extent_start_va[0]));
+               set_xen_guest_handle(xme_out->extent_start,
+                                    xen_guest_handle(extent_start_va[1]));
                break;
 
        case XENMEM_machine_memory_map:
-               xen_guest_handle(memmap->buffer) = xen_guest_handle(buffer);
+               set_xen_guest_handle(memmap->buffer, xen_guest_handle(buffer));
                break;
        }
 
        return rc;
 }
+EXPORT_SYMBOL_GPL(xencomm_hypercall_memory_op);
 
 unsigned long
 xencomm_hypercall_hvm_op(int cmd, void *arg)
 {
-       switch (cmd) {
+       struct xencomm_handle *desc;
+       unsigned int argsize;
+
+       switch (cmd) {
+       case HVMOP_get_param:
        case HVMOP_set_param:
-       case HVMOP_get_param:
-               break;
-       default:
-               printk("%s: unknown hvm op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       return xencomm_arch_hypercall_hvm_op(cmd, xencomm_create_inline(arg));
-}
+               argsize = sizeof(xen_hvm_param_t);
+               break;
+       default:
+               printk("%s: unknown HVMOP %d\n", __func__, cmd);
+               return -EINVAL;
+       }
+
+       desc = xencomm_map_no_alloc(arg, argsize);
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_hvm_op(cmd, desc);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_hvm_op);
 
 int
 xencomm_hypercall_suspend(unsigned long srec)
@@ -317,18 +486,31 @@ xencomm_hypercall_suspend(unsigned long 
 
        arg.reason = SHUTDOWN_suspend;
 
-       return xencomm_arch_hypercall_suspend(xencomm_create_inline(&arg));
+       return xencomm_arch_hypercall_suspend(
+               xencomm_map_no_alloc(&arg, sizeof(arg)));
 }
 
 int
 xencomm_hypercall_xenoprof_op(int op, void *arg)
 {
+       unsigned int argsize;
+       struct xencomm_handle *desc;
+
        switch (op) {
        case XENOPROF_init:
+               argsize = sizeof(xenoprof_init_t);
+               break;
        case XENOPROF_set_active:
+               argsize = sizeof(domid_t);
+               break;
        case XENOPROF_set_passive:
+               argsize = sizeof(xenoprof_passive_t);
+               break;
        case XENOPROF_counter:
+               argsize = sizeof(xenoprof_counter_t);
+               break;
        case XENOPROF_get_buffer:
+               argsize = sizeof(xenoprof_get_buffer_t);
                break;
 
        case XENOPROF_reset_active_list:
@@ -342,25 +524,40 @@ xencomm_hypercall_xenoprof_op(int op, vo
        case XENOPROF_release_counters:
        case XENOPROF_shutdown:
                return xencomm_arch_hypercall_xenoprof_op(op, arg);
-               break;
 
        default:
                printk("%s: op %d isn't supported\n", __func__, op);
                return -ENOSYS;
        }
-       return xencomm_arch_hypercall_xenoprof_op(op,
-                                                 xencomm_create_inline(arg));
-}
-
-int
-xencomm_hypercall_perfmon_op(unsigned long cmd, void* arg, unsigned long count)
-{
+
+       desc = xencomm_map_no_alloc(arg, argsize);
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_xenoprof_op(op, desc);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_xenoprof_op);
+
+int
+xencomm_hypercall_perfmon_op(unsigned long cmd, void* arg,
+                                  unsigned long count)
+{
+       unsigned int argsize;
+       struct xencomm_handle *desc;
+
        switch (cmd) {
        case PFM_GET_FEATURES:
+               argsize = sizeof(pfarg_features_t);
+               break;
        case PFM_CREATE_CONTEXT:
+               argsize = sizeof(pfarg_context_t);
+               break;
+       case PFM_LOAD_CONTEXT:
+               argsize = sizeof(pfarg_load_t);
+               break;
        case PFM_WRITE_PMCS:
        case PFM_WRITE_PMDS:
-       case PFM_LOAD_CONTEXT:
+               argsize = sizeof(pfarg_reg_t) * count;
                break;
 
        case PFM_DESTROY_CONTEXT:
@@ -371,22 +568,32 @@ xencomm_hypercall_perfmon_op(unsigned lo
 
        default:
                printk("%s:%d cmd %ld isn't supported\n",
-                      __func__,__LINE__, cmd);
+                      __func__, __LINE__, cmd);
                BUG();
        }
 
-       return xencomm_arch_hypercall_perfmon_op(cmd,
-                                                xencomm_create_inline(arg),
-                                                count);
-}
+       desc = xencomm_map_no_alloc(arg, argsize);
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_perfmon_op(cmd, desc, count);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_perfmon_op);
 
 long
 xencomm_hypercall_vcpu_op(int cmd, int cpu, void *arg)
 {
-       switch (cmd) {
-       case VCPUOP_register_runstate_memory_area:
-               xencommize_memory_reservation((xen_memory_reservation_t *)arg);
-               break;
+       unsigned int argsize;
+       switch (cmd) {
+       case VCPUOP_register_runstate_memory_area: {
+               vcpu_register_runstate_memory_area_t *area =
+                       (vcpu_register_runstate_memory_area_t *)arg;
+               argsize = sizeof(*arg);
+               set_xen_guest_handle(area->addr.h,
+                    (void *)xencomm_map_no_alloc(area->addr.v,
+                                                 sizeof(area->addr.v)));
+               break;
+       }
 
        default:
                printk("%s: unknown vcpu op %d\n", __func__, cmd);
@@ -394,18 +601,26 @@ xencomm_hypercall_vcpu_op(int cmd, int c
        }
 
        return xencomm_arch_hypercall_vcpu_op(cmd, cpu,
-                                             xencomm_create_inline(arg));
+                                       xencomm_map_no_alloc(arg, argsize));
 }
 
 long
 xencomm_hypercall_opt_feature(void *arg)
 {
-       return xencomm_arch_hypercall_opt_feature(xencomm_create_inline(arg));
+       return xencomm_arch_hypercall_opt_feature(
+               xencomm_map_no_alloc(arg,
+                                    sizeof(struct xen_ia64_opt_feature)));
 }
 
 int
 xencomm_hypercall_fpswa_revision(unsigned int *revision)
 {
-       return xencomm_arch_hypercall_fpswa_revision(
-               xencomm_create_inline(revision));
-}
+       struct xencomm_handle *desc;
+
+       desc = xencomm_map_no_alloc(revision, sizeof(*revision));
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_fpswa_revision(desc);
+}
+EXPORT_SYMBOL_GPL(xencomm_hypercall_fpswa_revision);
diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/xen/xcom_mini.c
--- a/arch/ia64/xen/xcom_mini.c Thu Aug 16 10:58:46 2007 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,488 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- *          Tristan Gingold <tristan.gingold@xxxxxxxx>
- */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <xen/interface/xen.h>
-#include <xen/interface/platform.h>
-#include <xen/interface/memory.h>
-#include <xen/interface/xencomm.h>
-#include <xen/interface/version.h>
-#include <xen/interface/event_channel.h>
-#include <xen/interface/physdev.h>
-#include <xen/interface/grant_table.h>
-#include <xen/interface/hvm/params.h>
-#include <xen/interface/xenoprof.h>
-#ifdef CONFIG_VMX_GUEST
-#include <asm/hypervisor.h>
-#else
-#include <asm/hypercall.h>
-#endif
-#include <asm/xen/xencomm.h>
-#include <asm/perfmon.h>
-
-int
-xencomm_mini_hypercall_event_channel_op(int cmd, void *op)
-{
-       struct xencomm_mini xc_area[2];
-       int nbr_area = 2;
-       struct xencomm_handle *desc;
-       int rc;
-
-       rc = xencomm_create_mini(xc_area, &nbr_area,
-                                op, sizeof(evtchn_op_t), &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_event_channel_op(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_event_channel_op);
-
-static int
-xencommize_mini_grant_table_op(struct xencomm_mini *xc_area, int *nbr_area,
-                               unsigned int cmd, void *op, unsigned int count,
-                               struct xencomm_handle **desc)
-{
-       struct xencomm_handle *desc1;
-       unsigned int argsize;
-       int rc;
-
-       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_unmap_and_replace:
-               argsize = sizeof(struct gnttab_unmap_and_replace);
-               break;
-       case GNTTABOP_setup_table:
-       {
-               struct gnttab_setup_table *setup = op;
-
-               argsize = sizeof(*setup);
-
-               if (count != 1)
-                       return -EINVAL;
-               rc = xencomm_create_mini
-                       (xc_area, nbr_area,
-                        xen_guest_handle(setup->frame_list),
-                        setup->nr_frames 
-                        * sizeof(*xen_guest_handle(setup->frame_list)),
-                        &desc1);
-               if (rc)
-                       return rc;
-               set_xen_guest_handle(setup->frame_list, (void *)desc1);
-               break;
-       }
-       case GNTTABOP_dump_table:
-               argsize = sizeof(struct gnttab_dump_table);
-               break;
-       case GNTTABOP_transfer:
-               argsize = sizeof(struct gnttab_transfer);
-               break;
-       case GNTTABOP_copy:
-               argsize = sizeof(struct gnttab_copy);
-               break;
-       case GNTTABOP_query_size:
-               argsize = sizeof(struct gnttab_query_size);
-               break;
-       default:
-               printk("%s: unknown mini grant table op %d\n", __func__, cmd);
-               BUG();
-       }
-
-       rc = xencomm_create_mini(xc_area, nbr_area, op, count * argsize, desc);
-       if (rc)
-               return rc;
-
-       return 0;
-}
-
-int
-xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op,
-                                      unsigned int count)
-{
-       int rc;
-       struct xencomm_handle *desc;
-       int nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-
-       rc = xencommize_mini_grant_table_op(xc_area, &nbr_area,
-                                           cmd, op, count, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_grant_table_op(cmd, desc, count);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_grant_table_op);
-
-int
-xencomm_mini_hypercall_multicall(void *call_list, int nr_calls)
-{
-       int i;
-       multicall_entry_t *mce;
-       int nbr_area = 2 + nr_calls * 3;
-       struct xencomm_mini xc_area[nbr_area];
-       struct xencomm_handle *desc;
-       int rc;
-
-       for (i = 0; i < nr_calls; i++) {
-               mce = (multicall_entry_t *)call_list + i;
-
-               switch (mce->op) {
-               case __HYPERVISOR_update_va_mapping:
-               case __HYPERVISOR_mmu_update:
-                       /* No-op on ia64.  */
-                       break;
-               case __HYPERVISOR_grant_table_op:
-                       rc = xencommize_mini_grant_table_op
-                               (xc_area, &nbr_area,
-                                mce->args[0], (void *)mce->args[1],
-                                mce->args[2], &desc);
-                       if (rc)
-                               return rc;
-                       mce->args[1] = (unsigned long)desc;
-                       break;
-               case __HYPERVISOR_memory_op:
-               default:
-                       printk("%s: unhandled multicall op entry op %lu\n",
-                              __func__, mce->op);
-                       return -ENOSYS;
-               }
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, call_list,
-                                nr_calls * sizeof(multicall_entry_t), &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_multicall(desc, nr_calls);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_multicall);
-
-static int
-xencommize_mini_memory_reservation(struct xencomm_mini *area, int *nbr_area,
-                                   xen_memory_reservation_t *mop)
-{
-       struct xencomm_handle *desc;
-       int rc;
-
-       rc = xencomm_create_mini
-               (area, nbr_area,
-                xen_guest_handle(mop->extent_start),
-                mop->nr_extents 
-                * sizeof(*xen_guest_handle(mop->extent_start)),
-                &desc);
-       if (rc)
-               return rc;
-
-       set_xen_guest_handle(mop->extent_start, (void *)desc);
-
-       return 0;
-}
-
-int
-xencomm_mini_hypercall_memory_op(unsigned int cmd, void *arg)
-{
-       int nbr_area = 4;
-       struct xencomm_mini xc_area[4];
-       struct xencomm_handle *desc;
-       int rc;
-       unsigned int argsize;
-
-       switch (cmd) {
-       case XENMEM_increase_reservation:
-       case XENMEM_decrease_reservation:
-       case XENMEM_populate_physmap:
-               argsize = sizeof(xen_memory_reservation_t);
-               rc = xencommize_mini_memory_reservation
-                       (xc_area, &nbr_area, (xen_memory_reservation_t *)arg);
-               if (rc)
-                       return rc;
-               break;
-               
-       case XENMEM_maximum_ram_page:
-               argsize = 0;
-               break;
-
-       case XENMEM_exchange:
-               argsize = sizeof(xen_memory_exchange_t);
-               rc = xencommize_mini_memory_reservation
-                       (xc_area, &nbr_area,
-                        &((xen_memory_exchange_t *)arg)->in);
-               if (rc)
-                       return rc;
-               rc = xencommize_mini_memory_reservation
-                       (xc_area, &nbr_area,
-                        &((xen_memory_exchange_t *)arg)->out);
-               if (rc)
-                       return rc;
-               break;
-
-       case XENMEM_add_to_physmap:
-               argsize = sizeof (xen_add_to_physmap_t);
-               break;
-
-       case XENMEM_machine_memory_map:
-       {
-               xen_memory_map_t *memmap = (xen_memory_map_t *)arg;
-               argsize = sizeof(*memmap);
-               rc = xencomm_create_mini(xc_area, &nbr_area,
-                                        xen_guest_handle(memmap->buffer),
-                                        memmap->nr_entries, &desc);
-               if (rc)
-                       return rc;
-               set_xen_guest_handle(memmap->buffer, (void *)desc);
-               break;
-       }
-
-       default:
-               printk("%s: unknown mini memory op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_memory_op(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_memory_op);
-
-unsigned long
-xencomm_mini_hypercall_hvm_op(int cmd, void *arg)
-{
-       struct xencomm_handle *desc;
-       int nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-       unsigned int argsize;
-       int rc;
-
-       switch (cmd) {
-       case HVMOP_get_param:
-       case HVMOP_set_param:
-               argsize = sizeof(xen_hvm_param_t);
-               break;
-       default:
-               printk("%s: unknown HVMOP %d\n", __func__, cmd);
-               return -EINVAL;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_hvm_op(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_hvm_op);
-
-int
-xencomm_mini_hypercall_xen_version(int cmd, void *arg)
-{
-       struct xencomm_handle *desc;
-       int nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-       unsigned int argsize;
-       int rc;
-
-       switch (cmd) {
-       case XENVER_version:
-               /* do not actually pass an argument */
-               return xencomm_arch_hypercall_xen_version(cmd, 0);
-       case XENVER_extraversion:
-               argsize = sizeof(xen_extraversion_t);
-               break;
-       case XENVER_compile_info:
-               argsize = sizeof(xen_compile_info_t);
-               break;
-       case XENVER_capabilities:
-               argsize = sizeof(xen_capabilities_info_t);
-               break;
-       case XENVER_changeset:
-               argsize = sizeof(xen_changeset_info_t);
-               break;
-       case XENVER_platform_parameters:
-               argsize = sizeof(xen_platform_parameters_t);
-               break;
-       case XENVER_pagesize:
-               argsize = (arg == NULL) ? 0 : sizeof(void *);
-               break;
-       case XENVER_get_features:
-               argsize = (arg == NULL) ? 0 : sizeof(xen_feature_info_t);
-               break;
-
-       default:
-               printk("%s: unknown version op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_xen_version(cmd, desc);
-}
-EXPORT_SYMBOL(xencomm_mini_hypercall_xen_version);
-
-int
-xencomm_mini_hypercall_xenoprof_op(int op, void *arg)
-{
-       unsigned int argsize;
-       struct xencomm_mini xc_area[2];
-       int nbr_area = 2;
-       struct xencomm_handle *desc;
-       int rc;
-
-       switch (op) {
-       case XENOPROF_init:
-               argsize = sizeof(xenoprof_init_t);
-               break;
-       case XENOPROF_set_active:
-               argsize = sizeof(domid_t);
-               break;
-       case XENOPROF_set_passive:
-               argsize = sizeof(xenoprof_passive_t);
-               break;
-       case XENOPROF_counter:
-               argsize = sizeof(xenoprof_counter_t);
-               break;
-       case XENOPROF_get_buffer:
-               argsize = sizeof(xenoprof_get_buffer_t);
-               break;
-
-       case XENOPROF_reset_active_list:
-       case XENOPROF_reset_passive_list:
-       case XENOPROF_reserve_counters:
-       case XENOPROF_setup_events:
-       case XENOPROF_enable_virq:
-       case XENOPROF_start:
-       case XENOPROF_stop:
-       case XENOPROF_disable_virq:
-       case XENOPROF_release_counters:
-       case XENOPROF_shutdown:
-               return xencomm_arch_hypercall_xenoprof_op(op, arg);
-
-       default:
-               printk("%s: op %d isn't supported\n", __func__, op);
-               return -ENOSYS;
-       }
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-       return xencomm_arch_hypercall_xenoprof_op(op, desc);
-}
-EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_xenoprof_op);
-
-int
-xencomm_mini_hypercall_perfmon_op(unsigned long cmd, void* arg,
-                                  unsigned long count)
-{
-       unsigned int argsize;
-       struct xencomm_mini xc_area[2];
-       int nbr_area = 2;
-       struct xencomm_handle *desc;
-       int rc;
-
-       switch (cmd) {
-       case PFM_GET_FEATURES:
-               argsize = sizeof(pfarg_features_t);
-               break;
-       case PFM_CREATE_CONTEXT:
-               argsize = sizeof(pfarg_context_t);
-               break;
-       case PFM_LOAD_CONTEXT:
-               argsize = sizeof(pfarg_load_t);
-               break;
-       case PFM_WRITE_PMCS:
-       case PFM_WRITE_PMDS:
-               argsize = sizeof(pfarg_reg_t) * count;
-               break;
-
-       case PFM_DESTROY_CONTEXT:
-       case PFM_UNLOAD_CONTEXT:
-       case PFM_START:
-       case PFM_STOP:
-               return xencomm_arch_hypercall_perfmon_op(cmd, arg, count);
-
-       default:
-               printk("%s:%d cmd %ld isn't supported\n",
-                      __func__, __LINE__, cmd);
-               BUG();
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-       return xencomm_arch_hypercall_perfmon_op(cmd, desc, count);
-}
-EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_perfmon_op);
-
-int
-xencomm_mini_hypercall_sched_op(int cmd, void *arg)
-{
-       int rc, nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-       struct xencomm_handle *desc;
-       unsigned int argsize;
-
-       switch (cmd) {
-       case SCHEDOP_yield:
-       case SCHEDOP_block:
-               argsize = 0;
-               break;
-       case SCHEDOP_shutdown:
-               argsize = sizeof(sched_shutdown_t);
-               break;
-       case SCHEDOP_poll:
-               argsize = sizeof(sched_poll_t);
-               break;
-       case SCHEDOP_remote_shutdown:
-               argsize = sizeof(sched_remote_shutdown_t);
-               break;
-
-       default:
-               printk("%s: unknown sched op %d\n", __func__, cmd);
-               return -ENOSYS;
-       }
-
-       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
-       if (rc)
-               return rc;
-
-       return xencomm_arch_hypercall_sched_op(cmd, desc);
-}
-EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_sched_op);
-
-int
-xencomm_mini_hypercall_fpswa_revision(unsigned int *revision)
-{
-       int nbr_area = 2;
-       struct xencomm_mini xc_area[2];
-       struct xencomm_handle *desc;
-       int rc;
-
-       rc = xencomm_create_mini(xc_area, &nbr_area,
-                                revision, sizeof(*revision), &desc);
-       if (rc)
-               return rc;
-       return xencomm_arch_hypercall_fpswa_revision(desc);
-}
-EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_fpswa_revision);
diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/xen/xcom_privcmd.c
--- a/arch/ia64/xen/xcom_privcmd.c      Thu Aug 16 10:58:46 2007 -0600
+++ b/arch/ia64/xen/xcom_privcmd.c      Thu Aug 16 13:44:51 2007 -0600
@@ -54,7 +54,7 @@ xencomm_privcmd_platform_op(privcmd_hype
        if (kern_op.interface_version != XENPF_INTERFACE_VERSION)
                return -EACCES;
 
-       op_desc = xencomm_create_inline(&kern_op);
+       op_desc = xencomm_map_no_alloc(&kern_op, sizeof(kern_op));
 
        switch (kern_op.cmd) {
        default:
@@ -73,8 +73,7 @@ xencomm_privcmd_platform_op(privcmd_hype
        if (copy_to_user(user_op, &kern_op, sizeof(struct xen_platform_op)))
                ret = -EFAULT;
 
-       if (desc)
-               xencomm_free(desc);
+       xencomm_free(desc);
        return ret;
 }
 
@@ -96,14 +95,16 @@ xencomm_privcmd_sysctl(privcmd_hypercall
        if (kern_op.interface_version != XEN_SYSCTL_INTERFACE_VERSION)
                return -EACCES;
 
-       op_desc = xencomm_create_inline(&kern_op);
+       op_desc = xencomm_map_no_alloc(&kern_op, sizeof(kern_op));
 
        switch (kern_op.cmd) {
        case XEN_SYSCTL_readconsole:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.readconsole.buffer),
-                       kern_op.u.readconsole.count,
-                       &desc, GFP_KERNEL);
+                       kern_op.u.readconsole.count);
+               if (xen_guest_handle(kern_op.u.readconsole.buffer) != NULL &&
+                   kern_op.u.readconsole.count > 0 && desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.readconsole.buffer,
                                     (void *)desc);
                break;
@@ -130,55 +131,62 @@ xencomm_privcmd_sysctl(privcmd_hypercall
                }
 
                /* query the buffer size for xencomm */
-               tmp_desc = xencomm_create_inline(&tmp_op);
+               tmp_desc = xencomm_map_no_alloc(&tmp_op, sizeof(tmp_op));
                ret = xencomm_arch_hypercall_sysctl(tmp_desc);
                if (ret)
                        return ret;
 
-               ret = xencomm_create(xen_guest_handle(kern_op.u.perfc_op.desc),
-                                    tmp_op.u.perfc_op.nr_counters *
-                                    sizeof(xen_sysctl_perfc_desc_t),
-                                    &desc, GFP_KERNEL);
-               if (ret)
-                       return ret;
+               desc = xencomm_map(xen_guest_handle(kern_op.u.perfc_op.desc),
+                                  tmp_op.u.perfc_op.nr_counters *
+                                  sizeof(xen_sysctl_perfc_desc_t));
+               if (xen_guest_handle(kern_op.u.perfc_op.desc) != NULL &&
+                   tmp_op.u.perfc_op.nr_counters > 0 && desc == NULL)
+                       return -ENOMEM;
 
                set_xen_guest_handle(kern_op.u.perfc_op.desc, (void *)desc);
 
-               ret = xencomm_create(xen_guest_handle(kern_op.u.perfc_op.val),
-                                    tmp_op.u.perfc_op.nr_vals *
-                                    sizeof(xen_sysctl_perfc_val_t),
-                                    &desc1, GFP_KERNEL);
-               if (ret)
+               desc1 = xencomm_map(xen_guest_handle(kern_op.u.perfc_op.val),
+                                   tmp_op.u.perfc_op.nr_vals *
+                                   sizeof(xen_sysctl_perfc_val_t));
+               if (xen_guest_handle(kern_op.u.perfc_op.val) != NULL &&
+                   tmp_op.u.perfc_op.nr_vals > 0 && desc1 == NULL) {
                        xencomm_free(desc);
+                       return -ENOMEM;
+               }
 
                set_xen_guest_handle(kern_op.u.perfc_op.val, (void *)desc1);
                break;
        }
        case XEN_SYSCTL_getdomaininfolist:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.getdomaininfolist.buffer),
                        kern_op.u.getdomaininfolist.max_domains *
-                       sizeof(xen_domctl_getdomaininfo_t),
-                       &desc, GFP_KERNEL);
+                       sizeof(xen_domctl_getdomaininfo_t));
+               if (xen_guest_handle(kern_op.u.getdomaininfolist.buffer) !=
+                   NULL && kern_op.u.getdomaininfolist.max_domains > 0 &&
+                   desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.getdomaininfolist.buffer,
                                     (void *)desc);
                break;
        case XEN_SYSCTL_debug_keys:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.debug_keys.keys),
-                       kern_op.u.debug_keys.nr_keys,
-                       &desc, GFP_KERNEL);
+                       kern_op.u.debug_keys.nr_keys);
+               if (xen_guest_handle(kern_op.u.debug_keys.keys) != NULL &&
+                   kern_op.u.debug_keys.nr_keys > 0 && desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.debug_keys.keys,
                                     (void *)desc);
                break;
 
        case XEN_SYSCTL_physinfo:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.physinfo.cpu_to_node),
-                       kern_op.u.physinfo.max_cpu_id * sizeof(uint32_t),
-                       &desc, GFP_KERNEL);
-               if (ret)
-                       return ret;
+                       kern_op.u.physinfo.max_cpu_id * sizeof(uint32_t));
+               if (xen_guest_handle(kern_op.u.physinfo.cpu_to_node) != NULL &&
+                   kern_op.u.physinfo.max_cpu_id > 0 && desc == NULL)
+                       return -ENOMEM;
 
                set_xen_guest_handle(kern_op.u.physinfo.cpu_to_node,
                                     (void *)desc);
@@ -199,10 +207,8 @@ xencomm_privcmd_sysctl(privcmd_hypercall
        if (copy_to_user(user_op, &kern_op, sizeof(xen_sysctl_t)))
                ret = -EFAULT;
 
-       if (desc)
-               xencomm_free(desc);
-       if (desc1)
-               xencomm_free(desc1);
+       xencomm_free(desc);
+       xencomm_free(desc1);
        return ret;
 }
 
@@ -223,7 +229,7 @@ xencomm_privcmd_domctl(privcmd_hypercall
        if (kern_op.interface_version != XEN_DOMCTL_INTERFACE_VERSION)
                return -EACCES;
 
-       op_desc = xencomm_create_inline(&kern_op);
+       op_desc = xencomm_map_no_alloc(&kern_op, sizeof(kern_op));
 
        switch (kern_op.cmd) {
        case XEN_DOMCTL_createdomain:
@@ -236,10 +242,12 @@ xencomm_privcmd_domctl(privcmd_hypercall
        {
                unsigned long nr_pages = kern_op.u.getmemlist.max_pfns;
 
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.getmemlist.buffer),
-                       nr_pages * sizeof(unsigned long),
-                       &desc, GFP_KERNEL);
+                       nr_pages * sizeof(unsigned long));
+               if (xen_guest_handle(kern_op.u.getmemlist.buffer) != NULL &&
+                   nr_pages > 0 && desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.getmemlist.buffer,
                                     (void *)desc);
                break;
@@ -247,18 +255,23 @@ xencomm_privcmd_domctl(privcmd_hypercall
        case XEN_DOMCTL_getpageframeinfo:
                break;
        case XEN_DOMCTL_getpageframeinfo2:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.getpageframeinfo2.array),
-                       kern_op.u.getpageframeinfo2.num,
-                       &desc, GFP_KERNEL);
+                       kern_op.u.getpageframeinfo2.num);
+               if (xen_guest_handle(kern_op.u.getpageframeinfo2.array) !=
+                   NULL && kern_op.u.getpageframeinfo2.num > 0 &&
+                   desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.getpageframeinfo2.array,
                                     (void *)desc);
                break;
        case XEN_DOMCTL_shadow_op:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.shadow_op.dirty_bitmap),
-                       ROUND_DIV(kern_op.u.shadow_op.pages, 8),
-                       &desc, GFP_KERNEL);
+                       ROUND_DIV(kern_op.u.shadow_op.pages, 8));
+               if (xen_guest_handle(kern_op.u.shadow_op.dirty_bitmap) != NULL
+                   && kern_op.u.shadow_op.pages > 0 && desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.shadow_op.dirty_bitmap,
                                     (void *)desc);
                break;
@@ -266,20 +279,25 @@ xencomm_privcmd_domctl(privcmd_hypercall
                break;
        case XEN_DOMCTL_setvcpucontext:
        case XEN_DOMCTL_getvcpucontext:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.vcpucontext.ctxt),
-                       sizeof(vcpu_guest_context_t),
-                       &desc, GFP_KERNEL);
+                       sizeof(vcpu_guest_context_t));
+               if (xen_guest_handle(kern_op.u.vcpucontext.ctxt) != NULL &&
+                   desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.vcpucontext.ctxt, (void *)desc);
                break;
        case XEN_DOMCTL_getvcpuinfo:
                break;
        case XEN_DOMCTL_setvcpuaffinity:
        case XEN_DOMCTL_getvcpuaffinity:
-               ret = xencomm_create(
+               desc = xencomm_map(
                        xen_guest_handle(kern_op.u.vcpuaffinity.cpumap.bitmap),
-                       ROUND_DIV(kern_op.u.vcpuaffinity.cpumap.nr_cpus, 8),
-                       &desc, GFP_KERNEL);
+                       ROUND_DIV(kern_op.u.vcpuaffinity.cpumap.nr_cpus, 8));
+               if (xen_guest_handle(kern_op.u.vcpuaffinity.cpumap.bitmap) !=
+                   NULL && kern_op.u.vcpuaffinity.cpumap.nr_cpus > 0 &&
+                   desc == NULL)
+                       return -ENOMEM;
                set_xen_guest_handle(kern_op.u.vcpuaffinity.cpumap.bitmap,
                                     (void *)desc);
                break;
@@ -311,8 +329,7 @@ xencomm_privcmd_domctl(privcmd_hypercall
        if (copy_to_user(user_op, &kern_op, sizeof(xen_domctl_t)))
                ret = -EFAULT;
 
-       if (desc)
-               xencomm_free(desc);
+       xencomm_free(desc);
        return ret;
 }
 
@@ -332,13 +349,14 @@ xencomm_privcmd_acm_op(privcmd_hypercall
        
        switch (kern_arg.cmd) {
        case ACMOP_getssid: {
-               op_desc = xencomm_create_inline(&kern_arg);
-
-               ret = xencomm_create(
+               op_desc = xencomm_map_no_alloc(&kern_arg, sizeof(kern_arg));
+
+               desc = xencomm_map(
                        xen_guest_handle(kern_arg.u.getssid.ssidbuf),
-                       kern_arg.u.getssid.ssidbuf_size, &desc, GFP_KERNEL);
-               if (ret)
-                       return ret;
+                       kern_arg.u.getssid.ssidbuf_size);
+               if (xen_guest_handle(kern_arg.u.getssid.ssidbuf) != NULL &&
+                   kern_arg.u.getssid.ssidbuf_size > 0 && desc == NULL)
+                       return -ENOMEM;
 
                set_xen_guest_handle(kern_arg.u.getssid.ssidbuf, (void *)desc);
 
@@ -378,28 +396,28 @@ xencomm_privcmd_memory_op(privcmd_hyperc
                if (copy_from_user(&kern_op, user_op,
                                   sizeof(xen_memory_reservation_t)))
                        return -EFAULT;
-               desc_op = xencomm_create_inline(&kern_op);
+               desc_op = xencomm_map_no_alloc(&kern_op, sizeof(kern_op));
 
                if (xen_guest_handle(kern_op.extent_start)) {
                        void * addr;
 
                        addr = xen_guest_handle(kern_op.extent_start);
-                       ret = xencomm_create
+                       desc = xencomm_map
                                (addr,
                                 kern_op.nr_extents *
                                 sizeof(*xen_guest_handle
-                                       (kern_op.extent_start)),
-                                &desc, GFP_KERNEL);
-                       if (ret)
-                               return ret;
+                                       (kern_op.extent_start)));
+                       if (addr != NULL && kern_op.nr_extents > 0 &&
+                           desc == NULL)
+                               return -ENOMEM;
+
                        set_xen_guest_handle(kern_op.extent_start,
                                             (void *)desc);
                }
 
                ret = xencomm_arch_hypercall_memory_op(cmd, desc_op);
 
-               if (desc)
-                       xencomm_free(desc);
+               xencomm_free(desc);
 
                if (ret != 0)
                        return ret;
@@ -419,7 +437,7 @@ xencomm_privcmd_memory_op(privcmd_hyperc
                user_domid = (domid_t __user *)hypercall->arg[1];
                if (copy_from_user(&kern_domid, user_domid, sizeof(domid_t)))
                        return -EFAULT;
-               desc = xencomm_create_inline(&kern_domid);
+               desc = xencomm_map_no_alloc(&kern_domid, sizeof(kern_domid));
 
                ret = xencomm_arch_hypercall_memory_op(cmd, desc);
 
@@ -439,41 +457,41 @@ xencomm_privcmd_memory_op(privcmd_hyperc
                if (copy_from_user(&kern_op, user_op,
                                   sizeof(xen_translate_gpfn_list_t)))
                        return -EFAULT;
-               desc_op = xencomm_create_inline(&kern_op);
+               desc_op = xencomm_map_no_alloc(&kern_op, sizeof(kern_op));
 
                if (kern_op.nr_gpfns) {
                        /* gpfn_list.  */
                        addr = xen_guest_handle(kern_op.gpfn_list);
 
-                       ret = xencomm_create(addr, kern_op.nr_gpfns *
+                       desc_gpfn = xencomm_map(addr, kern_op.nr_gpfns *
                                             sizeof(*xen_guest_handle
-                                                   (kern_op.gpfn_list)),
-                                            &desc_gpfn, GFP_KERNEL);
-                       if (ret)
-                               return ret;
+                                                   (kern_op.gpfn_list)));
+                       if (addr != NULL && kern_op.nr_gpfns > 0 &&
+                           desc_gpfn == NULL)
+                               return -ENOMEM;
                        set_xen_guest_handle(kern_op.gpfn_list,
                                             (void *)desc_gpfn);
 
                        /* mfn_list.  */
                        addr = xen_guest_handle(kern_op.mfn_list);
 
-                       ret = xencomm_create(addr, kern_op.nr_gpfns *
+                       desc_mfn = xencomm_map(addr, kern_op.nr_gpfns *
                                             sizeof(*xen_guest_handle
-                                                   (kern_op.mfn_list)),
-                                            &desc_mfn, GFP_KERNEL);
-                       if (ret)
-                               return ret;
+                                                   (kern_op.mfn_list)));
+                       if (addr != NULL && kern_op.nr_gpfns > 0 &&
+                           desc_mfn == NULL) {
+                               xencomm_free(desc_gpfn);
+                               return -ENOMEM;
+                       }
+
                        set_xen_guest_handle(kern_op.mfn_list,
                                             (void *)desc_mfn);
                }
 
                ret = xencomm_arch_hypercall_memory_op(cmd, desc_op);
 
-               if (desc_gpfn)
-                       xencomm_free(desc_gpfn);
-
-               if (desc_mfn)
-                       xencomm_free(desc_mfn);
+               xencomm_free(desc_gpfn);
+               xencomm_free(desc_mfn);
 
                if (ret != 0)
                        return ret;
@@ -527,9 +545,9 @@ xencomm_privcmd_xen_version(privcmd_hype
                return -ENOSYS;
        }
 
-       rc = xencomm_create(arg, argsize, &desc, GFP_KERNEL);
-       if (rc)
-               return rc;
+       desc = xencomm_map(arg, argsize);
+       if (arg != NULL && argsize > 0 && desc == NULL)
+               return -ENOMEM;
 
        rc = xencomm_arch_hypercall_xen_version(cmd, desc);
 
@@ -560,10 +578,9 @@ xencomm_privcmd_event_channel_op(privcmd
                return -EINVAL;
        }
 
-       ret = xencomm_create((void *)hypercall->arg[1], argsize,
-                            &desc, GFP_KERNEL);
-       if (ret)
-               return ret;
+       desc = xencomm_map((void *)hypercall->arg[1], argsize);
+       if ((void *)hypercall->arg[1] != NULL && argsize > 0 && desc == NULL)
+               return -ENOMEM;
 
        ret = xencomm_arch_hypercall_event_channel_op(cmd, desc);
 
@@ -599,10 +616,9 @@ xencomm_privcmd_hvm_op(privcmd_hypercall
                return -EINVAL;
        }
 
-       ret = xencomm_create((void *)hypercall->arg[1], argsize,
-                            &desc, GFP_KERNEL);
-       if (ret)
-               return ret;
+       desc = xencomm_map((void *)hypercall->arg[1], argsize);
+       if ((void *)hypercall->arg[1] != NULL && argsize > 0 && desc == NULL)
+               return -ENOMEM;
 
        ret = xencomm_arch_hypercall_hvm_op(cmd, desc);
 
@@ -627,10 +643,9 @@ xencomm_privcmd_sched_op(privcmd_hyperca
                return -EINVAL;
        }
 
-       ret = xencomm_create((void *)hypercall->arg[1], argsize,
-                            &desc, GFP_KERNEL);
-       if (ret)
-               return ret;
+       desc = xencomm_map((void *)hypercall->arg[1], argsize);
+       if ((void *)hypercall->arg[1] != NULL && argsize > 0 && desc == NULL)
+               return -ENOMEM;
 
        ret = xencomm_arch_hypercall_sched_op(cmd, desc);
 
@@ -650,10 +665,10 @@ xencomm_privcmd_ia64_dom0vp_op(privcmd_h
                unsigned int __user *revision_user =
                        (unsigned int* __user)hypercall->arg[1];
                struct xencomm_handle *desc;
-               ret = xencomm_create(&revision, sizeof(revision),
-                                    &desc, GFP_KERNEL);
-               if (ret)
-                       break;
+               desc = xencomm_map(&revision, sizeof(revision));
+               if (desc == NULL)
+                       return -ENOMEM;
+
                ret = xencomm_arch_hypercall_fpswa_revision(desc);
                xencomm_free(desc);
                if (ret)
diff -r 60d8f0befd18 -r b5fdf02c38f4 arch/ia64/xen/xencomm.c
--- a/arch/ia64/xen/xencomm.c   Thu Aug 16 10:58:46 2007 -0600
+++ b/arch/ia64/xen/xencomm.c   Thu Aug 16 13:44:51 2007 -0600
@@ -27,19 +27,17 @@
 
 #include <asm/xen/xencomm.h>
 
-static int xencomm_debug = 0;
-
 static unsigned long kernel_start_pa;
 
 void
-xencomm_init (void)
+xencomm_initialize (void)
 {
        kernel_start_pa = KERNEL_START - ia64_tpa(KERNEL_START);
 }
 
 /* Translate virtual address to physical address.  */
 unsigned long
-xencomm_vaddr_to_paddr(unsigned long vaddr)
+xencomm_vtop(unsigned long vaddr)
 {
 #ifndef CONFIG_VMX_GUEST
        struct page *page;
@@ -109,155 +107,3 @@ xencomm_vaddr_to_paddr(unsigned long vad
        return (page_to_pfn(page) << PAGE_SHIFT) | (vaddr & ~PAGE_MASK);
 #endif
 }
-
-static int
-xencomm_init_desc(struct xencomm_desc *desc, void *buffer, unsigned long bytes)
-{
-       unsigned long recorded = 0;
-       int i = 0;
-
-       BUG_ON((buffer == NULL) && (bytes > 0));
-
-       /* record the physical pages used */
-       if (buffer == NULL)
-               desc->nr_addrs = 0;
-
-       while ((recorded < bytes) && (i < desc->nr_addrs)) {
-               unsigned long vaddr = (unsigned long)buffer + recorded;
-               unsigned long paddr;
-               int offset;
-               int chunksz;
-
-               offset = vaddr % PAGE_SIZE; /* handle partial pages */
-               chunksz = min(PAGE_SIZE - offset, bytes - recorded);
-
-               paddr = xencomm_vaddr_to_paddr(vaddr);
-               if (paddr == ~0UL) {
-                       printk("%s: couldn't translate vaddr %lx\n",
-                              __func__, vaddr);
-                       return -EINVAL;
-               }
-
-               desc->address[i++] = paddr;
-               recorded += chunksz;
-       }
-
-       if (recorded < bytes) {
-               printk("%s: could only translate %ld of %ld bytes\n",
-                      __func__, recorded, bytes);
-               return -ENOSPC;
-       }
-
-       /* mark remaining addresses invalid (just for safety) */
-       while (i < desc->nr_addrs)
-               desc->address[i++] = XENCOMM_INVALID;
-
-       desc->magic = XENCOMM_MAGIC;
-
-       return 0;
-}
-
-static struct xencomm_desc *
-xencomm_alloc(gfp_t gfp_mask)
-{
-       struct xencomm_desc *desc;
-
-       desc = (struct xencomm_desc *)__get_free_page(gfp_mask);
-       if (desc == NULL)
-               panic("%s: page allocation failed\n", __func__);
-
-       desc->nr_addrs = (PAGE_SIZE - sizeof(struct xencomm_desc)) /
-                        sizeof(*desc->address);
-
-       return desc;
-}
-
-void
-xencomm_free(struct xencomm_handle *desc)
-{
-       if (desc)
-               free_page((unsigned long)__va(desc));
-}
-
-int
-xencomm_create(void *buffer, unsigned long bytes,
-               struct xencomm_handle **ret, gfp_t gfp_mask)
-{
-       struct xencomm_desc *desc;
-       struct xencomm_handle *handle;
-       int rc;
-
-       if (xencomm_debug)
-               printk("%s: %p[%ld]\n", __func__, buffer, bytes);
-
-       if (buffer == NULL || bytes == 0) {
-               *ret = (struct xencomm_handle *)NULL;
-               return 0;
-       }
-
-       desc = xencomm_alloc(gfp_mask);
-       if (!desc) {
-               printk("%s failure\n", "xencomm_alloc");
-               return -ENOMEM;
-       }
-       handle = (struct xencomm_handle *)__pa(desc);
-
-       rc = xencomm_init_desc(desc, buffer, bytes);
-       if (rc) {
-               printk("%s failure: %d\n", "xencomm_init_desc", rc);
-               xencomm_free(handle);
-               return rc;
-       }
-
-       *ret = handle;
-       return 0;
-}
-
-/* "mini" routines, for stack-based communications: */
-
-static void *
-xencomm_alloc_mini(struct xencomm_mini *area, int *nbr_area)
-{
-       unsigned long base;
-       unsigned int pageoffset;
-
-       while (*nbr_area >= 0) {
-               /* Allocate an area.  */
-               (*nbr_area)--;
-
-               base = (unsigned long)(area + *nbr_area);
-               pageoffset = base % PAGE_SIZE;
-
-               /* If the area does not cross a page, use it.  */
-               if ((PAGE_SIZE - pageoffset) >= sizeof(struct xencomm_mini))
-                       return &area[*nbr_area];
-       }
-       /* No more area.  */
-       return NULL;
-}
-
-int
-xencomm_create_mini(struct xencomm_mini *area, int *nbr_area,
-                    void *buffer, unsigned long bytes,
-                    struct xencomm_handle **ret)
-{
-       struct xencomm_desc *desc;
-       int rc;
-       unsigned long res;
-
-       desc = xencomm_alloc_mini(area, nbr_area);
-       if (!desc)
-               return -ENOMEM;
-       desc->nr_addrs = XENCOMM_MINI_ADDRS;
-
-       rc = xencomm_init_desc(desc, buffer, bytes);
-       if (rc)
-               return rc;
-
-       res = xencomm_vaddr_to_paddr((unsigned long)desc);
-       if (res == ~0UL)
-               return -EINVAL;
-
-       *ret = (struct xencomm_handle*)res;
-       return 0;
-}
diff -r 60d8f0befd18 -r b5fdf02c38f4 include/asm-ia64/hypercall.h
--- a/include/asm-ia64/hypercall.h      Thu Aug 16 10:58:46 2007 -0600
+++ b/include/asm-ia64/hypercall.h      Thu Aug 16 13:44:51 2007 -0600
@@ -405,19 +405,6 @@ HYPERVISOR_add_io_space(unsigned long ph
 #define HYPERVISOR_update_va_mapping(va, new_val, flags) (0)
 
 /* Use xencomm to do hypercalls.  */
-#ifdef MODULE
-#define HYPERVISOR_sched_op xencomm_mini_hypercall_sched_op
-#define HYPERVISOR_event_channel_op xencomm_mini_hypercall_event_channel_op
-#define HYPERVISOR_callback_op xencomm_mini_hypercall_callback_op
-#define HYPERVISOR_multicall xencomm_mini_hypercall_multicall
-#define HYPERVISOR_xen_version xencomm_mini_hypercall_xen_version
-#define HYPERVISOR_console_io xencomm_mini_hypercall_console_io
-#define HYPERVISOR_hvm_op xencomm_mini_hypercall_hvm_op
-#define HYPERVISOR_memory_op xencomm_mini_hypercall_memory_op
-#define HYPERVISOR_xenoprof_op xencomm_mini_hypercall_xenoprof_op
-#define HYPERVISOR_perfmon_op xencomm_mini_hypercall_perfmon_op
-#define HYPERVISOR_fpswa_revision xencomm_mini_hypercall_fpswa_revision
-#else
 #define HYPERVISOR_sched_op xencomm_hypercall_sched_op
 #define HYPERVISOR_event_channel_op xencomm_hypercall_event_channel_op
 #define HYPERVISOR_callback_op xencomm_hypercall_callback_op
@@ -429,8 +416,6 @@ HYPERVISOR_add_io_space(unsigned long ph
 #define HYPERVISOR_xenoprof_op xencomm_hypercall_xenoprof_op
 #define HYPERVISOR_perfmon_op xencomm_hypercall_perfmon_op
 #define HYPERVISOR_fpswa_revision xencomm_hypercall_fpswa_revision
-#endif
-
 #define HYPERVISOR_suspend xencomm_hypercall_suspend
 #define HYPERVISOR_vcpu_op xencomm_hypercall_vcpu_op
 #define HYPERVISOR_opt_feature xencomm_hypercall_opt_feature
diff -r 60d8f0befd18 -r b5fdf02c38f4 include/asm-ia64/sal.h
--- a/include/asm-ia64/sal.h    Thu Aug 16 10:58:46 2007 -0600
+++ b/include/asm-ia64/sal.h    Thu Aug 16 13:44:51 2007 -0600
@@ -701,9 +701,9 @@ ia64_sal_get_state_info (u64 sal_info_ty
        if (is_running_on_xen()) {
                struct xencomm_handle *desc;
 
-               if (xencomm_create(sal_info,
-                                  ia64_sal_get_state_info_size(sal_info_type),
-                                  &desc, GFP_KERNEL))
+               desc = xencomm_map(sal_info,
+                               ia64_sal_get_state_info_size(sal_info_type));
+               if (desc == NULL)
                        return 0;
 
                SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0,
diff -r 60d8f0befd18 -r b5fdf02c38f4 include/asm-ia64/xen/xcom_hcall.h
--- a/include/asm-ia64/xen/xcom_hcall.h Thu Aug 16 10:58:46 2007 -0600
+++ b/include/asm-ia64/xen/xcom_hcall.h Thu Aug 16 13:44:51 2007 -0600
@@ -19,7 +19,7 @@
 #ifndef _LINUX_XENCOMM_HCALL_H_
 #define _LINUX_XENCOMM_HCALL_H_
 
-/* These function creates inline descriptor for the parameters and
+/* These function creates inline or mini descriptor for the parameters and
    calls the corresponding xencomm_arch_hypercall_X.
    Architectures should defines HYPERVISOR_xxx as xencomm_hypercall_xxx unless
    they want to use their own wrapper.  */
@@ -55,33 +55,6 @@ extern long xencomm_hypercall_vcpu_op(in
 
 extern long xencomm_hypercall_opt_feature(void *arg);
 
-/* Using mini xencomm.  */
-extern int xencomm_mini_hypercall_console_io(int cmd, int count, char *str);
-
-extern int xencomm_mini_hypercall_event_channel_op(int cmd, void *op);
-
-extern int xencomm_mini_hypercall_xen_version(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_physdev_op(int cmd, void *op);
-
-extern int xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op,
-                                                 unsigned int count);
-
-extern int xencomm_mini_hypercall_sched_op(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_multicall(void *call_list, int nr_calls);
-
-extern int xencomm_mini_hypercall_callback_op(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_memory_op(unsigned int cmd, void *arg);
-
-extern unsigned long xencomm_mini_hypercall_hvm_op(int cmd, void *arg);
-
-extern int xencomm_mini_hypercall_xenoprof_op(int op, void *arg);
-
-extern int xencomm_mini_hypercall_perfmon_op(unsigned long cmd, void* arg,
-                                             unsigned long count);
-
 /* For privcmd.  Locally declare argument type to avoid include storm.
    Type coherency will be checked within privcmd.c  */
 struct privcmd_hypercall;
diff -r 60d8f0befd18 -r b5fdf02c38f4 include/asm-ia64/xen/xencomm.h
--- a/include/asm-ia64/xen/xencomm.h    Thu Aug 16 10:58:46 2007 -0600
+++ b/include/asm-ia64/xen/xencomm.h    Thu Aug 16 13:44:51 2007 -0600
@@ -16,45 +16,18 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#ifndef _LINUX_XENCOMM_H_
-#define _LINUX_XENCOMM_H_
+#ifndef _ASM_IA64_XENCOMM_H_
+#define _ASM_IA64_XENCOMM_H_
 
-#include <xen/interface/xencomm.h>
-
-#define XENCOMM_MINI_ADDRS 3
-struct xencomm_mini {
-       struct xencomm_desc _desc;
-       uint64_t address[XENCOMM_MINI_ADDRS];
-};
+#define is_kernel_addr(x)                                      \
+       ((PAGE_OFFSET <= (x) &&                                 \
+         (x) < (PAGE_OFFSET + (1UL << IA64_MAX_PHYS_BITS))) || \
+        (KERNEL_START <= (x) &&                                \
+         (x) < KERNEL_START + KERNEL_TR_PAGE_SIZE))
 
 /* Must be called before any hypercall.  */
-extern void xencomm_init (void);
+extern void xencomm_initialize (void);
 
-/* To avoid additionnal virt to phys conversion, an opaque structure is
-   presented.  */
-struct xencomm_handle;
+#include <xen/xencomm.h>
 
-extern int xencomm_create(void *buffer, unsigned long bytes,
-                          struct xencomm_handle **desc, gfp_t type);
-extern void xencomm_free(struct xencomm_handle *desc);
-
-extern int xencomm_create_mini(struct xencomm_mini *area, int *nbr_area,
-                               void *buffer, unsigned long bytes,
-                               struct xencomm_handle **ret);
-
-/* Translate virtual address to physical address.  */
-extern unsigned long xencomm_vaddr_to_paddr(unsigned long vaddr);
-
-/* Inline version.  To be used only on linear space (kernel space).  */
-static inline struct xencomm_handle *
-xencomm_create_inline(void *buffer)
-{
-       unsigned long paddr;
-
-       paddr = xencomm_vaddr_to_paddr((unsigned long)buffer);
-       return (struct xencomm_handle *)(paddr | XENCOMM_INLINE_FLAG);
-}
-
-#define xen_guest_handle(hnd)  ((hnd).p)
-
-#endif /* _LINUX_XENCOMM_H_ */
+#endif /* _ASM_IA64_XENCOMM_H_ */

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