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

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



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


 


Rackspace

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