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

[Xen-changelog] Upgrade all hypercalls to use the new guest_handle interface (on the Xen side).



# 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


 


Rackspace

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