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] [xen-unstable] 32-on-64: Clean up and unify compat_arg_x

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] 32-on-64: Clean up and unify compat_arg_xlat_area handling.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 13 Jun 2008 14:10:09 -0700
Delivery-date: Fri, 13 Jun 2008 14:10:09 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
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 Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1213280555 -3600
# Node ID ebbd0e8c3e72b5e44e0ccc8e8203e85ba54009d3
# Parent  1b29ad98cd878d6fdc394bfc06156293b12bffd0
32-on-64: Clean up and unify compat_arg_xlat_area handling.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/domain.c                  |  100 ---------------------------------
 xen/arch/x86/domain_build.c            |    4 -
 xen/arch/x86/hvm/hvm.c                 |   39 +++++++-----
 xen/arch/x86/mm.c                      |    6 -
 xen/arch/x86/mm/shadow/multi.c         |    9 --
 xen/arch/x86/x86_64/compat/mm.c        |    8 +-
 xen/arch/x86/x86_64/cpu_idle.c         |    2 
 xen/arch/x86/x86_64/mm.c               |    2 
 xen/common/compat/domain.c             |    2 
 xen/common/compat/grant_table.c        |    2 
 xen/common/compat/memory.c             |    2 
 xen/include/asm-x86/config.h           |    8 --
 xen/include/asm-x86/domain.h           |    1 
 xen/include/asm-x86/hvm/guest_access.h |    2 
 xen/include/asm-x86/mm.h               |    2 
 xen/include/asm-x86/percpu.h           |    2 
 xen/include/asm-x86/uaccess.h          |    4 -
 xen/include/asm-x86/x86_32/uaccess.h   |    2 
 xen/include/asm-x86/x86_64/uaccess.h   |   19 ++++--
 19 files changed, 50 insertions(+), 166 deletions(-)

diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/domain.c     Thu Jun 12 15:22:35 2008 +0100
@@ -165,98 +165,10 @@ void free_vcpu_struct(struct vcpu *v)
 
 #ifdef CONFIG_COMPAT
 
-int setup_arg_xlat_area(struct vcpu *v, l4_pgentry_t *l4tab)
-{
-    struct domain *d = v->domain;
-    unsigned i;
-    struct page_info *pg;
-
-    if ( !d->arch.mm_arg_xlat_l3 )
-    {
-        pg = alloc_domheap_page(NULL, 0);
-        if ( !pg )
-            return -ENOMEM;
-        d->arch.mm_arg_xlat_l3 = page_to_virt(pg);
-        clear_page(d->arch.mm_arg_xlat_l3);
-    }
-
-    l4tab[l4_table_offset(COMPAT_ARG_XLAT_VIRT_BASE)] =
-        l4e_from_paddr(__pa(d->arch.mm_arg_xlat_l3), __PAGE_HYPERVISOR);
-
-    for ( i = 0; i < COMPAT_ARG_XLAT_PAGES; ++i )
-    {
-        unsigned long va = COMPAT_ARG_XLAT_VIRT_START(v->vcpu_id) + i * 
PAGE_SIZE;
-        l2_pgentry_t *l2tab;
-        l1_pgentry_t *l1tab;
-
-        if ( !l3e_get_intpte(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]) )
-        {
-            pg = alloc_domheap_page(NULL, 0);
-            if ( !pg )
-                return -ENOMEM;
-            clear_page(page_to_virt(pg));
-            d->arch.mm_arg_xlat_l3[l3_table_offset(va)] = l3e_from_page(pg, 
__PAGE_HYPERVISOR);
-        }
-        l2tab = l3e_to_l2e(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]);
-        if ( !l2e_get_intpte(l2tab[l2_table_offset(va)]) )
-        {
-            pg = alloc_domheap_page(NULL, 0);
-            if ( !pg )
-                return -ENOMEM;
-            clear_page(page_to_virt(pg));
-            l2tab[l2_table_offset(va)] = l2e_from_page(pg, __PAGE_HYPERVISOR);
-        }
-        l1tab = l2e_to_l1e(l2tab[l2_table_offset(va)]);
-        BUG_ON(l1e_get_intpte(l1tab[l1_table_offset(va)]));
-        pg = alloc_domheap_page(NULL, 0);
-        if ( !pg )
-            return -ENOMEM;
-        l1tab[l1_table_offset(va)] = l1e_from_page(pg, PAGE_HYPERVISOR);
-    }
-
-    return 0;
-}
-
-static void release_arg_xlat_area(struct domain *d)
-{
-    if ( d->arch.mm_arg_xlat_l3 )
-    {
-        unsigned l3;
-
-        for ( l3 = 0; l3 < L3_PAGETABLE_ENTRIES; ++l3 )
-        {
-            if ( l3e_get_intpte(d->arch.mm_arg_xlat_l3[l3]) )
-            {
-                l2_pgentry_t *l2tab = l3e_to_l2e(d->arch.mm_arg_xlat_l3[l3]);
-                unsigned l2;
-
-                for ( l2 = 0; l2 < L2_PAGETABLE_ENTRIES; ++l2 )
-                {
-                    if ( l2e_get_intpte(l2tab[l2]) )
-                    {
-                        l1_pgentry_t *l1tab = l2e_to_l1e(l2tab[l2]);
-                        unsigned l1;
-
-                        for ( l1 = 0; l1 < L1_PAGETABLE_ENTRIES; ++l1 )
-                        {
-                            if ( l1e_get_intpte(l1tab[l1]) )
-                                free_domheap_page(l1e_get_page(l1tab[l1]));
-                        }
-                        free_domheap_page(l2e_get_page(l2tab[l2]));
-                    }
-                }
-                free_domheap_page(l3e_get_page(d->arch.mm_arg_xlat_l3[l3]));
-            }
-        }
-        free_domheap_page(virt_to_page(d->arch.mm_arg_xlat_l3));
-    }
-}
-
 static int setup_compat_l4(struct vcpu *v)
 {
     struct page_info *pg = alloc_domheap_page(NULL, 0);
     l4_pgentry_t *l4tab;
-    int rc;
 
     if ( pg == NULL )
         return -ENOMEM;
@@ -272,12 +184,6 @@ static int setup_compat_l4(struct vcpu *
         l4e_from_paddr(__pa(v->domain->arch.mm_perdomain_l3),
                        __PAGE_HYPERVISOR);
 
-    if ( (rc = setup_arg_xlat_area(v, l4tab)) < 0 )
-    {
-        free_domheap_page(pg);
-        return rc;
-    }
-
     v->arch.guest_table = pagetable_from_page(pg);
     v->arch.guest_table_user = v->arch.guest_table;
 
@@ -309,7 +215,6 @@ int switch_native(struct domain *d)
         return 0;
 
     d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;
-    release_arg_xlat_area(d);
 
     /* switch gdt */
     gdt_l1e = l1e_from_page(virt_to_page(gdt_table), PAGE_HYPERVISOR);
@@ -359,7 +264,6 @@ int switch_compat(struct domain *d)
 
  undo_and_fail:
     d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;
-    release_arg_xlat_area(d);
     gdt_l1e = l1e_from_page(virt_to_page(gdt_table), PAGE_HYPERVISOR);
     while ( vcpuid-- != 0 )
     {
@@ -372,7 +276,6 @@ int switch_compat(struct domain *d)
 }
 
 #else
-#define release_arg_xlat_area(d) ((void)0)
 #define setup_compat_l4(v) 0
 #define release_compat_l4(v) ((void)0)
 #endif
@@ -584,9 +487,6 @@ void arch_domain_destroy(struct domain *
     free_domheap_page(virt_to_page(d->arch.mm_perdomain_l2));
     free_domheap_page(virt_to_page(d->arch.mm_perdomain_l3));
 #endif
-
-    if ( is_pv_32on64_domain(d) )
-        release_arg_xlat_area(d);
 
     free_xenheap_page(d->shared_info);
 }
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c       Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/domain_build.c       Thu Jun 12 15:22:35 2008 +0100
@@ -592,11 +592,7 @@ int __init construct_dom0(
         l4e_from_paddr(__pa(d->arch.mm_perdomain_l3), __PAGE_HYPERVISOR);
     v->arch.guest_table = pagetable_from_paddr(__pa(l4start));
     if ( is_pv_32on64_domain(d) )
-    {
         v->arch.guest_table_user = v->arch.guest_table;
-        if ( setup_arg_xlat_area(v, l4start) < 0 )
-            panic("Not enough RAM for domain 0 hypercall argument 
translation.\n");
-    }
 
     l4tab += l4_table_offset(v_start);
     mfn = alloc_spfn;
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/hvm/hvm.c    Thu Jun 12 15:22:35 2008 +0100
@@ -1571,17 +1571,21 @@ enum hvm_copy_result hvm_fetch_from_gues
                       PFEC_page_present | pfec);
 }
 
-DEFINE_PER_CPU(int, guest_handles_in_xen_space);
-
-unsigned long copy_to_user_hvm(void *to, const void *from, unsigned len)
+#ifdef __x86_64__
+DEFINE_PER_CPU(bool_t, hvm_64bit_hcall);
+#endif
+
+unsigned long copy_to_user_hvm(void *to, const void *from, unsigned int len)
 {
     int rc;
 
-    if ( this_cpu(guest_handles_in_xen_space) )
+#ifdef __x86_64__
+    if ( !this_cpu(hvm_64bit_hcall) && is_compat_arg_xlat_range(to, len) )
     {
         memcpy(to, from, len);
         return 0;
     }
+#endif
 
     rc = hvm_copy_to_guest_virt_nofault((unsigned long)to, (void *)from,
                                         len, 0);
@@ -1592,11 +1596,13 @@ unsigned long copy_from_user_hvm(void *t
 {
     int rc;
 
-    if ( this_cpu(guest_handles_in_xen_space) )
+#ifdef __x86_64__
+    if ( !this_cpu(hvm_64bit_hcall) && is_compat_arg_xlat_range(from, len) )
     {
         memcpy(to, from, len);
         return 0;
     }
+#endif
 
     rc = hvm_copy_from_guest_virt_nofault(to, (unsigned long)from, len, 0);
     return rc ? len : 0; /* fake a copy_from_user() return code */
@@ -1878,20 +1884,17 @@ static long hvm_memory_op_compat32(int c
             uint32_t idx;
             uint32_t gpfn;
         } u;
-        struct xen_add_to_physmap h;
+        struct xen_add_to_physmap *h = (void *)COMPAT_ARG_XLAT_VIRT_BASE;
 
         if ( copy_from_guest(&u, arg, 1) )
             return -EFAULT;
 
-        h.domid = u.domid;
-        h.space = u.space;
-        h.idx = u.idx;
-        h.gpfn = u.gpfn;
-
-        this_cpu(guest_handles_in_xen_space) = 1;
-        rc = hvm_memory_op(cmd, guest_handle_from_ptr(&h, void));
-        this_cpu(guest_handles_in_xen_space) = 0;
-
+        h->domid = u.domid;
+        h->space = u.space;
+        h->idx = u.idx;
+        h->gpfn = u.gpfn;
+
+        rc = hvm_memory_op(cmd, guest_handle_from_ptr(h, void));
         break;
     }
 
@@ -1934,7 +1937,7 @@ int hvm_do_hypercall(struct cpu_user_reg
     switch ( mode )
     {
 #ifdef __x86_64__
-    case 8:
+    case 8:        
 #endif
     case 4:
     case 2:
@@ -1963,11 +1966,13 @@ int hvm_do_hypercall(struct cpu_user_reg
         HVM_DBG_LOG(DBG_LEVEL_HCALL, "hcall%u(%lx, %lx, %lx, %lx, %lx)", eax,
                     regs->rdi, regs->rsi, regs->rdx, regs->r10, regs->r8);
 
+        this_cpu(hvm_64bit_hcall) = 1;
         regs->rax = hvm_hypercall64_table[eax](regs->rdi,
                                                regs->rsi,
                                                regs->rdx,
                                                regs->r10,
-                                               regs->r8);
+                                               regs->r8); 
+        this_cpu(hvm_64bit_hcall) = 0;
     }
     else
 #endif
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/mm.c Thu Jun 12 15:22:35 2008 +0100
@@ -1253,10 +1253,6 @@ static int alloc_l4_table(struct page_in
     pl4e[l4_table_offset(PERDOMAIN_VIRT_START)] =
         l4e_from_page(virt_to_page(d->arch.mm_perdomain_l3),
                       __PAGE_HYPERVISOR);
-    if ( is_pv_32on64_domain(d) )
-        pl4e[l4_table_offset(COMPAT_ARG_XLAT_VIRT_BASE)] =
-            l4e_from_page(virt_to_page(d->arch.mm_arg_xlat_l3),
-                          __PAGE_HYPERVISOR);
 
     return 1;
 
@@ -3008,7 +3004,7 @@ int do_update_va_mapping(unsigned long v
 
     perfc_incr(calls_to_update_va);
 
-    if ( unlikely(!__addr_ok(va) && !paging_mode_external(d)) )
+    if ( unlikely(!access_ok(va, 1) && !paging_mode_external(d)) )
         return -EINVAL;
 
     rc = xsm_update_va_mapping(current->domain, val);
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/mm/shadow/multi.c    Thu Jun 12 15:22:35 2008 +0100
@@ -1629,15 +1629,6 @@ void sh_install_xen_entries_in_l4(struct
         sl4e[shadow_l4_table_offset(RO_MPT_VIRT_START)] =
             shadow_l4e_from_mfn(pagetable_get_mfn(d->arch.phys_table),
                                 __PAGE_HYPERVISOR);
-    }
-
-    if ( is_pv_32on64_domain(v->domain) )
-    {
-        /* install compat arg xlat entry */
-        sl4e[shadow_l4_table_offset(COMPAT_ARG_XLAT_VIRT_BASE)] =
-            shadow_l4e_from_mfn(
-                    page_to_mfn(virt_to_page(d->arch.mm_arg_xlat_l3)),
-                    __PAGE_HYPERVISOR);
     }
 
     sh_unmap_domain_page(sl4e);    
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/x86_64/compat/mm.c
--- a/xen/arch/x86/x86_64/compat/mm.c   Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/x86_64/compat/mm.c   Thu Jun 12 15:22:35 2008 +0100
@@ -58,7 +58,7 @@ int compat_arch_memory_op(int op, XEN_GU
     case XENMEM_add_to_physmap:
     {
         struct compat_add_to_physmap cmp;
-        struct xen_add_to_physmap *nat = (void 
*)COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id);
+        struct xen_add_to_physmap *nat = (void *)COMPAT_ARG_XLAT_VIRT_BASE;
 
         if ( copy_from_guest(&cmp, arg, 1) )
             return -EFAULT;
@@ -72,7 +72,7 @@ int compat_arch_memory_op(int op, XEN_GU
     case XENMEM_set_memory_map:
     {
         struct compat_foreign_memory_map cmp;
-        struct xen_foreign_memory_map *nat = (void 
*)COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id);
+        struct xen_foreign_memory_map *nat = (void *)COMPAT_ARG_XLAT_VIRT_BASE;
 
         if ( copy_from_guest(&cmp, arg, 1) )
             return -EFAULT;
@@ -91,7 +91,7 @@ int compat_arch_memory_op(int op, XEN_GU
     case XENMEM_machine_memory_map:
     {
         struct compat_memory_map cmp;
-        struct xen_memory_map *nat = (void 
*)COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id);
+        struct xen_memory_map *nat = (void *)COMPAT_ARG_XLAT_VIRT_BASE;
 
         if ( copy_from_guest(&cmp, arg, 1) )
             return -EFAULT;
@@ -189,7 +189,7 @@ int compat_mmuext_op(XEN_GUEST_HANDLE(mm
     if ( unlikely(!guest_handle_okay(cmp_uops, count)) )
         return -EFAULT;
 
-    set_xen_guest_handle(nat_ops, (void 
*)COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id));
+    set_xen_guest_handle(nat_ops, (void *)COMPAT_ARG_XLAT_VIRT_BASE);
 
     for ( ; count; count -= i )
     {
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/x86_64/cpu_idle.c
--- a/xen/arch/x86/x86_64/cpu_idle.c    Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/x86_64/cpu_idle.c    Thu Jun 12 15:22:35 2008 +0100
@@ -35,7 +35,7 @@ DEFINE_XEN_GUEST_HANDLE(compat_processor
 DEFINE_XEN_GUEST_HANDLE(compat_processor_csd_t);
 DEFINE_XEN_GUEST_HANDLE(compat_processor_cx_t);
 
-#define xlat_page_start COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id)
+#define xlat_page_start ((unsigned long)COMPAT_ARG_XLAT_VIRT_BASE)
 #define xlat_page_size  COMPAT_ARG_XLAT_SIZE
 #define xlat_page_left_size(xlat_page_current) \
     (xlat_page_start + xlat_page_size - xlat_page_current)
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c  Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/arch/x86/x86_64/mm.c  Thu Jun 12 15:22:35 2008 +0100
@@ -35,6 +35,8 @@
 #ifdef CONFIG_COMPAT
 unsigned int m2p_compat_vstart = __HYPERVISOR_COMPAT_VIRT_START;
 #endif
+
+DEFINE_PER_CPU(char, compat_arg_xlat[COMPAT_ARG_XLAT_SIZE]);
 
 /* Top-level master (and idle-domain) page directory. */
 l4_pgentry_t __attribute__ ((__section__ (".bss.page_aligned")))
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/common/compat/domain.c
--- a/xen/common/compat/domain.c        Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/common/compat/domain.c        Thu Jun 12 15:22:35 2008 +0100
@@ -87,7 +87,7 @@ int compat_vcpu_op(int cmd, int vcpuid, 
 
         if ( copy_from_guest(&cmp, arg, 1) )
             return -EFAULT;
-        nat = (void *)COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id);
+        nat = (void *)COMPAT_ARG_XLAT_VIRT_BASE;
         XLAT_vcpu_set_singleshot_timer(nat, &cmp);
         rc = do_vcpu_op(cmd, vcpuid, guest_handle_from_ptr(nat, void));
         break;
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/common/compat/grant_table.c
--- a/xen/common/compat/grant_table.c   Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/common/compat/grant_table.c   Thu Jun 12 15:22:35 2008 +0100
@@ -97,7 +97,7 @@ int compat_grant_table_op(unsigned int c
             struct compat_gnttab_copy copy;
         } cmp;
 
-        set_xen_guest_handle(nat.uop, (void 
*)COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id));
+        set_xen_guest_handle(nat.uop, (void *)COMPAT_ARG_XLAT_VIRT_BASE);
         switch ( cmd )
         {
         case GNTTABOP_setup_table:
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/common/compat/memory.c
--- a/xen/common/compat/memory.c        Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/common/compat/memory.c        Thu Jun 12 15:22:35 2008 +0100
@@ -27,7 +27,7 @@ int compat_memory_op(unsigned int cmd, X
             struct compat_translate_gpfn_list xlat;
         } cmp;
 
-        set_xen_guest_handle(nat.hnd, (void 
*)COMPAT_ARG_XLAT_VIRT_START(current->vcpu_id));
+        set_xen_guest_handle(nat.hnd, (void *)COMPAT_ARG_XLAT_VIRT_BASE);
         split = 0;
         switch ( op )
         {
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/config.h
--- a/xen/include/asm-x86/config.h      Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/config.h      Thu Jun 12 15:22:35 2008 +0100
@@ -249,14 +249,6 @@ extern unsigned int video_mode, video_fl
 
 #endif
 
-#define COMPAT_ARG_XLAT_VIRT_BASE      (1UL << ROOT_PAGETABLE_SHIFT)
-#define COMPAT_ARG_XLAT_SHIFT          0
-#define COMPAT_ARG_XLAT_PAGES          (1U << COMPAT_ARG_XLAT_SHIFT)
-#define COMPAT_ARG_XLAT_SIZE           (COMPAT_ARG_XLAT_PAGES << PAGE_SHIFT)
-#define COMPAT_ARG_XLAT_VIRT_START(vcpu_id) \
-    (COMPAT_ARG_XLAT_VIRT_BASE + ((unsigned long)(vcpu_id) << \
-                                  (PAGE_SHIFT + COMPAT_ARG_XLAT_SHIFT + 1)))
-
 #define PGT_base_page_table     PGT_l4_page_table
 
 #define __HYPERVISOR_CS64 0xe008
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h      Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/domain.h      Thu Jun 12 15:22:35 2008 +0100
@@ -208,7 +208,6 @@ struct arch_domain
 
 #ifdef CONFIG_COMPAT
     unsigned int hv_compat_vstart;
-    l3_pgentry_t *mm_arg_xlat_l3;
 #endif
 
     /* I/O-port admin-specified access capabilities. */
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/hvm/guest_access.h
--- a/xen/include/asm-x86/hvm/guest_access.h    Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/hvm/guest_access.h    Thu Jun 12 15:22:35 2008 +0100
@@ -2,7 +2,7 @@
 #define __ASM_X86_HVM_GUEST_ACCESS_H__
 
 #include <xen/percpu.h>
-DECLARE_PER_CPU(int, guest_handles_in_xen_space);
+DECLARE_PER_CPU(bool_t, hvm_64bit_hcall);
 
 unsigned long copy_to_user_hvm(void *to, const void *from, unsigned len);
 unsigned long copy_from_user_hvm(void *to, const void *from, unsigned len);
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h  Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/mm.h  Thu Jun 12 15:22:35 2008 +0100
@@ -342,10 +342,8 @@ int map_ldt_shadow_page(unsigned int);
 int map_ldt_shadow_page(unsigned int);
 
 #ifdef CONFIG_COMPAT
-int setup_arg_xlat_area(struct vcpu *, l4_pgentry_t *);
 unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits);
 #else
-# define setup_arg_xlat_area(vcpu, l4tab) 0
 # define domain_clamp_alloc_bitsize(d, b) (b)
 #endif
 
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/percpu.h
--- a/xen/include/asm-x86/percpu.h      Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/percpu.h      Thu Jun 12 15:22:35 2008 +0100
@@ -1,7 +1,7 @@
 #ifndef __X86_PERCPU_H__
 #define __X86_PERCPU_H__
 
-#define PERCPU_SHIFT 12
+#define PERCPU_SHIFT 13
 #define PERCPU_SIZE  (1UL << PERCPU_SHIFT)
 
 /* Separate out the type, so (int[3], foo) works. */
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/uaccess.h
--- a/xen/include/asm-x86/uaccess.h     Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/uaccess.h     Thu Jun 12 15:22:35 2008 +0100
@@ -118,7 +118,7 @@ extern void __put_user_bad(void);
 ({                                                                     \
        long __pu_err = -EFAULT;                                        \
        __typeof__(*(ptr)) __user *__pu_addr = (ptr);                   \
-       if (__addr_ok(__pu_addr))                                       \
+       if (access_ok(__pu_addr,size))                                  \
                __put_user_size((x),__pu_addr,(size),__pu_err,-EFAULT); \
        __pu_err;                                                       \
 })                                                     
@@ -135,7 +135,7 @@ extern void __put_user_bad(void);
        long __gu_err;                                          \
        __typeof__(*(ptr)) __user *__gu_addr = (ptr);           \
        __get_user_size((x),__gu_addr,(size),__gu_err,-EFAULT); \
-       if (!__addr_ok(__gu_addr)) __gu_err = -EFAULT;          \
+       if (!access_ok(__gu_addr,size)) __gu_err = -EFAULT;     \
        __gu_err;                                               \
 })                                                     
 
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/x86_32/uaccess.h
--- a/xen/include/asm-x86/x86_32/uaccess.h      Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/x86_32/uaccess.h      Thu Jun 12 15:22:35 2008 +0100
@@ -1,7 +1,5 @@
 #ifndef __i386_UACCESS_H
 #define __i386_UACCESS_H
-
-#define __addr_ok(addr) ((unsigned long)(addr) < HYPERVISOR_VIRT_START)
 
 /*
  * Test whether a block of memory is a valid user space address.
diff -r 1b29ad98cd87 -r ebbd0e8c3e72 xen/include/asm-x86/x86_64/uaccess.h
--- a/xen/include/asm-x86/x86_64/uaccess.h      Thu Jun 12 09:24:35 2008 +0100
+++ b/xen/include/asm-x86/x86_64/uaccess.h      Thu Jun 12 15:22:35 2008 +0100
@@ -1,5 +1,14 @@
 #ifndef __X86_64_UACCESS_H
 #define __X86_64_UACCESS_H
+
+#define COMPAT_ARG_XLAT_VIRT_BASE this_cpu(compat_arg_xlat)
+#define COMPAT_ARG_XLAT_SIZE      PAGE_SIZE
+DECLARE_PER_CPU(char, compat_arg_xlat[COMPAT_ARG_XLAT_SIZE]);
+#define is_compat_arg_xlat_range(addr, size) ({                               \
+    unsigned long __off;                                                      \
+    __off = (unsigned long)(addr) - (unsigned long)COMPAT_ARG_XLAT_VIRT_BASE; \
+    (__off | (__off + (unsigned long)(size))) <= PAGE_SIZE;                   \
+})
 
 /*
  * Valid if in +ve half of 48-bit address space, or above Xen-reserved area.
@@ -11,11 +20,11 @@
     (((unsigned long)(addr) < (1UL<<48)) || \
      ((unsigned long)(addr) >= HYPERVISOR_VIRT_END))
 
-#define access_ok(addr, size) (__addr_ok(addr))
+#define access_ok(addr, size) \
+    (__addr_ok(addr) || is_compat_arg_xlat_range(addr, size))
 
-#define array_access_ok(addr, count, size) (__addr_ok(addr))
-
-#ifdef CONFIG_COMPAT
+#define array_access_ok(addr, count, size) \
+    (access_ok(addr, (count)*(size)))
 
 #define __compat_addr_ok(addr) \
     ((unsigned long)(addr) < HYPERVISOR_COMPAT_VIRT_START(current->domain))
@@ -26,8 +35,6 @@
 #define compat_array_access_ok(addr,count,size) \
     (likely((count) < (~0U / (size))) && \
      compat_access_ok(addr, (count) * (size)))
-
-#endif
 
 #define __put_user_size(x,ptr,size,retval,errret)                      \
 do {                                                                   \

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] 32-on-64: Clean up and unify compat_arg_xlat_area handling., Xen patchbot-unstable <=