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-devel

[Xen-devel] [PATCH, RFC 4/17] 32-on-64 compatibility header generation

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH, RFC 4/17] 32-on-64 compatibility header generation
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Wed, 04 Oct 2006 16:30:33 +0100
Delivery-date: Wed, 04 Oct 2006 08:29:50 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
.. plus using a few hypercalls that don't need argument translation

Index: 2006-10-04/xen/Makefile
===================================================================
--- 2006-10-04.orig/xen/Makefile        2006-10-04 09:13:16.000000000 +0200
+++ 2006-10-04/xen/Makefile     2006-10-04 15:09:52.000000000 +0200
@@ -47,6 +47,7 @@ _debug:
 .PHONY: _clean
 _clean: delete-unfresh-files
        $(MAKE) -C tools clean
+       $(MAKE) -f $(BASEDIR)/Rules.mk -C include clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C common clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C drivers clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C acm clean
@@ -68,6 +69,7 @@ $(TARGET): delete-unfresh-files
        $(MAKE) -f $(BASEDIR)/Rules.mk include/xen/compile.h
        $(MAKE) -f $(BASEDIR)/Rules.mk include/xen/acm_policy.h
        [ -e include/asm ] || ln -sf asm-$(TARGET_ARCH) include/asm
+       $(MAKE) -f $(BASEDIR)/Rules.mk -C include
        $(MAKE) -f $(BASEDIR)/Rules.mk -C arch/$(TARGET_ARCH) asm-offsets.s
        $(MAKE) -f $(BASEDIR)/Rules.mk include/asm-$(TARGET_ARCH)/asm-offsets.h
        $(MAKE) -f $(BASEDIR)/Rules.mk -C arch/$(TARGET_ARCH) $(TARGET)
Index: 2006-10-04/xen/Rules.mk
===================================================================
--- 2006-10-04.orig/xen/Rules.mk        2006-08-21 18:02:23.000000000 +0200
+++ 2006-10-04/xen/Rules.mk     2006-10-04 15:09:52.000000000 +0200
@@ -32,6 +32,7 @@ TARGET := $(BASEDIR)/xen
 
 HDRS := $(wildcard $(BASEDIR)/include/xen/*.h)
 HDRS += $(wildcard $(BASEDIR)/include/public/*.h)
+HDRS += $(wildcard $(BASEDIR)/include/compat/*.h)
 HDRS += $(wildcard $(BASEDIR)/include/asm-$(TARGET_ARCH)/*.h)
 HDRS += $(wildcard $(BASEDIR)/include/asm-$(TARGET_ARCH)/$(TARGET_SUBARCH)/*.h)
 
Index: 2006-10-04/xen/arch/x86/x86_64/compat/entry.S
===================================================================
--- 2006-10-04.orig/xen/arch/x86/x86_64/compat/entry.S  2006-10-04 
15:09:26.000000000 +0200
+++ 2006-10-04/xen/arch/x86/x86_64/compat/entry.S       2006-10-04 
15:09:52.000000000 +0200
@@ -281,28 +281,19 @@ CFIX14:
 #define compat_set_trap_table domain_crash_synchronous
 #define compat_mmu_update domain_crash_synchronous
 #define compat_set_gdt domain_crash_synchronous
-#define compat_stack_switch domain_crash_synchronous
-#define compat_fpu_taskswitch domain_crash_synchronous
-#define compat_arch_sched_op_compat domain_crash_synchronous
 #define compat_platform_op domain_crash_synchronous
-#define compat_set_debugreg domain_crash_synchronous
-#define compat_get_debugreg domain_crash_synchronous
 #define compat_update_descriptor domain_crash_synchronous
 #define compat_memory_op domain_crash_synchronous
 #define compat_multicall domain_crash_synchronous
 #define compat_update_va_mapping domain_crash_synchronous
 #define compat_set_timer_op domain_crash_synchronous
 #define compat_event_channel_op_compat domain_crash_synchronous
-#define compat_xen_version domain_crash_synchronous
-#define compat_console_io domain_crash_synchronous
 #define compat_physdev_op_compat domain_crash_synchronous
 #define compat_grant_table_op domain_crash_synchronous
-#define compat_vm_assist domain_crash_synchronous
 #define compat_update_va_mapping_otherdomain domain_crash_synchronous
 #define compat_vcpu_op domain_crash_synchronous
 #define compat_mmuext_op domain_crash_synchronous
 #define compat_acm_op domain_crash_synchronous
-#define compat_nmi_op domain_crash_synchronous
 #define compat_arch_sched_op domain_crash_synchronous
 #define compat_xenoprof_op domain_crash_synchronous
 #define compat_event_channel_op domain_crash_synchronous
@@ -314,29 +305,29 @@ ENTRY(compat_hypercall_table)
         .quad compat_set_trap_table     /*  0 */
         .quad compat_mmu_update
         .quad compat_set_gdt
-        .quad compat_stack_switch
+        .quad do_stack_switch
         .quad compat_set_callbacks
-        .quad compat_fpu_taskswitch     /*  5 */
-        .quad compat_arch_sched_op_compat
+        .quad do_fpu_taskswitch         /*  5 */
+        .quad do_arch_sched_op_compat
         .quad compat_platform_op
-        .quad compat_set_debugreg
-        .quad compat_get_debugreg
+        .quad do_set_debugreg
+        .quad do_get_debugreg
         .quad compat_update_descriptor  /* 10 */
-        .quad do_ni_hypercall
+        .quad compat_ni_hypercall
         .quad compat_memory_op
         .quad compat_multicall
         .quad compat_update_va_mapping
         .quad compat_set_timer_op       /* 15 */
         .quad compat_event_channel_op_compat
         .quad compat_xen_version
-        .quad compat_console_io
+        .quad do_console_io
         .quad compat_physdev_op_compat
         .quad compat_grant_table_op     /* 20 */
         .quad compat_vm_assist
         .quad compat_update_va_mapping_otherdomain
         .quad compat_iret
         .quad compat_vcpu_op
-        .quad do_ni_hypercall           /* 25 */
+        .quad compat_ni_hypercall       /* 25 */
         .quad compat_mmuext_op
         .quad compat_acm_op
         .quad compat_nmi_op
@@ -345,11 +336,11 @@ ENTRY(compat_hypercall_table)
         .quad compat_xenoprof_op
         .quad compat_event_channel_op
         .quad compat_physdev_op
-        .quad do_ni_hypercall
+        .quad compat_ni_hypercall
         .quad compat_sysctl             /* 35 */
         .quad compat_domctl
         .rept NR_hypercalls-((.-compat_hypercall_table)/8)
-        .quad do_ni_hypercall
+        .quad compat_ni_hypercall
         .endr
 
 ENTRY(compat_hypercall_args_table)
@@ -364,7 +355,7 @@ ENTRY(compat_hypercall_args_table)
         .byte 2 /* compat_set_debugreg      */
         .byte 1 /* compat_get_debugreg      */
         .byte 4 /* compat_update_descriptor */  /* 10 */
-        .byte 0 /* do_ni_hypercall          */
+        .byte 0 /* compat_ni_hypercall      */
         .byte 2 /* compat_memory_op         */
         .byte 2 /* compat_multicall         */
         .byte 4 /* compat_update_va_mapping */
@@ -378,7 +369,7 @@ ENTRY(compat_hypercall_args_table)
         .byte 5 /* compat_update_va_mapping_otherdomain */
         .byte 0 /* compat_iret              */
         .byte 3 /* compat_vcpu_op           */
-        .byte 0 /* do_ni_hypercall          */  /* 25 */
+        .byte 0 /* compat_ni_hypercall      */  /* 25 */
         .byte 4 /* compat_mmuext_op         */
         .byte 1 /* compat_acm_op            */
         .byte 2 /* compat_nmi_op            */
@@ -387,9 +378,9 @@ ENTRY(compat_hypercall_args_table)
         .byte 2 /* compat_xenoprof_op       */
         .byte 2 /* compat_event_channel_op  */
         .byte 2 /* compat_physdev_op        */
-        .byte 0 /* do_ni_hypercall          */
+        .byte 0 /* compat_ni_hypercall      */
         .byte 1 /* compat_sysctl            */  /* 35 */
         .byte 1 /* compat_domctl            */
         .rept NR_hypercalls-(.-compat_hypercall_args_table)
-        .byte 0 /* do_ni_hypercall          */
+        .byte 0 /* compat_ni_hypercall      */
         .endr
Index: 2006-10-04/xen/arch/x86/x86_64/compat/traps.c
===================================================================
--- 2006-10-04.orig/xen/arch/x86/x86_64/compat/traps.c  2006-10-04 
15:06:22.000000000 +0200
+++ 2006-10-04/xen/arch/x86/x86_64/compat/traps.c       2006-10-04 
15:09:52.000000000 +0200
@@ -1,25 +1,6 @@
 #ifdef CONFIG_COMPAT
 
-#if 0 /* XXX */
 #include <compat/callback.h>
-#else
-struct compat_xen_callback {
-    unsigned int cs;
-    unsigned int eip;
-};
-typedef struct compat_xen_callback xen_callback_compat_t;
-
-struct compat_callback_register {
-    uint16_t type;
-    uint16_t flags;
-    xen_callback_compat_t address;
-};
-
-struct compat_callback_unregister {
-    uint16_t type;
-    uint16_t _unused;
-};
-#endif
 
 void compat_show_guest_stack(struct cpu_user_regs *regs, int debug_stack_lines)
 {
Index: 2006-10-04/xen/common/Makefile
===================================================================
--- 2006-10-04.orig/xen/common/Makefile 2006-10-04 15:03:07.000000000 +0200
+++ 2006-10-04/xen/common/Makefile      2006-10-04 15:09:52.000000000 +0200
@@ -30,5 +30,7 @@ obj-y += xmalloc.o
 obj-$(perfc)       += perfc.o
 obj-$(crash_debug) += gdbstub.o
 
+subdir-$(CONFIG_COMPAT) += compat
+
 # Object file contains changeset and compiler information.
 version.o: $(BASEDIR)/include/xen/compile.h
Index: 2006-10-04/xen/common/compat/Makefile
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ 2006-10-04/xen/common/compat/Makefile       2006-10-04 15:09:52.000000000 
+0200
@@ -0,0 +1,4 @@
+obj-y += kernel.o
+
+# extra dependencies
+kernel.o:      ../kernel.c
Index: 2006-10-04/xen/common/compat/kernel.c
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ 2006-10-04/xen/common/compat/kernel.c       2006-10-04 15:09:52.000000000 
+0200
@@ -0,0 +1,56 @@
+/******************************************************************************
+ * kernel.c
+ */
+
+#include <xen/config.h>
+#include <xen/init.h>
+#include <xen/lib.h>
+#include <xen/errno.h>
+#include <xen/version.h>
+#include <xen/sched.h>
+#include <xen/shadow.h>
+#include <xen/nmi.h>
+#include <xen/guest_access.h>
+#include <asm/current.h>
+#include <compat/xen.h>
+#include <compat/nmi.h>
+#include <compat/version.h>
+
+#define xen_extraversion compat_extraversion
+#define xen_extraversion_t compat_extraversion_t
+
+#define xen_compile_info compat_compile_info
+#define xen_compile_info_t compat_compile_info_t
+
+CHECK_TYPE(capabilities_info);
+
+#define xen_platform_parameters compat_platform_parameters
+#define xen_platform_parameters_t compat_platform_parameters_t
+#undef HYPERVISOR_VIRT_START
+#define HYPERVISOR_VIRT_START HYPERVISOR_COMPAT_VIRT_START
+
+#define xen_changeset_info compat_changeset_info
+#define xen_changeset_info_t compat_changeset_info_t
+
+#define xen_feature_info compat_feature_info
+#define xen_feature_info_t compat_feature_info_t
+
+CHECK_TYPE(domain_handle);
+
+#define xennmi_callback compat_nmi_callback
+#define xennmi_callback_t compat_nmi_callback_t
+
+#define DO(fn) int compat_##fn
+#define COMPAT
+
+#include "../kernel.c"
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
Index: 2006-10-04/xen/common/kernel.c
===================================================================
--- 2006-10-04.orig/xen/common/kernel.c 2006-09-01 15:17:27.000000000 +0200
+++ 2006-10-04/xen/common/kernel.c      2006-10-04 15:09:52.000000000 +0200
@@ -11,11 +11,14 @@
 #include <xen/version.h>
 #include <xen/sched.h>
 #include <xen/shadow.h>
+#include <xen/nmi.h>
 #include <xen/guest_access.h>
 #include <asm/current.h>
 #include <public/nmi.h>
 #include <public/version.h>
 
+#ifndef COMPAT
+
 int tainted;
 
 char *cmdline_parse(char *cmdline)
@@ -120,11 +123,15 @@ void add_taint(unsigned flag)
     tainted |= flag;
 }
 
+# define DO(fn) long do_##fn
+
+#endif
+
 /*
  * Simple hypercalls.
  */
 
-long do_xen_version(int cmd, XEN_GUEST_HANDLE(void) arg)
+DO(xen_version)(int cmd, XEN_GUEST_HANDLE(void) arg)
 {
     switch ( cmd )
     {
@@ -234,6 +241,8 @@ long do_xen_version(int cmd, XEN_GUEST_H
     return -ENOSYS;
 }
 
+#ifndef COMPAT
+
 long register_guest_nmi_callback(unsigned long address)
 {
     struct vcpu *v = current;
@@ -264,7 +273,9 @@ long unregister_guest_nmi_callback(void)
     return 0;
 }
 
-long do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE(void) arg)
+#endif
+
+DO(nmi_op)(unsigned int cmd, XEN_GUEST_HANDLE(void) arg)
 {
     struct xennmi_callback cb;
     long rc = 0;
@@ -288,12 +299,12 @@ long do_nmi_op(unsigned int cmd, XEN_GUE
     return rc;
 }
 
-long do_vm_assist(unsigned int cmd, unsigned int type)
+DO(vm_assist)(unsigned int cmd, unsigned int type)
 {
     return vm_assist(current->domain, cmd, type);
 }
 
-long do_ni_hypercall(void)
+DO(ni_hypercall)(void)
 {
     /* No-op hypercall. */
     return -ENOSYS;
Index: 2006-10-04/xen/include/Makefile
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ 2006-10-04/xen/include/Makefile     2006-10-04 15:09:52.000000000 +0200
@@ -0,0 +1,57 @@
+ifneq ($(CONFIG_COMPAT),)
+
+compat-arch-$(CONFIG_X86) := x86_32
+
+headers-y                 := $(shell find public -name '*.h' -not -name '*-*' 
| sed 's,^public,compat,')
+headers-y                 := $(filter-out %/dom0_ops.h 
%/io/xs_wire.h,$(headers-y))
+headers-y                 += compat/arch-$(compat-arch-y).h
+
+cppflags-y                := -include public/xen-compat.h
+cppflags-$(CONFIG_X86)    += -m32
+
+# 8-byte types are 4-byte aligned on x86_32 ...
+prefix-$(CONFIG_X86)      := \#pragma pack(push, 4)
+suffix-$(CONFIG_X86)      := \#pragma pack(pop)
+
+endif
+
+.PHONY: all
+all: $(headers-y)
+
+compat/%.h: compat/%.i Makefile
+       id=_$$(echo $@ | sed 
'y,abcdefghijklmnopqrstuvwxyz-/.,ABCDEFGHIJKLMNOPQRSTUVWXYZ___,'); \
+       echo "#ifndef $$id" >$@.new; \
+       echo "#define $$id" >>$@.new; \
+       echo "#include <xen/compat.h>" >>$@.new; \
+       $(if $(filter-out compat/arch-%.h,$@),echo "#include <$(patsubst 
compat/%,public/%,$@)>" >>$@.new;) \
+       $(if $(prefix-y),echo "$(prefix-y)" >>$@.new;) \
+       grep -v '^# [[:digit:]]' $< | \
+       sed -e 's,__InClUdE__,#include,' \
+           -e 's,"xen-compat.h",<public/xen-compat.h>,' \
+           -e 
's,\(struct\|union\|enum\)[[:space:]]\+\(xen_\?\)\?\([[:alpha:]_]\),\1 
compat_\3,g' \
+           -e 's,_t\([^[:alnum:]_]\|$$\),_compat_t\1,g' \
+           -e 's,\(8\|16\|32\|64\)_compat_t\([^[:alnum:]_]\|$$\),\1_t\2,g' \
+           -e 
's,\(^\|[^[:alnum:]_]\)xen_\?\([[:alnum:]_]*\)_compat_t\([^[:alnum:]_]\|$$\),\1compat_\2_t\3,g'
 \
+           -e 's,\(^\|[^[:alnum:]_]\)XEN_\?,\1COMPAT_,' \
+           -e 's,\(^\|[^[:alnum:]_]\)Xen_\?,\1Compat_,' \
+           -e 's,\(^\|[^[:alnum:]]\)long\([^[:alnum:]]\|$$\),\1int\2,g' | \
+       uniq >>$@.new; \
+       $(if $(suffix-y),echo "$(suffix-y)" >>$@.new;) \
+       echo "#endif /* $$id */" >>$@.new
+       mv -f $@.new $@
+
+compat/%.i: compat/%.c Makefile
+       $(CPP) $(CFLAGS) $(cppflags-y) -o $@ $<
+
+compat/%.c: public/%.h Makefile
+       mkdir -p $(@D)
+       grep -v 'DEFINE_XEN_GUEST_HANDLE(long)' $< | \
+       sed -e 's,^[[:space:]]*#[[:space:]]*include[[:space:]]\+,__InClUdE__ ,' 
\
+           -e 
's,^[[:space:]]*#[[:space:]]*define[[:space:]]\+\([[:upper:]_]*_GUEST_HANDLE\),#define
 HIDE_\1,' \
+           -e 
's,^[[:space:]]*#[[:space:]]*define[[:space:]]\+\([[:lower:]_]*_guest_handle\),#define
 hide_\1,' \
+           -e 's,XEN_GUEST_HANDLE,COMPAT_HANDLE,g' \
+           >$@.new
+       mv -f $@.new $@
+
+clean::
+       rm -rf compat
Index: 2006-10-04/xen/include/asm-x86/compat.h
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ 2006-10-04/xen/include/asm-x86/compat.h     2006-10-04 15:09:52.000000000 
+0200
@@ -0,0 +1,6 @@
+/******************************************************************************
+ * compat.h
+ */
+
+typedef uint32_t compat_ptr_t;
+typedef unsigned long full_ptr_t;
Index: 2006-10-04/xen/include/asm-x86/x86_64/uaccess.h
===================================================================
--- 2006-10-04.orig/xen/include/asm-x86/x86_64/uaccess.h        2005-11-17 
15:51:06.000000000 +0100
+++ 2006-10-04/xen/include/asm-x86/x86_64/uaccess.h     2006-10-04 
15:09:52.000000000 +0200
@@ -15,6 +15,19 @@
 
 #define array_access_ok(addr, count, size) (__addr_ok(addr))
 
+#ifdef CONFIG_COMPAT
+
+#define __compat_addr_ok(addr) \
+    ((unsigned long)(addr) < HYPERVISOR_COMPAT_VIRT_START)
+
+#define compat_access_ok(addr, size) __compat_addr_ok((addr) + (size))
+
+#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 {                                                                   \
        retval = 0;                                                     \
Index: 2006-10-04/xen/include/xen/compat.h
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ 2006-10-04/xen/include/xen/compat.h 2006-10-04 15:09:52.000000000 +0200
@@ -0,0 +1,152 @@
+/******************************************************************************
+ * compat.h
+ */
+
+#ifndef __XEN_COMPAT_H__
+#define __XEN_COMPAT_H__
+
+#include <xen/config.h>
+
+#ifdef CONFIG_COMPAT
+
+#include <xen/types.h>
+#include <asm/compat.h>
+#include <compat/xlat.h>
+
+#define __DEFINE_COMPAT_HANDLE(name, type) \
+    typedef struct { \
+        compat_ptr_t c; \
+        type *_[0] __attribute__((__packed__)); \
+    } __compat_handle_ ## name
+
+#define DEFINE_COMPAT_HANDLE(name)   __DEFINE_COMPAT_HANDLE(name, name)
+#define COMPAT_HANDLE(name)          __compat_handle_ ## name
+
+/* Is the compat handle a NULL reference? */
+#define compat_handle_is_null(hnd)        ((hnd).c == 0)
+
+/* Offset the given compat handle into the array it refers to. */
+#define compat_handle_add_offset(hnd, nr) ((hnd).c += (nr) * sizeof(**(hnd)._))
+
+#define guest_from_compat_handle(ghnd, chnd)                         \
+    set_xen_guest_handle(ghnd,                                       \
+                         (__typeof__(**(chnd)._) *)(full_ptr_t)(chnd).c)
+
+/*
+ * Copy an array of objects to guest context via a compat handle,
+ * specifying an offset into the guest array.
+ */
+#define copy_to_compat_offset(hnd, off, ptr, nr) ({                  \
+    const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
+    const typeof(*(ptr)) *const _y = (ptr);                          \
+    copy_to_user(_x + (off), _y, sizeof(*_x) * (nr));                \
+})
+
+/*
+ * Copy an array of objects from guest context via a compat handle,
+ * specifying an offset into the guest array.
+ */
+#define copy_from_compat_offset(ptr, hnd, off, nr) ({                \
+    const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
+    const typeof(ptr) _y = (ptr);                                    \
+    copy_from_user(_y, _x + (off), sizeof(*_x) * (nr));              \
+})
+
+#define copy_to_compat(hnd, ptr, nr)                                 \
+    copy_to_compat_offset(hnd, 0, ptr, nr)
+
+#define copy_from_compat(ptr, hnd, nr)                               \
+    copy_from_compat_offset(ptr, hnd, 0, nr)
+
+/* Copy sub-field of a structure to guest context via a compat handle. */
+#define copy_field_to_compat(hnd, ptr, field) ({                     \
+    typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) 
*)(full_ptr_t)(hnd).c)->field; \
+    const typeof((ptr)->field) *const _y = &(ptr)->field;            \
+    copy_to_user(_x, _y, sizeof(*_x));                               \
+})
+
+/* Copy sub-field of a structure from guest context via a compat handle. */
+#define copy_field_from_compat(ptr, hnd, field) ({                   \
+    typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) 
*)(full_ptr_t)(hnd).c)->field; \
+    typeof((ptr)->field) *const _y = &(ptr)->field;                  \
+    copy_from_user(_y, _x, sizeof(*_x));                             \
+})
+
+/*
+ * Pre-validate a guest handle.
+ * Allows use of faster __copy_* functions.
+ */
+#define compat_handle_okay(hnd, nr)                                  \
+    compat_array_access_ok((void *)(full_ptr_t)(hnd).c, (nr), 
sizeof(**(hnd)._))
+
+#define __copy_to_compat_offset(hnd, off, ptr, nr) ({                \
+    const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
+    const typeof(*(ptr)) *const _y = (ptr);                          \
+    __copy_to_user(_x + (off), _y, sizeof(*_x) * (nr));              \
+})
+
+#define __copy_from_compat_offset(ptr, hnd, off, nr) ({              \
+    const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
+    const typeof(ptr) _y = (ptr);                                    \
+    __copy_from_user(_y, _x + (off), sizeof(*_x) * (nr));            \
+})
+
+#define __copy_to_compat(hnd, ptr, nr)                               \
+    __copy_to_compat_offset(hnd, 0, ptr, nr)
+
+#define __copy_from_compat(ptr, hnd, nr)                             \
+    __copy_from_compat_offset(ptr, hnd, 0, nr)
+
+#define __copy_field_to_compat(hnd, ptr, field) ({                   \
+    typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) 
*)(full_ptr_t)(hnd).c)->field; \
+    const typeof((ptr)->field) *const _y = &(ptr)->field;            \
+    __copy_to_user(_x, _y, sizeof(*_x));                             \
+})
+
+#define __copy_field_from_compat(ptr, hnd, field) ({                 \
+    typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) 
*)(full_ptr_t)(hnd).c)->field; \
+    typeof((ptr)->field) *const _y = &(ptr)->field;                  \
+    __copy_from_user(_y, _x, sizeof(*_x));                           \
+})
+
+
+#define CHECK_TYPE(name) \
+    typedef int __checkT ## name[1 - ((xen_ ## name ## _t *)0 != \
+                                   (compat_ ## name ## _t *)0) * 2]
+#define CHECK_TYPE_(k, n) \
+    typedef int __checkT ## k ## _ ## n[1 - ((k xen_ ## n *)0 != \
+                                          (k compat_ ## n *)0) * 2]
+
+#define CHECK_FIELD(t, f) \
+    typedef int __checkF ## t ## __ ## f[1 - (&((xen_ ## t ## _t *)0)->f != \
+                                           &((compat_ ## t ## _t *)0)->f) * 2]
+#define CHECK_FIELD_(k, n, f) \
+    typedef int __checkF ## k ## _ ## n ## __ ## f[1 - (&((k xen_ ## n *)0)->f 
!= \
+                                                     &((k compat_ ## n 
*)0)->f) * 2]
+
+#define CHECK_SUBFIELD_1(t, f1, f2) \
+    typedef int __checkF1 ## t ## __ ## f1 ## __ ## f2 \
+                [1 - (&((xen_ ## t ## _t *)0)->f1.f2 != \
+                   &((compat_ ## t ## _t *)0)->f1.f2) * 2]
+#define CHECK_SUBFIELD_1_(k, n, f1, f2) \
+    typedef int __checkF1 ## k ## _ ## n ## __ ## f1 ## __ ## f2 \
+                [1 - (&((k xen_ ## n *)0)->f1.f2 != \
+                   &((k compat_ ## n *)0)->f1.f2) * 2]
+
+#define CHECK_SUBFIELD_2(t, f1, f2, f3) \
+    typedef int __checkF2 ## t ## __ ## f1 ## __ ## f2 ## __ ## f3 \
+                [1 - (&((xen_ ## t ## _t *)0)->f1.f2.f3 != \
+                   &((compat_ ## t ## _t *)0)->f1.f2.f3) * 2]
+#define CHECK_SUBFIELD_2_(k, n, f1, f2, f3) \
+    typedef int __checkF2 ## k ## _ ## n ## __ ## f1 ## __ ## f2 ## __ ## f3 \
+                [1 - (&((k xen_ ## n *)0)->f1.f2.f3 != \
+                   &((k compat_ ## n *)0)->f1.f2.f3) * 2]
+
+
+/* In-place translation functons: */
+struct start_info;
+void xlat_start_info(struct start_info *, enum XLAT_start_info_console);
+
+#endif
+
+#endif /* __XEN_COMPAT_H__ */


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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH, RFC 4/17] 32-on-64 compatibility header generation, Jan Beulich <=