WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Upgrade all hypercalls to use the new guest_handle inter

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Upgrade all hypercalls to use the new guest_handle interface (on the Xen side).
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 08 Mar 2006 12:08:06 +0000
Delivery-date: Wed, 08 Mar 2006 12:08:52 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 4293d6760cef529c200766e14b13bc09a0b0b71a
# Parent  b41ad96f1242cfd1acdbaa3210ef4c7b49160d33
Upgrade all hypercalls to use the new guest_handle interface (on the Xen side).

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r b41ad96f1242 -r 4293d6760cef 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h    Tue Mar 
 7 15:48:36 2006
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h    Tue Mar 
 7 17:40:42 2006
@@ -304,8 +304,7 @@
 
 static inline int
 HYPERVISOR_nmi_op(
-       unsigned long op,
-       unsigned long arg)
+       unsigned long op, void *arg)
 {
        return _hypercall2(int, nmi_op, op, arg);
 }
diff -r b41ad96f1242 -r 4293d6760cef 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h  Tue Mar 
 7 15:48:36 2006
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h  Tue Mar 
 7 17:40:42 2006
@@ -35,12 +35,14 @@
 static void __init machine_specific_arch_setup(void)
 {
        struct xen_platform_parameters pp;
+       struct xennmi_callback cb;
 
        HYPERVISOR_set_callbacks(
            __KERNEL_CS, (unsigned long)hypervisor_callback,
            __KERNEL_CS, (unsigned long)failsafe_callback);
 
-       HYPERVISOR_nmi_op(XENNMI_register_callback, (unsigned long)&nmi);
+       cb.handler_address = (unsigned long)&nmi;
+       HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
 
        machine_specific_modify_cpu_capabilities(&boot_cpu_data);
 
diff -r b41ad96f1242 -r 4293d6760cef 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h  Tue Mar 
 7 15:48:36 2006
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h  Tue Mar 
 7 17:40:42 2006
@@ -36,6 +36,7 @@
 
 #include <xen/interface/xen.h>
 #include <xen/interface/sched.h>
+#include <xen/interface/nmi.h>
 
 #define __STR(x) #x
 #define STR(x) __STR(x)
@@ -304,8 +305,7 @@
 
 static inline int
 HYPERVISOR_nmi_op(
-       unsigned long op,
-       unsigned long arg)
+       unsigned long op, void *arg)
 {
        return _hypercall2(int, nmi_op, op, arg);
 }
diff -r b41ad96f1242 -r 4293d6760cef 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h        
Tue Mar  7 15:48:36 2006
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h        
Tue Mar  7 17:40:42 2006
@@ -23,13 +23,18 @@
 
 static void __init machine_specific_arch_setup(void)
 {
+#ifdef CONFIG_X86_LOCAL_APIC
+       struct xennmi_callback cb;
+#endif
+
        HYPERVISOR_set_callbacks(
                 (unsigned long) hypervisor_callback,
                 (unsigned long) failsafe_callback,
                 (unsigned long) system_call);
 
 #ifdef CONFIG_X86_LOCAL_APIC
-       HYPERVISOR_nmi_op(XENNMI_register_callback, (unsigned long)&nmi);
+       cb.handler_address = (unsigned long)&nmi;
+       HYPERVISOR_nmi_op(XENNMI_register_callback, cb);
 #endif
 
        machine_specific_modify_cpu_capabilities(&boot_cpu_data);
diff -r b41ad96f1242 -r 4293d6760cef xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Tue Mar  7 15:48:36 2006
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Tue Mar  7 17:40:42 2006
@@ -22,7 +22,7 @@
 #include <xen/config.h>
 #include <xen/errno.h>
 #include <asm/vmx_vcpu.h>
-//#include <public/xen.h>
+#include <xen/guest_access.h>
 #include <public/event_channel.h>
 #include <asm/vmmu.h>
 #include <asm/tlb.h>
@@ -35,9 +35,6 @@
 #include <asm/dom_fw.h>
 #include <xen/domain.h>
 
-extern long do_sched_op(int cmd, unsigned long arg);
-
-
 void hyper_not_support(void)
 {
     VCPU *vcpu=current;
@@ -100,7 +97,7 @@
     VCPU *vcpu=current;
     u64 r32,ret;
     vcpu_get_gr_nat(vcpu,16,&r32);
-    ret=do_dom0_op((dom0_op_t *)r32);
+    ret=do_dom0_op(guest_handle_from_ptr(r32, dom0_op_t));
     vcpu_set_gr(vcpu, 8, ret, 0);
 
     vmx_vcpu_increment_iip(vcpu);
@@ -111,7 +108,7 @@
     VCPU *vcpu=current;
     u64 r32,ret;
     vcpu_get_gr_nat(vcpu,16,&r32);
-    ret=do_event_channel_op((evtchn_op_t *)r32);
+    ret=do_event_channel_op(guest_handle_from_ptr(r32, evtchn_op_t));
     vcpu_set_gr(vcpu, 8, ret, 0);
     vmx_vcpu_increment_iip(vcpu);
 }
@@ -122,7 +119,7 @@
     u64 r32,r33,ret;
     vcpu_get_gr_nat(vcpu,16,&r32);
     vcpu_get_gr_nat(vcpu,17,&r33);
-    ret=do_xen_version((int )r32,r33);
+    ret=do_xen_version((int )r32,guest_handle_from_ptr(r33, void));
     vcpu_set_gr(vcpu, 8, ret, 0);
     vmx_vcpu_increment_iip(vcpu);
 }
diff -r b41ad96f1242 -r 4293d6760cef xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c     Tue Mar  7 15:48:36 2006
+++ b/xen/arch/ia64/xen/hypercall.c     Tue Mar  7 17:40:42 2006
@@ -10,6 +10,7 @@
 #include <xen/sched.h>
 #include <xen/hypercall.h>
 #include <xen/multicall.h>
+#include <xen/guest_access.h>
 
 #include <linux/efi.h> /* FOR EFI_UNIMPLEMENTED */
 #include <asm/sal.h>   /* FOR struct ia64_sal_retval */
@@ -175,7 +176,8 @@
                        (int) vcpu_get_gr(v,33));
                break;
            case __HYPERVISOR_dom0_op:
-               regs->r8 = do_dom0_op((struct dom0_op *) regs->r14);
+               regs->r8 = do_dom0_op(guest_handle_from_ptr(regs->r14,
+                                                           dom0_op_t));
                break;
 
            case __HYPERVISOR_memory_op:
@@ -194,30 +196,30 @@
                            regs->r8 = reservation.nr_extents;
                        break;
                    default:
-                       regs->r8 = do_memory_op((int) regs->r14, (void 
*)regs->r15);
+                       regs->r8 = do_memory_op((int) regs->r14, 
guest_handle_from_ptr(regs->r15, void));
                        break;
                    }
                }
                break;
 
            case __HYPERVISOR_event_channel_op:
-               regs->r8 = do_event_channel_op((struct evtchn_op *) regs->r14);
+               regs->r8 = do_event_channel_op(guest_handle_from_ptr(regs->r14, 
evtchn_op_t));
                break;
 
            case __HYPERVISOR_grant_table_op:
-               regs->r8 = do_grant_table_op((unsigned int) regs->r14, (void *) 
regs->r15, (unsigned int) regs->r16);
+               regs->r8 = do_grant_table_op((unsigned int) regs->r14, 
guest_handle_from_ptr(regs->r15, void), (unsigned int) regs->r16);
                break;
 
            case __HYPERVISOR_console_io:
-               regs->r8 = do_console_io((int) regs->r14, (int) regs->r15, 
(char *) regs->r16);
+               regs->r8 = do_console_io((int) regs->r14, (int) regs->r15, 
guest_handle_from_ptr(regs->r16, char));
                break;
 
            case __HYPERVISOR_xen_version:
-               regs->r8 = do_xen_version((int) regs->r14, (void *) regs->r15);
+               regs->r8 = do_xen_version((int) regs->r14, 
guest_handle_from_ptr(regs->r15, void));
                break;
 
            case __HYPERVISOR_multicall:
-               regs->r8 = do_multicall((struct multicall_entry *) regs->r14, 
(unsigned int) regs->r15);
+               regs->r8 = do_multicall(guest_handle_from_ptr(regs->r14, 
multicall_entry_t), (unsigned int) regs->r15);
                break;
 
            default:
diff -r b41ad96f1242 -r 4293d6760cef xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c       Tue Mar  7 15:48:36 2006
+++ b/xen/arch/ia64/xen/process.c       Tue Mar  7 17:40:42 2006
@@ -825,7 +825,6 @@
             case 'l':
                 arg = (unsigned long)va_arg(args, unsigned long);
                 break;
-            case 'p':
             case 'h':
                 arg = (unsigned long)va_arg(args, void *);
                 break;
diff -r b41ad96f1242 -r 4293d6760cef xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Tue Mar  7 15:48:36 2006
+++ b/xen/arch/x86/domain.c     Tue Mar  7 17:40:42 2006
@@ -451,6 +451,43 @@
     return 0;
 }
 
+long
+arch_do_vcpu_op(
+    int cmd, struct vcpu *v, GUEST_HANDLE(void) arg)
+{
+    long rc = 0;
+
+    switch ( cmd )
+    {
+    case VCPUOP_register_runstate_memory_area:
+    {
+        struct vcpu_register_runstate_memory_area area;
+
+        rc = -EINVAL;
+        if ( v != current )
+            break;
+
+        rc = -EFAULT;
+        if ( copy_from_guest(&area, arg, 1) )
+            break;
+
+        if ( !access_ok(area.addr.v, sizeof(*area.addr.v)) )
+            break;
+
+        rc = 0;
+        v->runstate_guest = area.addr.v;
+        __copy_to_user(v->runstate_guest, &v->runstate, sizeof(v->runstate));
+
+        break;
+    }
+
+    default:
+        rc = -ENOSYS;
+        break;
+    }
+
+    return rc;
+}
 
 void new_thread(struct vcpu *d,
                 unsigned long start_pc,
@@ -831,7 +868,6 @@
     {                                                                       \
     case 'i': __arg = (unsigned long)va_arg(args, unsigned int);  break;    \
     case 'l': __arg = (unsigned long)va_arg(args, unsigned long); break;    \
-    case 'p': __arg = (unsigned long)va_arg(args, void *);        break;    \
     case 'h': __arg = (unsigned long)va_arg(args, void *);        break;    \
     default:  __arg = 0; BUG();                                             \
     }                                                                       \
diff -r b41ad96f1242 -r 4293d6760cef xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Tue Mar  7 15:48:36 2006
+++ b/xen/arch/x86/mm.c Tue Mar  7 17:40:42 2006
@@ -1732,14 +1732,15 @@
 }
 
 int do_mmuext_op(
-    struct mmuext_op *uops,
+    GUEST_HANDLE(mmuext_op_t) uops,
     unsigned int count,
-    unsigned int *pdone,
+    GUEST_HANDLE(uint) pdone,
     unsigned int foreigndom)
 {
     struct mmuext_op op;
     int rc = 0, i = 0, okay, cpu = smp_processor_id();
-    unsigned long mfn, type, done = 0;
+    unsigned long mfn, type;
+    unsigned int done = 0;
     struct page_info *page;
     struct vcpu *v = current;
     struct domain *d = v->domain;
@@ -1751,8 +1752,8 @@
     if ( unlikely(count & MMU_UPDATE_PREEMPTED) )
     {
         count &= ~MMU_UPDATE_PREEMPTED;
-        if ( unlikely(pdone != NULL) )
-            (void)get_user(done, pdone);
+        if ( unlikely(!guest_handle_is_null(pdone)) )
+            (void)copy_from_guest(&done, pdone, 1);
     }
 
     if ( !set_foreigndom(cpu, foreigndom) )
@@ -1761,7 +1762,7 @@
         goto out;
     }
 
-    if ( unlikely(!array_access_ok(uops, count, sizeof(op))) )
+    if ( unlikely(!guest_handle_okay(uops, count)) )
     {
         rc = -EFAULT;
         goto out;
@@ -1772,14 +1773,14 @@
         if ( hypercall_preempt_check() )
         {
             rc = hypercall_create_continuation(
-                __HYPERVISOR_mmuext_op, "pipi",
+                __HYPERVISOR_mmuext_op, "hihi",
                 uops, (count - i) | MMU_UPDATE_PREEMPTED, pdone, foreigndom);
             break;
         }
 
-        if ( unlikely(__copy_from_user(&op, uops, sizeof(op)) != 0) )
-        {
-            MEM_LOG("Bad __copy_from_user");
+        if ( unlikely(__copy_from_guest(&op, uops, 1) != 0) )
+        {
+            MEM_LOG("Bad __copy_from_guest");
             rc = -EFAULT;
             break;
         }
@@ -1969,24 +1970,25 @@
             break;
         }
 
-        uops++;
+        guest_handle_add_offset(uops, 1);
     }
 
  out:
     process_deferred_ops(cpu);
 
     /* Add incremental work we have done to the @done output parameter. */
-    if ( unlikely(pdone != NULL) )
-        __put_user(done + i, pdone);
+    done += i;
+    if ( unlikely(!guest_handle_is_null(pdone)) )
+        copy_to_guest(pdone, &done, 1);
 
     UNLOCK_BIGLOCK(d);
     return rc;
 }
 
 int do_mmu_update(
-    struct mmu_update *ureqs,
+    GUEST_HANDLE(mmu_update_t) ureqs,
     unsigned int count,
-    unsigned int *pdone,
+    GUEST_HANDLE(uint) pdone,
     unsigned int foreigndom)
 {
     struct mmu_update req;
@@ -2010,8 +2012,8 @@
     if ( unlikely(count & MMU_UPDATE_PREEMPTED) )
     {
         count &= ~MMU_UPDATE_PREEMPTED;
-        if ( unlikely(pdone != NULL) )
-            (void)get_user(done, pdone);
+        if ( unlikely(!guest_handle_is_null(pdone)) )
+            (void)copy_from_guest(&done, pdone, 1);
     }
 
     domain_mmap_cache_init(&mapcache);
@@ -2027,7 +2029,7 @@
     perfc_addc(num_page_updates, count);
     perfc_incr_histo(bpt_updates, count, PT_UPDATES);
 
-    if ( unlikely(!array_access_ok(ureqs, count, sizeof(req))) )
+    if ( unlikely(!guest_handle_okay(ureqs, count)) )
     {
         rc = -EFAULT;
         goto out;
@@ -2038,14 +2040,14 @@
         if ( hypercall_preempt_check() )
         {
             rc = hypercall_create_continuation(
-                __HYPERVISOR_mmu_update, "pipi",
+                __HYPERVISOR_mmu_update, "hihi",
                 ureqs, (count - i) | MMU_UPDATE_PREEMPTED, pdone, foreigndom);
             break;
         }
 
-        if ( unlikely(__copy_from_user(&req, ureqs, sizeof(req)) != 0) )
-        {
-            MEM_LOG("Bad __copy_from_user");
+        if ( unlikely(__copy_from_guest(&req, ureqs, 1) != 0) )
+        {
+            MEM_LOG("Bad __copy_from_guest");
             rc = -EFAULT;
             break;
         }
@@ -2212,7 +2214,7 @@
             break;
         }
 
-        ureqs++;
+        guest_handle_add_offset(ureqs, 1);
     }
 
  out:
@@ -2222,8 +2224,9 @@
     process_deferred_ops(cpu);
 
     /* Add incremental work we have done to the @done output parameter. */
-    if ( unlikely(pdone != NULL) )
-        __put_user(done + i, pdone);
+    done += i;
+    if ( unlikely(!guest_handle_is_null(pdone)) )
+        copy_to_guest(pdone, &done, 1);
 
     if ( unlikely(shadow_mode_enabled(d)) )
         check_pagetable(v, "post-mmu"); /* debug */
@@ -2684,7 +2687,7 @@
 }
 
 
-long do_set_gdt(unsigned long *frame_list, unsigned int entries)
+long do_set_gdt(GUEST_HANDLE(ulong) frame_list, unsigned int entries)
 {
     int nr_pages = (entries + 511) / 512;
     unsigned long frames[16];
@@ -2694,7 +2697,7 @@
     if ( entries > FIRST_RESERVED_GDT_ENTRY )
         return -EINVAL;
     
-    if ( copy_from_user(frames, frame_list, nr_pages * sizeof(unsigned long)) )
+    if ( copy_from_guest((unsigned long *)frames, frame_list, nr_pages) )
         return -EFAULT;
 
     LOCK_BIGLOCK(current->domain);
diff -r b41ad96f1242 -r 4293d6760cef xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c    Tue Mar  7 15:48:36 2006
+++ b/xen/arch/x86/physdev.c    Tue Mar  7 17:40:42 2006
@@ -6,6 +6,7 @@
 #include <xen/sched.h>
 #include <xen/irq.h>
 #include <xen/event.h>
+#include <xen/guest_access.h>
 #include <asm/current.h>
 #include <asm/smpboot.h>
 #include <public/xen.h>
@@ -21,13 +22,13 @@
 /*
  * Demuxing hypercall.
  */
-long do_physdev_op(struct physdev_op *uop)
+long do_physdev_op(GUEST_HANDLE(physdev_op_t) uop)
 {
     struct physdev_op op;
     long ret;
     int  irq;
 
-    if ( unlikely(copy_from_user(&op, uop, sizeof(op)) != 0) )
+    if ( unlikely(copy_from_guest(&op, uop, 1) != 0) )
         return -EFAULT;
 
     switch ( op.cmd )
@@ -101,7 +102,7 @@
         break;
     }
 
-    if ( copy_to_user(uop, &op, sizeof(op)) )
+    if ( copy_to_guest(uop, &op, 1) )
         ret = -EFAULT;
 
     return ret;
diff -r b41ad96f1242 -r 4293d6760cef xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Tue Mar  7 15:48:36 2006
+++ b/xen/arch/x86/traps.c      Tue Mar  7 17:40:42 2006
@@ -1404,14 +1404,14 @@
 }
 
 
-long do_set_trap_table(struct trap_info *traps)
+long do_set_trap_table(GUEST_HANDLE(trap_info_t) traps)
 {
     struct trap_info cur;
     struct trap_info *dst = current->arch.guest_context.trap_ctxt;
     long rc = 0;
 
     /* If no table is presented then clear the entire virtual IDT. */
-    if ( traps == NULL )
+    if ( guest_handle_is_null(traps) )
     {
         memset(dst, 0, 256 * sizeof(*dst));
         init_int80_direct_trap(current);
@@ -1423,11 +1423,11 @@
         if ( hypercall_preempt_check() )
         {
             rc = hypercall_create_continuation(
-                __HYPERVISOR_set_trap_table, "p", traps);
-            break;
-        }
-
-        if ( copy_from_user(&cur, traps, sizeof(cur)) ) 
+                __HYPERVISOR_set_trap_table, "h", traps);
+            break;
+        }
+
+        if ( copy_from_guest(&cur, traps, 1) )
         {
             rc = -EFAULT;
             break;
@@ -1443,7 +1443,7 @@
         if ( cur.vector == 0x80 )
             init_int80_direct_trap(current);
 
-        traps++;
+        guest_handle_add_offset(traps, 1);
     }
 
     return rc;
diff -r b41ad96f1242 -r 4293d6760cef xen/common/acm_ops.c
--- a/xen/common/acm_ops.c      Tue Mar  7 15:48:36 2006
+++ b/xen/common/acm_ops.c      Tue Mar  7 17:40:42 2006
@@ -25,13 +25,14 @@
 #include <xen/event.h>
 #include <xen/trace.h>
 #include <xen/console.h>
+#include <xen/guest_access.h>
 #include <asm/shadow.h>
 #include <public/sched_ctl.h>
 #include <acm/acm_hooks.h>
 
 #ifndef ACM_SECURITY
 
-long do_acm_op(struct acm_op * u_acm_op)
+long do_acm_op(GUEST_HANDLE(acm_op_t) u_acm_op)
 {
     return -ENOSYS;
 }
@@ -56,7 +57,7 @@
     return 0;
 }
 
-long do_acm_op(struct acm_op * u_acm_op)
+long do_acm_op(GUEST_HANDLE(acm_op_t) u_acm_op)
 {
     long ret = 0;
     struct acm_op curop, *op = &curop;
@@ -64,7 +65,7 @@
     if (acm_authorize_acm_ops(current->domain, POLICY))
         return -EPERM;
 
-    if (copy_from_user(op, u_acm_op, sizeof(*op)))
+    if (copy_from_guest(op, u_acm_op, 1))
         return -EFAULT;
 
     if (op->interface_version != ACM_INTERFACE_VERSION)
@@ -88,7 +89,7 @@
             ret = acm_get_policy(op->u.getpolicy.pullcache,
                                  op->u.getpolicy.pullcache_size);
         if (!ret)
-            copy_to_user(u_acm_op, op, sizeof(*op));
+            copy_to_guest(u_acm_op, op, 1);
     }
     break;
 
@@ -99,7 +100,7 @@
             ret = acm_dump_statistics(op->u.dumpstats.pullcache,
                                       op->u.dumpstats.pullcache_size);
         if (!ret)
-            copy_to_user(u_acm_op, op, sizeof(*op));
+            copy_to_guest(u_acm_op, op, 1);
     }
     break;
 
@@ -139,7 +140,7 @@
                            op->u.getssid.ssidbuf,
                            op->u.getssid.ssidbuf_size);
         if (!ret)
-            copy_to_user(u_acm_op, op, sizeof(*op));
+            copy_to_guest(u_acm_op, op, 1);
     }
     break;
 
@@ -215,7 +216,7 @@
             ret = -ESRCH;
 
         if (!ret)
-            copy_to_user(u_acm_op, op, sizeof(*op));
+            copy_to_guest(u_acm_op, op, 1);
     }
     break;
 
diff -r b41ad96f1242 -r 4293d6760cef xen/common/bitmap.c
--- a/xen/common/bitmap.c       Tue Mar  7 15:48:36 2006
+++ b/xen/common/bitmap.c       Tue Mar  7 17:40:42 2006
@@ -10,7 +10,6 @@
 #include <xen/errno.h>
 #include <xen/bitmap.h>
 #include <xen/bitops.h>
-#include <asm/uaccess.h>
 
 /*
  * bitmaps provide an array of bits, implemented using an an
diff -r b41ad96f1242 -r 4293d6760cef xen/common/domain.c
--- a/xen/common/domain.c       Tue Mar  7 15:48:36 2006
+++ b/xen/common/domain.c       Tue Mar  7 17:40:42 2006
@@ -18,6 +18,7 @@
 #include <xen/domain_page.h>
 #include <xen/rangeset.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <asm/debugger.h>
 #include <public/dom0_ops.h>
 #include <public/sched.h>
@@ -399,7 +400,7 @@
     return arch_set_info_guest(v, ctxt);
 }
 
-long do_vcpu_op(int cmd, int vcpuid, void *arg)
+long do_vcpu_op(int cmd, int vcpuid, GUEST_HANDLE(void) arg)
 {
     struct domain *d = current->domain;
     struct vcpu *v;
@@ -421,7 +422,7 @@
             break;
         }
 
-        if ( copy_from_user(ctxt, arg, sizeof(*ctxt)) )
+        if ( copy_from_guest(ctxt, arg, 1) )
         {
             xfree(ctxt);
             rc = -EFAULT;
@@ -457,35 +458,13 @@
     {
         struct vcpu_runstate_info runstate;
         vcpu_runstate_get(v, &runstate);
-        if ( copy_to_user(arg, &runstate, sizeof(runstate)) )
+        if ( copy_to_guest(arg, &runstate, 1) )
             rc = -EFAULT;
         break;
     }
 
-    case VCPUOP_register_runstate_memory_area:
-    {
-        struct vcpu_register_runstate_memory_area area;
-
-        rc = -EINVAL;
-        if ( v != current )
-            break;
-
-        rc = -EFAULT;
-        if ( copy_from_user(&area, arg, sizeof(area)) )
-            break;
-
-        if ( !access_ok(area.addr.v, sizeof(*area.addr.v)) )
-            break;
-
-        rc = 0;
-        v->runstate_guest = area.addr.v;
-        __copy_to_user(v->runstate_guest, &v->runstate, sizeof(v->runstate));
-
-        break;
-    }
-
     default:
-        rc = -ENOSYS;
+        rc = arch_do_vcpu_op(cmd, v, arg);
         break;
     }
 
diff -r b41ad96f1242 -r 4293d6760cef xen/common/event_channel.c
--- a/xen/common/event_channel.c        Tue Mar  7 15:48:36 2006
+++ b/xen/common/event_channel.c        Tue Mar  7 17:40:42 2006
@@ -23,6 +23,7 @@
 #include <xen/event.h>
 #include <xen/irq.h>
 #include <xen/iocap.h>
+#include <xen/guest_access.h>
 #include <asm/current.h>
 
 #include <public/xen.h>
@@ -578,12 +579,12 @@
     return 0;
 }
 
-long do_event_channel_op(struct evtchn_op *uop)
+long do_event_channel_op(GUEST_HANDLE(evtchn_op_t) uop)
 {
     long rc;
     struct evtchn_op op;
 
-    if ( copy_from_user(&op, uop, sizeof(op)) != 0 )
+    if ( copy_from_guest(&op, uop, 1) != 0 )
         return -EFAULT;
 
     if (acm_pre_event_channel(&op))
@@ -593,31 +594,31 @@
     {
     case EVTCHNOP_alloc_unbound:
         rc = evtchn_alloc_unbound(&op.u.alloc_unbound);
-        if ( (rc == 0) && (copy_to_user(uop, &op, sizeof(op)) != 0) )
+        if ( (rc == 0) && (copy_to_guest(uop, &op, 1) != 0) )
             rc = -EFAULT; /* Cleaning up here would be a mess! */
         break;
 
     case EVTCHNOP_bind_interdomain:
         rc = evtchn_bind_interdomain(&op.u.bind_interdomain);
-        if ( (rc == 0) && (copy_to_user(uop, &op, sizeof(op)) != 0) )
+        if ( (rc == 0) && (copy_to_guest(uop, &op, 1) != 0) )
             rc = -EFAULT; /* Cleaning up here would be a mess! */
         break;
 
     case EVTCHNOP_bind_virq:
         rc = evtchn_bind_virq(&op.u.bind_virq);
-        if ( (rc == 0) && (copy_to_user(uop, &op, sizeof(op)) != 0) )
+        if ( (rc == 0) && (copy_to_guest(uop, &op, 1) != 0) )
             rc = -EFAULT; /* Cleaning up here would be a mess! */
         break;
 
     case EVTCHNOP_bind_ipi:
         rc = evtchn_bind_ipi(&op.u.bind_ipi);
-        if ( (rc == 0) && (copy_to_user(uop, &op, sizeof(op)) != 0) )
+        if ( (rc == 0) && (copy_to_guest(uop, &op, 1) != 0) )
             rc = -EFAULT; /* Cleaning up here would be a mess! */
         break;
 
     case EVTCHNOP_bind_pirq:
         rc = evtchn_bind_pirq(&op.u.bind_pirq);
-        if ( (rc == 0) && (copy_to_user(uop, &op, sizeof(op)) != 0) )
+        if ( (rc == 0) && (copy_to_guest(uop, &op, 1) != 0) )
             rc = -EFAULT; /* Cleaning up here would be a mess! */
         break;
 
@@ -631,7 +632,7 @@
 
     case EVTCHNOP_status:
         rc = evtchn_status(&op.u.status);
-        if ( (rc == 0) && (copy_to_user(uop, &op, sizeof(op)) != 0) )
+        if ( (rc == 0) && (copy_to_guest(uop, &op, 1) != 0) )
             rc = -EFAULT;
         break;
 
diff -r b41ad96f1242 -r 4293d6760cef xen/common/gdbstub.c
--- a/xen/common/gdbstub.c      Tue Mar  7 15:48:36 2006
+++ b/xen/common/gdbstub.c      Tue Mar  7 17:40:42 2006
@@ -35,7 +35,6 @@
    than any actual intention.  It doesn't at the moment. */
 
 #include <xen/lib.h>
-#include <asm/uaccess.h>
 #include <xen/spinlock.h>
 #include <xen/serial.h>
 #include <xen/irq.h>
diff -r b41ad96f1242 -r 4293d6760cef xen/common/grant_table.c
--- a/xen/common/grant_table.c  Tue Mar  7 15:48:36 2006
+++ b/xen/common/grant_table.c  Tue Mar  7 17:40:42 2006
@@ -28,8 +28,9 @@
 #include <xen/sched.h>
 #include <xen/shadow.h>
 #include <xen/mm.h>
+#include <xen/trace.h>
+#include <xen/guest_access.h>
 #include <acm/acm_hooks.h>
-#include <xen/trace.h>
 
 #define PIN_FAIL(_lbl, _rc, _f, _a...)          \
     do {                                        \
@@ -187,7 +188,7 @@
 
             /* Merge two 16-bit values into a 32-bit combined update. */
             /* NB. Endianness! */
-            prev_scombo = scombo = ((u32)sdom << 16) | (u32)sflags;
+            scombo = ((u32)sdom << 16) | (u32)sflags;
 
             new_scombo = scombo | GTF_reading;
             if ( !(op->flags & GNTMAP_readonly) )
@@ -198,12 +199,7 @@
                              "Attempt to write-pin a r/o grant entry.\n");
             }
 
-            /* NB. prev_scombo is updated in place to seen value. */
-            if ( unlikely(cmpxchg_user((u32 *)&sha->flags,
-                                       prev_scombo,
-                                       new_scombo)) )
-                PIN_FAIL(unlock_out, GNTST_general_error,
-                         "Fault while modifying shared flags and domid.\n");
+            prev_scombo = cmpxchg((u32 *)&sha->flags, scombo, new_scombo);
 
             /* Did the combined update work (did we see what we expected?). */
             if ( likely(prev_scombo == scombo) )
@@ -306,17 +302,17 @@
 
 static long
 gnttab_map_grant_ref(
-    struct gnttab_map_grant_ref *uop, unsigned int count)
+    GUEST_HANDLE(gnttab_map_grant_ref_t) uop, unsigned int count)
 {
     int i;
     struct gnttab_map_grant_ref op;
 
     for ( i = 0; i < count; i++ )
     {
-        if ( unlikely(__copy_from_user(&op, &uop[i], sizeof(op))) )
+        if ( unlikely(__copy_from_guest_offset(&op, uop, i, 1)) )
             return -EFAULT;
         __gnttab_map_grant_ref(&op);
-        if ( unlikely(__copy_to_user(&uop[i], &op, sizeof(op))) )
+        if ( unlikely(__copy_to_guest_offset(uop, i, &op, 1)) )
             return -EFAULT;
     }
 
@@ -443,17 +439,17 @@
 
 static long
 gnttab_unmap_grant_ref(
-    struct gnttab_unmap_grant_ref *uop, unsigned int count)
+    GUEST_HANDLE(gnttab_unmap_grant_ref_t) uop, unsigned int count)
 {
     int i;
     struct gnttab_unmap_grant_ref op;
 
     for ( i = 0; i < count; i++ )
     {
-        if ( unlikely(__copy_from_user(&op, &uop[i], sizeof(op))) )
+        if ( unlikely(__copy_from_guest_offset(&op, uop, i, 1)) )
             goto fault;
         __gnttab_unmap_grant_ref(&op);
-        if ( unlikely(__copy_to_user(&uop[i], &op, sizeof(op))) )
+        if ( unlikely(__copy_to_guest_offset(uop, i, &op, 1)) )
             goto fault;
     }
 
@@ -467,7 +463,7 @@
 
 static long 
 gnttab_setup_table(
-    struct gnttab_setup_table *uop, unsigned int count)
+    GUEST_HANDLE(gnttab_setup_table_t) uop, unsigned int count)
 {
     struct gnttab_setup_table op;
     struct domain *d;
@@ -478,7 +474,7 @@
     if ( count != 1 )
         return -EINVAL;
 
-    if ( unlikely(copy_from_user(&op, uop, sizeof(op)) != 0) )
+    if ( unlikely(copy_from_guest(&op, uop, 1) != 0) )
     {
         DPRINTK("Fault while reading gnttab_setup_table_t.\n");
         return -EFAULT;
@@ -517,14 +513,14 @@
         for ( i = 0; i < op.nr_frames; i++ )
         {
             gmfn = gnttab_shared_gmfn(d, d->grant_table, i);
-            (void)copy_to_user(&op.frame_list[i], &gmfn, sizeof(gmfn));
+            (void)copy_to_guest_offset(op.frame_list, i, &gmfn, 1);
         }
     }
 
     put_domain(d);
 
  out:
-    if ( unlikely(copy_to_user(uop, &op, sizeof(op))) )
+    if ( unlikely(copy_to_guest(uop, &op, 1)) )
         return -EFAULT;
 
     return 0;
@@ -572,15 +568,10 @@
 
         /* Merge two 16-bit values into a 32-bit combined update. */
         /* NB. Endianness! */
-        prev_scombo = scombo = ((u32)sdom << 16) | (u32)sflags;
-
-        /* NB. prev_scombo is updated in place to seen value. */
-        if ( unlikely(cmpxchg_user((u32 *)&sha->flags, prev_scombo, 
-                                   prev_scombo | GTF_transfer_committed)) )
-        {
-            DPRINTK("Fault while modifying shared flags and domid.\n");
-            goto fail;
-        }
+        scombo = ((u32)sdom << 16) | (u32)sflags;
+
+        prev_scombo = cmpxchg((u32 *)&sha->flags, scombo,
+                              scombo | GTF_transfer_committed);
 
         /* Did the combined update work (did we see what we expected?). */
         if ( likely(prev_scombo == scombo) )
@@ -608,7 +599,7 @@
 
 static long
 gnttab_transfer(
-    struct gnttab_transfer *uop, unsigned int count)
+    GUEST_HANDLE(gnttab_transfer_t) uop, unsigned int count)
 {
     struct domain *d = current->domain;
     struct domain *e;
@@ -621,7 +612,7 @@
     for ( i = 0; i < count; i++ )
     {
         /* Read from caller address space. */
-        if ( unlikely(__copy_from_user(&gop, &uop[i], sizeof(gop))) )
+        if ( unlikely(__copy_from_guest_offset(&gop, uop, i, 1)) )
         {
             DPRINTK("gnttab_transfer: error reading req %d/%d\n", i, count);
             return -EFAULT;
@@ -708,7 +699,7 @@
         gop.status = GNTST_okay;
 
     copyback:
-        if ( unlikely(__copy_from_user(&uop[i], &gop, sizeof(gop))) )
+        if ( unlikely(__copy_to_guest_offset(uop, i, &gop, 1)) )
         {
             DPRINTK("gnttab_transfer: error writing resp %d/%d\n", i, count);
             return -EFAULT;
@@ -718,9 +709,9 @@
     return 0;
 }
 
-long 
+long
 do_grant_table_op(
-    unsigned int cmd, void *uop, unsigned int count)
+    unsigned int cmd, GUEST_HANDLE(void) uop, unsigned int count)
 {
     long rc;
     struct domain *d = current->domain;
@@ -736,27 +727,38 @@
     switch ( cmd )
     {
     case GNTTABOP_map_grant_ref:
-        if ( unlikely(!array_access_ok(
-            uop, count, sizeof(gnttab_map_grant_ref_t))) )
+    {
+        GUEST_HANDLE(gnttab_map_grant_ref_t) map =
+            guest_handle_cast(uop, gnttab_map_grant_ref_t);
+        if ( unlikely(!guest_handle_okay(map, count)) )
             goto out;
-        rc = gnttab_map_grant_ref((gnttab_map_grant_ref_t *)uop, count);
+        rc = gnttab_map_grant_ref(map, count);
         break;
+    }
     case GNTTABOP_unmap_grant_ref:
-        if ( unlikely(!array_access_ok(
-            uop, count, sizeof(gnttab_unmap_grant_ref_t))) )
+    {
+        GUEST_HANDLE(gnttab_unmap_grant_ref_t) unmap =
+            guest_handle_cast(uop, gnttab_unmap_grant_ref_t);
+        if ( unlikely(!guest_handle_okay(unmap, count)) )
             goto out;
-        rc = gnttab_unmap_grant_ref(
-            (gnttab_unmap_grant_ref_t *)uop, count);
+        rc = gnttab_unmap_grant_ref(unmap, count);
         break;
+    }
     case GNTTABOP_setup_table:
-        rc = gnttab_setup_table((gnttab_setup_table_t *)uop, count);
+    {
+        rc = gnttab_setup_table(
+            guest_handle_cast(uop, gnttab_setup_table_t), count);
         break;
+    }
     case GNTTABOP_transfer:
-        if (unlikely(!array_access_ok(
-            uop, count, sizeof(gnttab_transfer_t))))
+    {
+        GUEST_HANDLE(gnttab_transfer_t) transfer =
+            guest_handle_cast(uop, gnttab_transfer_t);
+        if ( unlikely(!guest_handle_okay(transfer, count)) )
             goto out;
-        rc = gnttab_transfer(uop, count);
+        rc = gnttab_transfer(transfer, count);
         break;
+    }
     default:
         rc = -ENOSYS;
         break;
diff -r b41ad96f1242 -r 4293d6760cef xen/common/kernel.c
--- a/xen/common/kernel.c       Tue Mar  7 15:48:36 2006
+++ b/xen/common/kernel.c       Tue Mar  7 17:40:42 2006
@@ -11,6 +11,7 @@
 #include <xen/compile.h>
 #include <xen/sched.h>
 #include <xen/shadow.h>
+#include <xen/guest_access.h>
 #include <asm/current.h>
 #include <public/nmi.h>
 #include <public/version.h>
@@ -116,7 +117,7 @@
  * Simple hypercalls.
  */
 
-long do_xen_version(int cmd, void *arg)
+long do_xen_version(int cmd, GUEST_HANDLE(void) arg)
 {
     switch ( cmd )
     {
@@ -129,7 +130,7 @@
     {
         xen_extraversion_t extraversion;
         safe_strcpy(extraversion, XEN_EXTRAVERSION);
-        if ( copy_to_user(arg, extraversion, sizeof(extraversion)) )
+        if ( copy_to_guest(arg, (char *)extraversion, sizeof(extraversion)) )
             return -EFAULT;
         return 0;
     }
@@ -141,7 +142,7 @@
         safe_strcpy(info.compile_by,     XEN_COMPILE_BY);
         safe_strcpy(info.compile_domain, XEN_COMPILE_DOMAIN);
         safe_strcpy(info.compile_date,   XEN_COMPILE_DATE);
-        if ( copy_to_user(arg, &info, sizeof(info)) )
+        if ( copy_to_guest(arg, &info, 1) )
             return -EFAULT;
         return 0;
     }
@@ -154,7 +155,7 @@
         memset(info, 0, sizeof(info));
         arch_get_xen_caps(info);
 
-        if ( copy_to_user(arg, info, sizeof(info)) )
+        if ( copy_to_guest(arg, (char *)info, sizeof(info)) )
             return -EFAULT;
         return 0;
     }
@@ -164,7 +165,7 @@
         xen_platform_parameters_t params = {
             .virt_start = HYPERVISOR_VIRT_START
         };
-        if ( copy_to_user(arg, &params, sizeof(params)) )
+        if ( copy_to_guest(arg, &params, 1) )
             return -EFAULT;
         return 0;
         
@@ -174,7 +175,7 @@
     {
         xen_changeset_info_t chgset;
         safe_strcpy(chgset, XEN_CHANGESET);
-        if ( copy_to_user(arg, chgset, sizeof(chgset)) )
+        if ( copy_to_guest(arg, (char *)chgset, sizeof(chgset)) )
             return -EFAULT;
         return 0;
     }
@@ -183,7 +184,7 @@
     {
         xen_feature_info_t fi;
 
-        if ( copy_from_user(&fi, arg, sizeof(fi)) )
+        if ( copy_from_guest(&fi, arg, 1) )
             return -EFAULT;
 
         switch ( fi.submap_idx )
@@ -202,7 +203,7 @@
             return -EINVAL;
         }
 
-        if ( copy_to_user(arg, &fi, sizeof(fi)) )
+        if ( copy_to_guest(arg, &fi, 1) )
             return -EFAULT;
         return 0;
     }
@@ -212,31 +213,34 @@
     return -ENOSYS;
 }
 
-long do_nmi_op(unsigned int cmd, void *arg)
+long do_nmi_op(unsigned int cmd, GUEST_HANDLE(void) arg)
 {
     struct vcpu *v = current;
     struct domain *d = current->domain;
+    struct xennmi_callback cb;
     long rc = 0;
 
     switch ( cmd )
     {
     case XENNMI_register_callback:
+        rc = -EINVAL;
         if ( (d->domain_id != 0) || (v->vcpu_id != 0) )
-        { 
-           rc = -EINVAL;
-        }
-        else
-        {
-            v->nmi_addr = (unsigned long)arg;
+            break;
+
+        rc = -EFAULT;
+        if ( copy_from_guest(&cb, arg, 1) )
+            break;
+
+        v->nmi_addr = cb.handler_address;
 #ifdef CONFIG_X86
-            /*
-             * If no handler was registered we can 'lose the NMI edge'.
-             * Re-assert it now.
-             */
-            if ( d->shared_info->arch.nmi_reason != 0 )
-                set_bit(_VCPUF_nmi_pending, &v->vcpu_flags);
+        /*
+         * If no handler was registered we can 'lose the NMI edge'. Re-assert 
+         * it now.
+         */
+        if ( d->shared_info->arch.nmi_reason != 0 )
+            set_bit(_VCPUF_nmi_pending, &v->vcpu_flags);
 #endif
-        }
+        rc = 0;
         break;
     case XENNMI_unregister_callback:
         v->nmi_addr = 0;
diff -r b41ad96f1242 -r 4293d6760cef xen/common/multicall.c
--- a/xen/common/multicall.c    Tue Mar  7 15:48:36 2006
+++ b/xen/common/multicall.c    Tue Mar  7 17:40:42 2006
@@ -10,12 +10,15 @@
 #include <xen/sched.h>
 #include <xen/event.h>
 #include <xen/multicall.h>
+#include <xen/guest_access.h>
 #include <asm/current.h>
 #include <asm/hardirq.h>
 
 struct mc_state mc_state[NR_CPUS];
 
-long do_multicall(struct multicall_entry *call_list, unsigned int nr_calls)
+long
+do_multicall(
+    GUEST_HANDLE(multicall_entry_t) call_list, unsigned int nr_calls)
 {
     struct mc_state *mcs = &mc_state[smp_processor_id()];
     unsigned int     i;
@@ -26,22 +29,13 @@
         return -EINVAL;
     }
 
-    if ( unlikely(!array_access_ok(call_list, nr_calls, sizeof(*call_list))) )
-    {
-        DPRINTK("Bad memory range %p for %u*%u bytes.\n",
-                call_list, nr_calls, (unsigned int)sizeof(*call_list));
+    if ( unlikely(!guest_handle_okay(call_list, nr_calls)) )
         goto fault;
-    }
 
     for ( i = 0; i < nr_calls; i++ )
     {
-        if ( unlikely(__copy_from_user(&mcs->call, &call_list[i], 
-                                       sizeof(*call_list))) )
-        {
-            DPRINTK("Error copying from user range %p for %u bytes.\n",
-                    &call_list[i], (unsigned int)sizeof(*call_list));
+        if ( unlikely(__copy_from_guest_offset(&mcs->call, call_list, i, 1)) )
             goto fault;
-        }
 
         do_multicall_call(&mcs->call);
 
@@ -53,17 +47,12 @@
              */
             struct multicall_entry corrupt;
             memset(&corrupt, 0xAA, sizeof(corrupt));
-            (void)__copy_to_user(&call_list[i], &corrupt, sizeof(corrupt));
+            (void)__copy_to_guest_offset(call_list, i, &corrupt, 1);
         }
 #endif
 
-        if ( unlikely(__copy_to_user(&call_list[i].result,
-                                     &mcs->call.result,
-                                     sizeof(mcs->call.result))) )
-        {
-            DPRINTK("Error writing result back to multicall block.\n");
+        if ( unlikely(__copy_to_guest_offset(call_list, i, &mcs->call, 1)) )
             goto fault;
-        }
 
         if ( hypercall_preempt_check() )
         {
@@ -74,15 +63,15 @@
             if ( !test_bit(_MCSF_call_preempted, &mcs->flags) )
                 i++;
             else
-                (void)__copy_to_user(&call_list[i], &mcs->call,
-                                     sizeof(*call_list));
+                (void)__copy_to_guest_offset(call_list, i, &mcs->call, 1);
 
             /* Only create a continuation if there is work left to be done. */
             if ( i < nr_calls )
             {
                 mcs->flags = 0;
+                guest_handle_add_offset(call_list, i);
                 return hypercall_create_continuation(
-                    __HYPERVISOR_multicall, "pi", &call_list[i], nr_calls-i);
+                    __HYPERVISOR_multicall, "hi", call_list, nr_calls-i);
             }
         }
     }
diff -r b41ad96f1242 -r 4293d6760cef xen/common/perfc.c
--- a/xen/common/perfc.c        Tue Mar  7 15:48:36 2006
+++ b/xen/common/perfc.c        Tue Mar  7 17:40:42 2006
@@ -8,7 +8,6 @@
 #include <xen/mm.h>
 #include <xen/guest_access.h>
 #include <public/dom0_ops.h>
-#include <asm/uaccess.h>
 
 #undef  PERFCOUNTER
 #undef  PERFCOUNTER_CPU
diff -r b41ad96f1242 -r 4293d6760cef xen/drivers/char/console.c
--- a/xen/drivers/char/console.c        Tue Mar  7 15:48:36 2006
+++ b/xen/drivers/char/console.c        Tue Mar  7 17:40:42 2006
@@ -22,7 +22,6 @@
 #include <xen/delay.h>
 #include <xen/guest_access.h>
 #include <asm/current.h>
-#include <asm/uaccess.h>
 #include <asm/debugger.h>
 #include <asm/io.h>
 
@@ -320,7 +319,7 @@
     __serial_rx(c, regs);
 }
 
-long guest_console_write(char *buffer, int count)
+static long guest_console_write(GUEST_HANDLE(char) buffer, int count)
 {
     char kbuf[128], *kptr;
     int kcount;
@@ -336,11 +335,11 @@
 
         if ( hypercall_preempt_check() )
             return hypercall_create_continuation(
-                __HYPERVISOR_console_io, "iip",
+                __HYPERVISOR_console_io, "iih",
                 CONSOLEIO_write, count, buffer);
 
         kcount = min_t(int, count, sizeof(kbuf)-1);
-        if ( copy_from_user(kbuf, buffer, kcount) )
+        if ( copy_from_guest((char *)kbuf, buffer, kcount) )
             return -EFAULT;
         kbuf[kcount] = '\0';
 
@@ -349,14 +348,14 @@
         for ( kptr = kbuf; *kptr != '\0'; kptr++ )
             putchar_console(*kptr);
 
-        buffer += kcount;
-        count  -= kcount;
+        guest_handle_add_offset(buffer, kcount);
+        count -= kcount;
     }
 
     return 0;
 }
 
-long do_console_io(int cmd, int count, char *buffer)
+long do_console_io(int cmd, int count, GUEST_HANDLE(char) buffer)
 {
     long rc;
     unsigned int idx, len;
@@ -382,7 +381,7 @@
                 len = SERIAL_RX_SIZE - idx;
             if ( (rc + len) > count )
                 len = count - rc;
-            if ( copy_to_user(&buffer[rc], &serial_rx_ring[idx], len) )
+            if ( copy_to_guest_offset(buffer, rc, &serial_rx_ring[idx], len) )
             {
                 rc = -EFAULT;
                 break;
diff -r b41ad96f1242 -r 4293d6760cef xen/include/asm-ia64/guest_access.h
--- a/xen/include/asm-ia64/guest_access.h       Tue Mar  7 15:48:36 2006
+++ b/xen/include/asm-ia64/guest_access.h       Tue Mar  7 17:40:42 2006
@@ -20,6 +20,8 @@
     type *_x = (hnd).p;                         \
     (GUEST_HANDLE(type)) { _x };                \
 })
+
+#define guest_handle_from_ptr(ptr, type) ((GUEST_HANDLE(type)) { (type *)ptr })
 
 /*
  * Copy an array of objects to guest context via a guest handle,
diff -r b41ad96f1242 -r 4293d6760cef xen/include/asm-ia64/hypercall.h
--- a/xen/include/asm-ia64/hypercall.h  Tue Mar  7 15:48:36 2006
+++ b/xen/include/asm-ia64/hypercall.h  Tue Mar  7 17:40:42 2006
@@ -16,4 +16,6 @@
     u64 *pdone,
     u64 foreigndom);
 
+#define arch_do_vcpu_op(cmd, vcpu, arg) (-ENOSYS)
+
 #endif /* __ASM_IA64_HYPERCALL_H__ */
diff -r b41ad96f1242 -r 4293d6760cef xen/include/asm-ia64/xensystem.h
--- a/xen/include/asm-ia64/xensystem.h  Tue Mar  7 15:48:36 2006
+++ b/xen/include/asm-ia64/xensystem.h  Tue Mar  7 17:40:42 2006
@@ -75,35 +75,5 @@
 // FIXME SMP... see system.h, does this need to be different?
 #define switch_to(prev,next,last)      __switch_to(prev, next, last)
 
-#define __cmpxchg_user(ptr, new, old, _size)                           \
-({                                                                     \
-       register long __gu_r8 asm ("r8");                               \
-       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                  \
-       asm volatile ("mov %1=r0;;\n"                                   \
-               "[1:]\tcmpxchg"_size".acq %0=[%2],%3,ar.ccv\n"          \
-               "\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"                \
-               "[1:]"                                                  \
-               : "=r"(old), "=r"(__gu_r8) :                            \
-               "r"(ptr), "r"(new) : "memory");                         \
-       __gu_r8;                                                        \
-})
-
-
-// NOTE: Xen defines args as pointer,old,new whereas ia64 uses pointer,new,old
-//  so reverse them here
-#define cmpxchg_user(_p,_o,_n)                                 \
-({                                                             \
-       register long _rc;                                      \
-       ia64_mf();                                              \
-       switch ( sizeof(*(_p)) ) {                              \
-           case 1: _rc = __cmpxchg_user(_p,_n,_o,"1"); break;  \
-           case 2: _rc = __cmpxchg_user(_p,_n,_o,"2"); break;  \
-           case 4: _rc = __cmpxchg_user(_p,_n,_o,"4"); break;  \
-           case 8: _rc = __cmpxchg_user(_p,_n,_o,"8"); break;  \
-       }                                                       \
-       ia64_mf();                                              \
-       _rc;                                                    \
-})
-
 #endif // __ASSEMBLY__
 #endif // _ASM_IA64_XENSYSTEM_H
diff -r b41ad96f1242 -r 4293d6760cef xen/include/asm-x86/hypercall.h
--- a/xen/include/asm-x86/hypercall.h   Tue Mar  7 15:48:36 2006
+++ b/xen/include/asm-x86/hypercall.h   Tue Mar  7 17:40:42 2006
@@ -5,22 +5,22 @@
 #ifndef __ASM_X86_HYPERCALL_H__
 #define __ASM_X86_HYPERCALL_H__
 
-struct trap_info;
+#include <public/physdev.h>
+
 extern long
 do_set_trap_table(
-    struct trap_info *traps);
+    GUEST_HANDLE(trap_info_t) traps);
 
-struct mmu_update;
 extern int
 do_mmu_update(
-    struct mmu_update *ureqs,
+    GUEST_HANDLE(mmu_update_t) ureqs,
     unsigned int count,
-    unsigned int *pdone,
+    GUEST_HANDLE(uint) pdone,
     unsigned int foreigndom);
 
 extern long
 do_set_gdt(
-    unsigned long *frame_list,
+    GUEST_HANDLE(ulong) frame_list,
     unsigned int entries);
 
 extern long
@@ -52,10 +52,9 @@
     u64 val64,
     unsigned long flags);
 
-struct physdev_op;
 extern long
 do_physdev_op(
-    struct physdev_op *uop);
+    GUEST_HANDLE(physdev_op_t) uop);
 
 extern int
 do_update_va_mapping_otherdomain(
@@ -66,14 +65,19 @@
 
 extern int
 do_mmuext_op(
-    struct mmuext_op *uops,
+    GUEST_HANDLE(mmuext_op_t) uops,
     unsigned int count,
-    unsigned int *pdone,
+    GUEST_HANDLE(uint) pdone,
     unsigned int foreigndom);
 
 extern unsigned long
 do_iret(
     void);
+
+struct vcpu;
+extern long
+arch_do_vcpu_op(
+    int cmd, struct vcpu *v, GUEST_HANDLE(void) arg);
 
 #ifdef __x86_64__
 
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/acm_ops.h
--- a/xen/include/public/acm_ops.h      Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/acm_ops.h      Tue Mar  7 17:40:42 2006
@@ -10,6 +10,7 @@
 
 #include "xen.h"
 #include "sched_ctl.h"
+#include "acm.h"
 
 /*
  * Make sure you increment the interface version whenever you modify this file!
@@ -71,7 +72,7 @@
     int acm_decision;           /* out */
 };
 
-struct acm_op {
+typedef struct acm_op {
     uint32_t cmd;
     uint32_t interface_version;      /* ACM_INTERFACE_VERSION */
     union {
@@ -81,7 +82,8 @@
         struct acm_getssid getssid;
         struct acm_getdecision getdecision;
     } u;
-};
+} acm_op_t;
+DEFINE_GUEST_HANDLE(acm_op_t);
 
 #endif                          /* __XEN_PUBLIC_ACM_OPS_H__ */
 
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/arch-x86_32.h
--- a/xen/include/public/arch-x86_32.h  Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/arch-x86_32.h  Tue Mar  7 17:40:42 2006
@@ -102,6 +102,7 @@
     uint16_t      cs;      /* code selector                                 */
     unsigned long address; /* code offset                                   */
 } trap_info_t;
+DEFINE_GUEST_HANDLE(trap_info_t);
 
 typedef struct cpu_user_regs {
     uint32_t ebx;
@@ -125,6 +126,7 @@
     uint16_t fs, _pad4;
     uint16_t gs, _pad5;
 } cpu_user_regs_t;
+DEFINE_GUEST_HANDLE(cpu_user_regs_t);
 
 typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */
 
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/arch-x86_64.h
--- a/xen/include/public/arch-x86_64.h  Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/arch-x86_64.h  Tue Mar  7 17:40:42 2006
@@ -136,15 +136,6 @@
     uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
     /* Bottom of iret stack frame. */
 };
-/*
- * For compatibility with HYPERVISOR_switch_to_user which is the old
- * name for HYPERVISOR_iret.
- */
-struct switch_to_user {
-    /* Top of stack (%rsp at point of hypercall). */
-    uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
-    /* Bottom of iret stack frame. */
-};
 
 /*
  * Send an array of these to HYPERVISOR_set_trap_table().
@@ -166,6 +157,7 @@
     uint16_t      cs;      /* code selector                                 */
     unsigned long address; /* code offset                                   */
 } trap_info_t;
+DEFINE_GUEST_HANDLE(trap_info_t);
 
 #ifdef __GNUC__
 /* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */
@@ -205,6 +197,7 @@
     uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.     */
     uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
 } cpu_user_regs_t;
+DEFINE_GUEST_HANDLE(cpu_user_regs_t);
 
 #undef __DECL_REG
 
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/event_channel.h
--- a/xen/include/public/event_channel.h        Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/event_channel.h        Tue Mar  7 17:40:42 2006
@@ -189,6 +189,7 @@
         evtchn_unmask_t           unmask;
     } u;
 } evtchn_op_t;
+DEFINE_GUEST_HANDLE(evtchn_op_t);
 
 #endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */
 
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/grant_table.h
--- a/xen/include/public/grant_table.h  Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/grant_table.h  Tue Mar  7 17:40:42 2006
@@ -167,6 +167,7 @@
     grant_handle_t handle;
     uint64_t dev_bus_addr;
 } gnttab_map_grant_ref_t;
+DEFINE_GUEST_HANDLE(gnttab_map_grant_ref_t);
 
 /*
  * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings
@@ -188,6 +189,7 @@
     /* OUT parameters. */
     int16_t  status;              /* GNTST_* */
 } gnttab_unmap_grant_ref_t;
+DEFINE_GUEST_HANDLE(gnttab_unmap_grant_ref_t);
 
 /*
  * GNTTABOP_setup_table: Set up a grant table for <dom> comprising at least
@@ -205,8 +207,9 @@
     uint32_t nr_frames;
     /* OUT parameters. */
     int16_t  status;              /* GNTST_* */
-    unsigned long *frame_list;
+    GUEST_HANDLE(ulong) frame_list;
 } gnttab_setup_table_t;
+DEFINE_GUEST_HANDLE(gnttab_setup_table_t);
 
 /*
  * GNTTABOP_dump_table: Dump the contents of the grant table to the
@@ -219,6 +222,7 @@
     /* OUT parameters. */
     int16_t status;               /* GNTST_* */
 } gnttab_dump_table_t;
+DEFINE_GUEST_HANDLE(gnttab_dump_table_t);
 
 /*
  * GNTTABOP_transfer_grant_ref: Transfer <frame> to a foreign domain. The
@@ -237,6 +241,7 @@
     /* OUT parameters. */
     int16_t       status;
 } gnttab_transfer_t;
+DEFINE_GUEST_HANDLE(gnttab_transfer_t);
 
 /*
  * Bitfield values for update_pin_status.flags.
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/nmi.h
--- a/xen/include/public/nmi.h  Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/nmi.h  Tue Mar  7 17:40:42 2006
@@ -31,9 +31,14 @@
 /*
  * Register NMI callback for this (calling) VCPU. Currently this only makes
  * sense for domain 0, vcpu 0. All other callers will be returned EINVAL.
- * arg == address of callback function.
+ * arg == pointer to xennmi_callback structure.
  */
 #define XENNMI_register_callback   0
+typedef struct xennmi_callback {
+    unsigned long handler_address;
+    unsigned long pad;
+} xennmi_callback_t;
+DEFINE_GUEST_HANDLE(xennmi_callback_t);
 
 /*
  * Deregister NMI callback for this (calling) VCPU.
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/physdev.h
--- a/xen/include/public/physdev.h      Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/physdev.h      Tue Mar  7 17:40:42 2006
@@ -56,6 +56,7 @@
         physdevop_irq_t                   irq_op;
     } u;
 } physdev_op_t;
+DEFINE_GUEST_HANDLE(physdev_op_t);
 
 #endif /* __XEN_PUBLIC_PHYSDEV_H__ */
 
diff -r b41ad96f1242 -r 4293d6760cef xen/include/public/xen.h
--- a/xen/include/public/xen.h  Tue Mar  7 15:48:36 2006
+++ b/xen/include/public/xen.h  Tue Mar  7 17:40:42 2006
@@ -54,8 +54,6 @@
 #define __HYPERVISOR_vm_assist            21
 #define __HYPERVISOR_update_va_mapping_otherdomain 22
 #define __HYPERVISOR_iret                 23 /* x86 only */
-#define __HYPERVISOR_switch_vm86          23 /* x86/32 only (obsolete name) */
-#define __HYPERVISOR_switch_to_user       23 /* x86/64 only (obsolete name) */
 #define __HYPERVISOR_vcpu_op              24
 #define __HYPERVISOR_set_segment_base     25 /* x86/64 only */
 #define __HYPERVISOR_mmuext_op            26
@@ -162,7 +160,7 @@
 #define MMUEXT_NEW_USER_BASEPTR 15
 
 #ifndef __ASSEMBLY__
-struct mmuext_op {
+typedef struct mmuext_op {
     unsigned int cmd;
     union {
         /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR */
@@ -176,7 +174,8 @@
         /* TLB_FLUSH_MULTI, INVLPG_MULTI */
         void *vcpumask;
     } arg2;
-};
+} mmuext_op_t;
+DEFINE_GUEST_HANDLE(mmuext_op_t);
 #endif
 
 /* These are passed as 'flags' to update_va_mapping. They can be ORed. */
@@ -243,6 +242,7 @@
     uint64_t ptr;       /* Machine address of PTE. */
     uint64_t val;       /* New contents of PTE.    */
 } mmu_update_t;
+DEFINE_GUEST_HANDLE(mmu_update_t);
 
 /*
  * Send an array of these to HYPERVISOR_multicall().
@@ -252,6 +252,7 @@
     unsigned long op, result;
     unsigned long args[6];
 } multicall_entry_t;
+DEFINE_GUEST_HANDLE(multicall_entry_t);
 
 /*
  * Event channel endpoints per domain:
diff -r b41ad96f1242 -r 4293d6760cef xen/include/xen/hypercall.h
--- a/xen/include/xen/hypercall.h       Tue Mar  7 15:48:36 2006
+++ b/xen/include/xen/hypercall.h       Tue Mar  7 17:40:42 2006
@@ -9,6 +9,7 @@
 #include <xen/types.h>
 #include <xen/time.h>
 #include <public/xen.h>
+#include <public/acm_ops.h>
 #include <asm/hypercall.h>
 
 extern long
@@ -20,46 +21,43 @@
     int cmd,
     unsigned long arg);
 
-struct dom0_op;
 extern long
 do_dom0_op(
-    struct dom0_op *u_dom0_op);
+    GUEST_HANDLE(dom0_op_t) u_dom0_op);
 
 extern long
 do_memory_op(
     int cmd,
-    void *arg);
+    GUEST_HANDLE(void) arg);
 
-struct multicall_entry;
 extern long
 do_multicall(
-    struct multicall_entry *call_list,
+    GUEST_HANDLE(multicall_entry_t) call_list,
     unsigned int nr_calls);
 
 extern long
 do_set_timer_op(
     s_time_t timeout);
 
-struct evtchn_op;
 extern long
 do_event_channel_op(
-    struct evtchn_op *uop);
+    GUEST_HANDLE(evtchn_op_t) uop);
 
 extern long
 do_xen_version(
     int cmd,
-    void *arg);
+    GUEST_HANDLE(void) arg);
 
 extern long
 do_console_io(
     int cmd,
     int count,
-    char *buffer);
+    GUEST_HANDLE(char) buffer);
 
 extern long
 do_grant_table_op(
     unsigned int cmd,
-    void *uop,
+    GUEST_HANDLE(void) uop,
     unsigned int count);
 
 extern long
@@ -71,16 +69,15 @@
 do_vcpu_op(
     int cmd,
     int vcpuid,
-    void *arg);
+    GUEST_HANDLE(void) arg);
 
-struct acm_op;
 extern long
 do_acm_op(
-    struct acm_op *u_acm_op);
+    GUEST_HANDLE(acm_op_t) u_acm_op);
 
 extern long
 do_nmi_op(
     unsigned int cmd,
-    void *arg);
+    GUEST_HANDLE(void) arg);
 
 #endif /* __XEN_HYPERCALL_H__ */
diff -r b41ad96f1242 -r 4293d6760cef xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Tue Mar  7 15:48:36 2006
+++ b/xen/include/xen/sched.h   Tue Mar  7 17:40:42 2006
@@ -310,7 +310,6 @@
  * It contains one character per argument as follows:
  *  'i' [unsigned] {char, int}
  *  'l' [unsigned] long
- *  'p' pointer (foo *)
  *  'h' guest handle (GUEST_HANDLE(foo))
  */
 unsigned long hypercall_create_continuation(

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Upgrade all hypercalls to use the new guest_handle interface (on the Xen side)., Xen patchbot -unstable <=