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

Re: [Xen-ia64-devel] [PATCH 1/2][xencomm, linux] xencomm consolidation ia64 linux side



I forgot to mention the important thing.
This patch depends on the patch for common linux which I sent out.
If struct xencomm_handle will be removed, this should be revised.
So we need to wait applying until resolving xencomm_handle issue.

On Tue, Aug 07, 2007 at 06:22:53PM +0900, Isaku Yamahata wrote:
> # HG changeset patch
> # User yamahata@xxxxxxxxxxxxx
> # Date 1186478446 -32400
> # Node ID c1602a983042319aa65f75ad5f3f25c30635bb74
> # Parent  41b87d2ad60708cbb2dd8e81605d3c2a0c4d1a26
> [linux, xencomm] linux xencomm consolidation.
> use common xencomm.c and remove ia64 xencomm.c
> PATCHNAME: linux_xencomm_consolidation
> 
> Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
> 
> diff -r 41b87d2ad607 -r c1602a983042 arch/ia64/Kconfig
> --- a/arch/ia64/Kconfig       Wed Aug 01 15:03:59 2007 +0900
> +++ b/arch/ia64/Kconfig       Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 arch/ia64/kernel/setup.c
> --- a/arch/ia64/kernel/setup.c        Wed Aug 01 15:03:59 2007 +0900
> +++ b/arch/ia64/kernel/setup.c        Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 arch/ia64/xen/hypervisor.c
> --- a/arch/ia64/xen/hypervisor.c      Wed Aug 01 15:03:59 2007 +0900
> +++ b/arch/ia64/xen/hypervisor.c      Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 arch/ia64/xen/xcom_hcall.c
> --- a/arch/ia64/xen/xcom_hcall.c      Wed Aug 01 15:03:59 2007 +0900
> +++ b/arch/ia64/xen/xcom_hcall.c      Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 arch/ia64/xen/xcom_mini.c
> --- a/arch/ia64/xen/xcom_mini.c       Wed Aug 01 15:03:59 2007 +0900
> +++ /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 41b87d2ad607 -r c1602a983042 arch/ia64/xen/xcom_privcmd.c
> --- a/arch/ia64/xen/xcom_privcmd.c    Wed Aug 01 15:03:59 2007 +0900
> +++ b/arch/ia64/xen/xcom_privcmd.c    Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 arch/ia64/xen/xencomm.c
> --- a/arch/ia64/xen/xencomm.c Wed Aug 01 15:03:59 2007 +0900
> +++ b/arch/ia64/xen/xencomm.c Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 include/asm-ia64/hypercall.h
> --- a/include/asm-ia64/hypercall.h    Wed Aug 01 15:03:59 2007 +0900
> +++ b/include/asm-ia64/hypercall.h    Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 include/asm-ia64/sal.h
> --- a/include/asm-ia64/sal.h  Wed Aug 01 15:03:59 2007 +0900
> +++ b/include/asm-ia64/sal.h  Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 include/asm-ia64/xen/xcom_hcall.h
> --- a/include/asm-ia64/xen/xcom_hcall.h       Wed Aug 01 15:03:59 2007 +0900
> +++ b/include/asm-ia64/xen/xcom_hcall.h       Tue Aug 07 18:20:46 2007 +0900
> @@ -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 41b87d2ad607 -r c1602a983042 include/asm-ia64/xen/xencomm.h
> --- a/include/asm-ia64/xen/xencomm.h  Wed Aug 01 15:03:59 2007 +0900
> +++ b/include/asm-ia64/xen/xencomm.h  Tue Aug 07 18:20:46 2007 +0900
> @@ -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_ */
> 
> 
> -- 
> yamahata


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

-- 
yamahata

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


 


Rackspace

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