>From c8c8c5a6b3ff943cb645f9ac4ef169490f14cd08 Mon Sep 17 00:00:00 2001
From: Zhang Xiantao <[EMAIL PROTECTED]>
Date: Fri, 25 Jul 2008 16:50:30 +0800
Subject: [PATCH] KVM: external module: Moving x86-speicif files to x86
directory.

Create x86 directory to hold x86-specific files.
Signed-off-by: Zhang Xiantao <[EMAIL PROTECTED]>
---
 kernel/Kbuild                             |    8 +-
 kernel/Makefile                           |    2 +-
 kernel/external-module-compat-comm.h      |  475 ++++++++++++++++++
 kernel/external-module-compat.h           |  759
-----------------------------
 kernel/{ => x86}/debug.h                  |    0 
 kernel/{ => x86}/external-module-compat.c |    0 
 kernel/x86/external-module-compat.h       |  291 +++++++++++
 kernel/{ => x86}/preempt.c                |    0 
 kernel/{ => x86}/vmx-debug.c              |    0 
 9 files changed, 771 insertions(+), 764 deletions(-)
 create mode 100644 kernel/external-module-compat-comm.h
 delete mode 100644 kernel/external-module-compat.h
 rename kernel/{ => x86}/debug.h (100%)
 rename kernel/{ => x86}/external-module-compat.c (100%)
 create mode 100644 kernel/x86/external-module-compat.h
 rename kernel/{ => x86}/preempt.c (100%)
 rename kernel/{ => x86}/vmx-debug.c (100%)

diff --git a/kernel/Kbuild b/kernel/Kbuild
index 676f28d..cb63582 100644
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -1,11 +1,11 @@
 obj-m := kvm.o kvm-intel.o kvm-amd.o
 kvm-objs := kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o
i8259.o \
-        lapic.o ioapic.o preempt.o i8254.o coalesced_mmio.o \
-        external-module-compat.o
+        lapic.o ioapic.o x86/preempt.o i8254.o coalesced_mmio.o \
+        x86/external-module-compat.o
 ifeq ($(CONFIG_KVM_TRACE),y)
 kvm-objs += kvm_trace.o
 endif
-kvm-intel-objs := vmx.o vmx-debug.o external-module-compat.o
-kvm-amd-objs := svm.o external-module-compat.o
+kvm-intel-objs := vmx.o x86/vmx-debug.o x86/external-module-compat.o
+kvm-amd-objs := svm.o x86/external-module-compat.o
 
 CFLAGS_kvm_main.o = -DKVM_MAIN
diff --git a/kernel/Makefile b/kernel/Makefile
index 69b4981..c2c666e 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -35,7 +35,7 @@ all::
        $(MAKE) -C $(KERNELDIR) M=`pwd` \
                LINUXINCLUDE="-I`pwd`/include -Iinclude
-I`pwd`/include-compat \
                -include include/linux/autoconf.h \
-               -include `pwd`/external-module-compat.h"
+               -include `pwd`/$(ARCH_DIR)/external-module-compat.h"
                "$$@"
 
 sync: header-sync source-sync
diff --git a/kernel/external-module-compat-comm.h
b/kernel/external-module-compat-comm.h
new file mode 100644
index 0000000..d4bf395
--- /dev/null
+++ b/kernel/external-module-compat-comm.h
@@ -0,0 +1,475 @@
+
+/*
+ * Compatibility header for building as an external module.
+ */
+
+/*
+ * Avoid picking up the kernel's kvm.h in case we have a newer one.
+ */
+
+#include <linux/compiler.h>
+#include <linux/version.h>
+#include <linux/string.h>
+#include <linux/kvm.h>
+#include <linux/kvm_para.h>
+#include <linux/cpu.h>
+#include <linux/time.h>
+#include <asm/processor.h>
+#include <linux/hrtimer.h>
+#include <asm/bitops.h>
+#include <asm/msr.h>
+
+/*
+ * 2.6.16 does not have GFP_NOWAIT
+ */
+
+#include <linux/gfp.h>
+
+#ifndef GFP_NOWAIT
+#define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH)
+#endif
+
+
+/*
+ * kvm profiling support needs 2.6.20
+ */
+#include <linux/profile.h>
+
+#ifndef KVM_PROFILING
+#define KVM_PROFILING 1234
+#define prof_on       4321
+#endif
+
+/*
+ * smp_call_function_single() is not exported below 2.6.20, and has
different
+ * semantics below 2.6.23.  The 'nonatomic' argument was removed in
2.6.27.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+
+int kvm_smp_call_function_single(int cpu, void (*func)(void *info),
+                                void *info, int wait);
+
+#define smp_call_function_single kvm_smp_call_function_single
+
+#endif
+
+/* on_each_cpu() lost an argument in 2.6.27. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+
+#define kvm_on_each_cpu(func, info, wait) on_each_cpu(func, info, 0,
wait)
+
+#else
+
+#define kvm_on_each_cpu(func, info, wait) on_each_cpu(func, info, wait)
+
+#endif
+
+/*
+ * The cpu hotplug stubs are broken if !CONFIG_CPU_HOTPLUG
+ */
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15)
+#define DEFINE_MUTEX(a) DECLARE_MUTEX(a)
+#define mutex_lock_interruptible(a) down_interruptible(a)
+#define mutex_unlock(a) up(a)
+#define mutex_lock(a) down(a)
+#define mutex_init(a) init_MUTEX(a)
+#define mutex_trylock(a) down_trylock(a)
+#define mutex semaphore
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
+#ifndef kzalloc
+#define kzalloc(size,flags)                    \
+({                                             \
+       void *__ret = kmalloc(size, flags);     \
+       if (__ret)                              \
+               memset(__ret, 0, size);         \
+       __ret;                                  \
+})
+#endif
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
+#ifndef kmem_cache_zalloc
+#define kmem_cache_zalloc(cache,flags)                   \
+({                                                       \
+       void *__ret = kmem_cache_alloc(cache, flags);     \
+       if (__ret)                                        \
+               memset(__ret, 0, kmem_cache_size(cache)); \
+       __ret;                                            \
+})
+#endif
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
+
+#ifndef CONFIG_HOTPLUG_CPU
+#define register_cpu_notifier(nb) (0)
+#endif
+
+#endif
+
+#include <linux/miscdevice.h>
+#ifndef KVM_MINOR
+#define KVM_MINOR 232
+#endif
+
+#include <linux/notifier.h>
+#ifndef CPU_TASKS_FROZEN
+
+#define CPU_TASKS_FROZEN       0x0010
+#define CPU_ONLINE_FROZEN      (CPU_ONLINE | CPU_TASKS_FROZEN)
+#define CPU_UP_PREPARE_FROZEN  (CPU_UP_PREPARE | CPU_TASKS_FROZEN)
+#define CPU_UP_CANCELED_FROZEN (CPU_UP_CANCELED | CPU_TASKS_FROZEN)
+#define CPU_DOWN_PREPARE_FROZEN        (CPU_DOWN_PREPARE |
CPU_TASKS_FROZEN)
+#define CPU_DOWN_FAILED_FROZEN (CPU_DOWN_FAILED | CPU_TASKS_FROZEN)
+#define CPU_DEAD_FROZEN                (CPU_DEAD | CPU_TASKS_FROZEN)
+
+#endif
+
+#ifndef CPU_DYING
+#define CPU_DYING 0x000A
+#define CPU_DYING_FROZEN (CPU_DYING | CPU_TASKS_FROZEN)
+#endif
+
+#include <asm/system.h>
+
+struct inode;
+#include <linux/anon_inodes.h>
+#define anon_inode_getfd kvm_anon_inode_getfd
+int kvm_init_anon_inodes(void);
+void kvm_exit_anon_inodes(void);
+int anon_inode_getfd(const char *name,
+                    const struct file_operations *fops,
+                    void *priv);
+
+/*
+ * 2.6.23 removed the cache destructor
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
+#  define kmem_cache_create(name, size, align, flags, ctor) \
+       kmem_cache_create(name, size, align, flags, ctor, NULL)
+#endif
+
+/* HRTIMER_MODE_ABS started life with a different name */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
+#define HRTIMER_MODE_ABS HRTIMER_ABS
+#endif
+
+/* div64_u64 is fairly new */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
+
+#define div64_u64 kvm_div64_u64
+
+#ifdef CONFIG_64BIT
+
+static inline uint64_t div64_u64(uint64_t dividend, uint64_t divisor)
+{
+       return dividend / divisor;
+}
+
+#else
+
+uint64_t div64_u64(uint64_t dividend, uint64_t divisor);
+
+#endif
+
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
+
+#ifdef RHEL_RELEASE_CODE
+#if RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,2)
+#define RHEL_BOOL 1
+#endif
+#endif
+
+#ifndef RHEL_BOOL
+
+typedef _Bool bool;
+
+#endif
+
+#endif
+
+/*
+ * PF_VCPU is a Linux 2.6.24 addition
+ */
+
+#include <linux/sched.h>
+
+#ifndef PF_VCPU
+#define PF_VCPU 0
+#endif
+
+/*
+ * smp_call_function_mask() is not defined/exported below 2.6.24
+ */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+
+int kvm_smp_call_function_mask(cpumask_t mask, void (*func) (void
*info),
+                              void *info, int wait);
+
+#define smp_call_function_mask kvm_smp_call_function_mask
+
+#endif
+
+/* empty_zero_page isn't exported in all kernels */
+#include <asm/pgtable.h>
+
+#define empty_zero_page kvm_empty_zero_page
+
+static char empty_zero_page[PAGE_SIZE];
+
+static inline void blahblah(void)
+{
+       (void)empty_zero_page[0];
+}
+
+/* __mmdrop() is not exported before 2.6.25 */
+#include <linux/sched.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
+
+#define mmdrop(x) do { (void)(x); } while (0)
+#define mmget(x) do { (void)(x); } while (0)
+
+#else
+
+#define mmget(x) do { atomic_inc(x); } while (0)
+
+#endif
+
+/* pagefault_enable(), page_fault_disable() - 2.6.20 */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+
+#define pagefault_enable()  do {} while (0)
+#define pagefault_disable() do {} while (0)
+
+#endif
+
+/* vm ops ->fault() was introduced in 2.6.23. */
+#include <linux/mm.h>
+
+#ifdef KVM_MAIN
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
+
+struct vm_fault {
+       unsigned int flags;
+       pgoff_t pgoff;
+       void __user *virtual_address;
+       struct page *page;
+};
+
+static int kvm_vcpu_fault(struct vm_area_struct *vma, struct vm_fault
*vmf);
+static int kvm_vm_fault(struct vm_area_struct *vma, struct vm_fault
*vmf);
+
+static inline struct page *kvm_nopage_to_fault(
+       int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf),
+       struct vm_area_struct *vma,
+       unsigned long address,
+       int *type)
+{
+       struct vm_fault vmf;
+       int ret;
+
+       vmf.pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) +
vma->vm_pgoff;
+       vmf.virtual_address = (void __user *)address;
+       ret = fault(vma, &vmf);
+       if (ret)
+               return NOPAGE_SIGBUS;
+       *type = VM_FAULT_MINOR;
+       return vmf.page;
+}
+
+static inline struct page *__kvm_vcpu_fault(struct vm_area_struct *vma,
+                                           unsigned long address,
+                                           int *type)
+{
+       return kvm_nopage_to_fault(kvm_vcpu_fault, vma, address, type);
+}
+
+static inline struct page *__kvm_vm_fault(struct vm_area_struct *vma,
+                                         unsigned long address,
+                                         int *type)
+{
+       return kvm_nopage_to_fault(kvm_vm_fault, vma, address, type);
+}
+
+#define VMA_OPS_FAULT(x) nopage
+#define VMA_OPS_FAULT_FUNC(x) __##x
+
+#else
+
+#define VMA_OPS_FAULT(x) x
+#define VMA_OPS_FAULT_FUNC(x) x
+
+#endif
+#endif
+
+/* simple vfs attribute getter signature has changed to add a return
code */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
+
+#define MAKE_SIMPLE_ATTRIBUTE_GETTER(x)       \
+       static u64 x(void *v)                 \
+       {                                     \
+               u64 ret = 0;                  \
+                                             \
+               __##x(v, &ret);               \
+               return ret;                   \
+       }
+
+#else
+
+#define MAKE_SIMPLE_ATTRIBUTE_GETTER(x)       \
+       static int x(void *v, u64 *val)       \
+       {                                     \
+               return __##x(v, val);         \
+       }
+
+#endif
+
+/* set_kset_name() is gone in 2.6.25 */
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
+
+#define set_kset_name(x) .name = x
+
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
+#ifndef FASTCALL
+#define FASTCALL(x)    x
+#define fastcall
+#endif
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
+
+static unsigned  __attribute__((__used__)) kvm_tsc_khz = 2000000;
+
+#else
+
+#define kvm_tsc_khz tsc_khz
+
+#endif
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21)
+
+#include <linux/ktime.h>
+#include <linux/hrtimer.h>
+
+#define ktime_get kvm_ktime_get
+
+static inline ktime_t ktime_get(void)
+{
+       struct timespec now;
+
+       ktime_get_ts(&now);
+
+       return timespec_to_ktime(now);
+}
+
+#endif
+
+/* __aligned arrived in 2.6.21 */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
+#define __aligned(x) __attribute__((__aligned__(x)))
+#endif
+
+#include <linux/mm.h>
+
+/* The shrinker API changed in 2.6.23 */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
+
+struct kvm_shrinker {
+       int (*shrink)(int nr_to_scan, gfp_t gfp_mask);
+       int seeks;
+       struct shrinker *kshrinker;
+};
+
+static inline void register_shrinker(struct kvm_shrinker *shrinker)
+{
+       shrinker->kshrinker = set_shrinker(shrinker->seeks,
shrinker->shrink);
+}
+
+static inline void unregister_shrinker(struct kvm_shrinker *shrinker)
+{
+       if (shrinker->kshrinker)
+               remove_shrinker(shrinker->kshrinker);
+}
+
+#define shrinker kvm_shrinker
+
+#endif
+
+/* clocksource */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
+{
+       /*  khz = cyc/(Million ns)
+        *  mult/2^shift  = ns/cyc
+        *  mult = ns/cyc * 2^shift
+        *  mult = 1Million/khz * 2^shift
+        *  mult = 1000000 * 2^shift / khz
+        *  mult = (1000000<<shift) / khz
+        */
+       u64 tmp = ((u64)1000000) << shift_constant;
+
+       tmp += khz/2; /* round for do_div */
+       do_div(tmp, khz);
+
+       return (u32)tmp;
+}
+#else
+#include <linux/clocksource.h>
+#endif
+
+/* manually export hrtimer_init/start/cancel */
+#include <linux/kallsyms.h>
+extern void (*hrtimer_init_p)(struct hrtimer *timer, clockid_t
which_clock,
+                             enum hrtimer_mode mode);
+extern int (*hrtimer_start_p)(struct hrtimer *timer, ktime_t tim,
+                             const enum hrtimer_mode mode);
+extern int (*hrtimer_cancel_p)(struct hrtimer *timer);
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) &&
defined(CONFIG_KALLSYMS)
+static inline void hrtimer_kallsyms_resolve(void)
+{
+       hrtimer_init_p = (void *) kallsyms_lookup_name("hrtimer_init");
+       BUG_ON(!hrtimer_init_p);
+       hrtimer_start_p = (void *)
kallsyms_lookup_name("hrtimer_start");
+       BUG_ON(!hrtimer_start_p);
+       hrtimer_cancel_p = (void *)
kallsyms_lookup_name("hrtimer_cancel");
+       BUG_ON(!hrtimer_cancel_p);
+}
+#else
+static inline void hrtimer_kallsyms_resolve(void)
+{
+       hrtimer_init_p = hrtimer_init;
+       hrtimer_start_p = hrtimer_start;
+       hrtimer_cancel_p = hrtimer_cancel;
+}
+#endif
+
+/* handle old hrtimer API with data pointer */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
+static inline void hrtimer_data_pointer(struct hrtimer *timer)
+{
+       timer->data = (void *)timer;
+}
+#else
+static inline void hrtimer_data_pointer(struct hrtimer *timer) {}
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
+
+#define ns_to_timespec kvm_ns_to_timespec
+
+struct timespec kvm_ns_to_timespec(const s64 nsec);
+
+#endif
+
diff --git a/kernel/external-module-compat.h
b/kernel/external-module-compat.h
deleted file mode 100644
index 49751fc..0000000
--- a/kernel/external-module-compat.h
+++ /dev/null
@@ -1,759 +0,0 @@
-
-/*
- * Compatibility header for building as an external module.
- */
-
-/*
- * Avoid picking up the kernel's kvm.h in case we have a newer one.
- */
-
-#include <linux/compiler.h>
-#include <linux/version.h>
-#include <linux/string.h>
-#include <linux/kvm.h>
-#include <linux/kvm_para.h>
-#include <linux/cpu.h>
-#include <linux/time.h>
-#include <asm/processor.h>
-#include <linux/hrtimer.h>
-#include <asm/bitops.h>
-#include <asm/msr.h>
-
-/*
- * 2.6.16 does not have GFP_NOWAIT
- */
-
-#include <linux/gfp.h>
-
-#ifndef GFP_NOWAIT
-#define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH)
-#endif
-
-
-/*
- * kvm profiling support needs 2.6.20
- */
-#include <linux/profile.h>
-
-#ifndef KVM_PROFILING
-#define KVM_PROFILING 1234
-#define prof_on       4321
-#endif
-
-/*
- * smp_call_function_single() is not exported below 2.6.20, and has
different
- * semantics below 2.6.23.  The 'nonatomic' argument was removed in
2.6.27.
- */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-
-int kvm_smp_call_function_single(int cpu, void (*func)(void *info),
-                                void *info, int wait);
-
-#define smp_call_function_single kvm_smp_call_function_single
-
-#endif
-
-/* on_each_cpu() lost an argument in 2.6.27. */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-
-#define kvm_on_each_cpu(func, info, wait) on_each_cpu(func, info, 0,
wait)
-
-#else
-
-#define kvm_on_each_cpu(func, info, wait) on_each_cpu(func, info, wait)
-
-#endif
-
-/*
- * The cpu hotplug stubs are broken if !CONFIG_CPU_HOTPLUG
- */
-
-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15)
-#define DEFINE_MUTEX(a) DECLARE_MUTEX(a)
-#define mutex_lock_interruptible(a) down_interruptible(a)
-#define mutex_unlock(a) up(a)
-#define mutex_lock(a) down(a)
-#define mutex_init(a) init_MUTEX(a)
-#define mutex_trylock(a) down_trylock(a)
-#define mutex semaphore
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
-#ifndef kzalloc
-#define kzalloc(size,flags)                    \
-({                                             \
-       void *__ret = kmalloc(size, flags);     \
-       if (__ret)                              \
-               memset(__ret, 0, size);         \
-       __ret;                                  \
-})
-#endif
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
-#ifndef kmem_cache_zalloc
-#define kmem_cache_zalloc(cache,flags)                   \
-({                                                       \
-       void *__ret = kmem_cache_alloc(cache, flags);     \
-       if (__ret)                                        \
-               memset(__ret, 0, kmem_cache_size(cache)); \
-       __ret;                                            \
-})
-#endif
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
-
-#ifndef CONFIG_HOTPLUG_CPU
-#define register_cpu_notifier(nb) (0)
-#endif
-
-#endif
-
-#include <linux/miscdevice.h>
-#ifndef KVM_MINOR
-#define KVM_MINOR 232
-#endif
-
-#include <linux/notifier.h>
-#ifndef CPU_TASKS_FROZEN
-
-#define CPU_TASKS_FROZEN       0x0010
-#define CPU_ONLINE_FROZEN      (CPU_ONLINE | CPU_TASKS_FROZEN)
-#define CPU_UP_PREPARE_FROZEN  (CPU_UP_PREPARE | CPU_TASKS_FROZEN)
-#define CPU_UP_CANCELED_FROZEN (CPU_UP_CANCELED | CPU_TASKS_FROZEN)
-#define CPU_DOWN_PREPARE_FROZEN        (CPU_DOWN_PREPARE |
CPU_TASKS_FROZEN)
-#define CPU_DOWN_FAILED_FROZEN (CPU_DOWN_FAILED | CPU_TASKS_FROZEN)
-#define CPU_DEAD_FROZEN                (CPU_DEAD | CPU_TASKS_FROZEN)
-
-#endif
-
-#ifndef CPU_DYING
-#define CPU_DYING 0x000A
-#define CPU_DYING_FROZEN (CPU_DYING | CPU_TASKS_FROZEN)
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-
-#ifndef _EFER_SCE
-#define _EFER_SCE              0  /* SYSCALL/SYSRET */
-#endif
-
-#ifndef EFER_SCE
-#define EFER_SCE               (1<<_EFER_SCE)
-#endif
-
-#endif
-
-/*
- * For set_64bit(), which is in a new file asm/cmpxchg.h in newer
kernels.
- */
-#include <asm/system.h>
-
-struct inode;
-#include <linux/anon_inodes.h>
-#define anon_inode_getfd kvm_anon_inode_getfd
-int kvm_init_anon_inodes(void);
-void kvm_exit_anon_inodes(void);
-int anon_inode_getfd(const char *name,
-                    const struct file_operations *fops,
-                    void *priv);
-
-#include <linux/smp.h>
-
-#ifndef X86_CR0_PE
-#define X86_CR0_PE 0x00000001
-#endif
-
-#ifndef X86_CR0_MP
-#define X86_CR0_MP 0x00000002
-#endif
-
-#ifndef X86_CR0_EM
-#define X86_CR0_EM 0x00000004
-#endif
-
-#ifndef X86_CR0_TS
-#define X86_CR0_TS 0x00000008
-#endif
-
-#ifndef X86_CR0_ET
-#define X86_CR0_ET 0x00000010
-#endif
-
-#ifndef X86_CR0_NE
-#define X86_CR0_NE 0x00000020
-#endif
-
-#ifndef X86_CR0_WP
-#define X86_CR0_WP 0x00010000
-#endif
-
-#ifndef X86_CR0_AM
-#define X86_CR0_AM 0x00040000
-#endif
-
-#ifndef X86_CR0_NW
-#define X86_CR0_NW 0x20000000
-#endif
-
-#ifndef X86_CR0_CD
-#define X86_CR0_CD 0x40000000
-#endif
-
-#ifndef X86_CR0_PG
-#define X86_CR0_PG 0x80000000
-#endif
-
-#ifndef X86_CR3_PWT
-#define X86_CR3_PWT 0x00000008
-#endif
-
-#ifndef X86_CR3_PCD
-#define X86_CR3_PCD 0x00000010
-#endif
-
-#ifndef X86_CR4_VMXE
-#define X86_CR4_VMXE 0x00002000
-#endif
-
-#undef X86_CR8_TPR
-#define X86_CR8_TPR 0x0f
-
-/*
- * 2.6.23 removed the cache destructor
- */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
-#  define kmem_cache_create(name, size, align, flags, ctor) \
-       kmem_cache_create(name, size, align, flags, ctor, NULL)
-#endif
-
-/*
- * 2.6.22 does not define set_64bit() under nonpae
- */
-#ifdef CONFIG_X86_32
-
-#include <asm/cmpxchg.h>
-
-static inline void __kvm_set_64bit(u64 *ptr, u64 val)
-{
-       unsigned int low = val;
-       unsigned int high = val >> 32;
-
-       __asm__ __volatile__ (
-               "\n1:\t"
-               "movl (%0), %%eax\n\t"
-               "movl 4(%0), %%edx\n\t"
-               "lock cmpxchg8b (%0)\n\t"
-               "jnz 1b"
-               : /* no outputs */
-               :       "D"(ptr),
-                       "b"(low),
-                       "c"(high)
-               :       "ax","dx","memory");
-}
-
-#undef  set_64bit
-#define set_64bit __kvm_set_64bit
-
-static inline unsigned long long __kvm_cmpxchg64(volatile void *ptr,
-                                                unsigned long long old,
-                                                unsigned long long new)
-{
-       unsigned long long prev;
-       __asm__ __volatile__("lock cmpxchg8b %3"
-                            : "=A"(prev)
-                            : "b"((unsigned long)new),
-                              "c"((unsigned long)(new >> 32)),
-                              "m"(*__xg(ptr)),
-                              "0"(old)
-                            : "memory");
-       return prev;
-}
-
-#define kvm_cmpxchg64(ptr,o,n)\
-       ((__typeof__(*(ptr)))__kvm_cmpxchg64((ptr),(unsigned long
long)(o),\
-                                       (unsigned long long)(n)))
-
-#undef cmpxchg64
-#define cmpxchg64(ptr, o, n) kvm_cmpxchg64(ptr, o, n)
-
-#endif
-
-#ifndef CONFIG_PREEMPT_NOTIFIERS
-/*
- * Include sched|preempt.h before defining CONFIG_PREEMPT_NOTIFIERS to
avoid
- * a miscompile.
- */
-#include <linux/sched.h>
-#include <linux/preempt.h>
-#define CONFIG_PREEMPT_NOTIFIERS
-#define CONFIG_PREEMPT_NOTIFIERS_COMPAT
-
-struct preempt_notifier;
-
-struct preempt_ops {
-       void (*sched_in)(struct preempt_notifier *notifier, int cpu);
-       void (*sched_out)(struct preempt_notifier *notifier,
-                         struct task_struct *next);
-};
-
-struct preempt_notifier {
-       struct list_head link;
-       struct task_struct *tsk;
-       struct preempt_ops *ops;
-};
-
-void preempt_notifier_register(struct preempt_notifier *notifier);
-void preempt_notifier_unregister(struct preempt_notifier *notifier);
-
-static inline void preempt_notifier_init(struct preempt_notifier
*notifier,
-                                    struct preempt_ops *ops)
-{
-       notifier->ops = ops;
-}
-
-void start_special_insn(void);
-void end_special_insn(void);
-void in_special_section(void);
-void special_reload_dr7(void);
-
-void preempt_notifier_sys_init(void);
-void preempt_notifier_sys_exit(void);
-
-#else
-
-static inline void start_special_insn(void) {}
-static inline void end_special_insn(void) {}
-static inline void in_special_section(void) {}
-static inline void special_reload_dr7(void) {}
-
-static inline void preempt_notifier_sys_init(void) {}
-static inline void preempt_notifier_sys_exit(void) {}
-
-#endif
-
-/* HRTIMER_MODE_ABS started life with a different name */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
-#define HRTIMER_MODE_ABS HRTIMER_ABS
-#endif
-
-/* div64_u64 is fairly new */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
-
-#define div64_u64 kvm_div64_u64
-
-#ifdef CONFIG_64BIT
-
-static inline uint64_t div64_u64(uint64_t dividend, uint64_t divisor)
-{
-       return dividend / divisor;
-}
-
-#else
-
-uint64_t div64_u64(uint64_t dividend, uint64_t divisor);
-
-#endif
-
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-
-#ifdef RHEL_RELEASE_CODE
-#if RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,2)
-#define RHEL_BOOL 1
-#endif
-#endif
-
-#ifndef RHEL_BOOL
-
-typedef _Bool bool;
-
-#endif
-
-#endif
-
-/*
- * PF_VCPU is a Linux 2.6.24 addition
- */
-
-#include <linux/sched.h>
-
-#ifndef PF_VCPU
-#define PF_VCPU 0
-#endif
-
-/*
- * smp_call_function_mask() is not defined/exported below 2.6.24
- */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-
-int kvm_smp_call_function_mask(cpumask_t mask, void (*func) (void
*info),
-                              void *info, int wait);
-
-#define smp_call_function_mask kvm_smp_call_function_mask
-
-#endif
-
-/* CONFIG_HAS_IOMEM is apparently fairly new too (2.6.21 for x86_64).
*/
-#ifndef CONFIG_HAS_IOMEM
-#define CONFIG_HAS_IOMEM 1
-#endif
-
-/* empty_zero_page isn't exported in all kernels */
-#include <asm/pgtable.h>
-
-#define empty_zero_page kvm_empty_zero_page
-
-static char empty_zero_page[PAGE_SIZE];
-
-static inline void blahblah(void)
-{
-       (void)empty_zero_page[0];
-}
-
-/* __mmdrop() is not exported before 2.6.25 */
-#include <linux/sched.h>
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
-
-#define mmdrop(x) do { (void)(x); } while (0)
-#define mmget(x) do { (void)(x); } while (0)
-
-#else
-
-#define mmget(x) do { atomic_inc(x); } while (0)
-
-#endif
-
-/* X86_FEATURE_NX is missing in some x86_64 kernels */
-
-#include <asm/cpufeature.h>
-
-#ifndef X86_FEATURE_NX
-#define X86_FEATURE_NX (1*32+20)
-#endif
-
-#undef true
-#define true 1
-#undef false
-#define false 0
-
-/* EFER_LMA and EFER_LME are missing in pre 2.6.24 i386 kernels */
-#ifndef EFER_LME
-#define _EFER_LME           8  /* Long mode enable */
-#define _EFER_LMA           10 /* Long mode active (read-only) */
-#define EFER_LME            (1<<_EFER_LME)
-#define EFER_LMA            (1<<_EFER_LMA)
-#endif
-
-/* pagefault_enable(), page_fault_disable() - 2.6.20 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-
-#define pagefault_enable()  do {} while (0)
-#define pagefault_disable() do {} while (0)
-
-#endif
-
-/* vm ops ->fault() was introduced in 2.6.23. */
-#include <linux/mm.h>
-
-#ifdef KVM_MAIN
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
-
-struct vm_fault {
-       unsigned int flags;
-       pgoff_t pgoff;
-       void __user *virtual_address;
-       struct page *page;
-};
-
-static int kvm_vcpu_fault(struct vm_area_struct *vma, struct vm_fault
*vmf);
-static int kvm_vm_fault(struct vm_area_struct *vma, struct vm_fault
*vmf);
-
-static inline struct page *kvm_nopage_to_fault(
-       int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf),
-       struct vm_area_struct *vma,
-       unsigned long address,
-       int *type)
-{
-       struct vm_fault vmf;
-       int ret;
-
-       vmf.pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) +
vma->vm_pgoff;
-       vmf.virtual_address = (void __user *)address;
-       ret = fault(vma, &vmf);
-       if (ret)
-               return NOPAGE_SIGBUS;
-       *type = VM_FAULT_MINOR;
-       return vmf.page;
-}
-
-static inline struct page *__kvm_vcpu_fault(struct vm_area_struct *vma,
-                                           unsigned long address,
-                                           int *type)
-{
-       return kvm_nopage_to_fault(kvm_vcpu_fault, vma, address, type);
-}
-
-static inline struct page *__kvm_vm_fault(struct vm_area_struct *vma,
-                                         unsigned long address,
-                                         int *type)
-{
-       return kvm_nopage_to_fault(kvm_vm_fault, vma, address, type);
-}
-
-#define VMA_OPS_FAULT(x) nopage
-#define VMA_OPS_FAULT_FUNC(x) __##x
-
-#else
-
-#define VMA_OPS_FAULT(x) x
-#define VMA_OPS_FAULT_FUNC(x) x
-
-#endif
-#endif
-
-/* simple vfs attribute getter signature has changed to add a return
code */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
-
-#define MAKE_SIMPLE_ATTRIBUTE_GETTER(x)       \
-       static u64 x(void *v)                 \
-       {                                     \
-               u64 ret = 0;                  \
-                                             \
-               __##x(v, &ret);               \
-               return ret;                   \
-       }
-
-#else
-
-#define MAKE_SIMPLE_ATTRIBUTE_GETTER(x)       \
-       static int x(void *v, u64 *val)       \
-       {                                     \
-               return __##x(v, val);         \
-       }
-
-#endif
-
-/* set_kset_name() is gone in 2.6.25 */
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-
-#define set_kset_name(x) .name = x
-
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-#ifndef FASTCALL
-#define FASTCALL(x)    x
-#define fastcall
-#endif
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
-
-static unsigned  __attribute__((__used__)) kvm_tsc_khz = 2000000;
-
-#else
-
-#define kvm_tsc_khz tsc_khz
-
-#endif
-
-struct kvm_desc_struct {
-       union {
-               struct { unsigned int a, b; };
-               struct {
-                       u16 limit0;
-                       u16 base0;
-                       unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1;
-                       unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1,
base2: 8;
-               };
-
-       };
-} __attribute__((packed));
-
-struct kvm_ldttss_desc64 {
-       u16 limit0;
-       u16 base0;
-       unsigned base1 : 8, type : 5, dpl : 2, p : 1;
-       unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8;
-       u32 base3;
-       u32 zero1;
-} __attribute__((packed));
-
-struct kvm_desc_ptr {
-       unsigned short size;
-       unsigned long address;
-} __attribute__((packed));
-
-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21)
-
-#include <linux/ktime.h>
-#include <linux/hrtimer.h>
-
-#define ktime_get kvm_ktime_get
-
-static inline ktime_t ktime_get(void)
-{
-       struct timespec now;
-
-       ktime_get_ts(&now);
-
-       return timespec_to_ktime(now);
-}
-
-#endif
-
-/* __aligned arrived in 2.6.21 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
-#define __aligned(x) __attribute__((__aligned__(x)))
-#endif
-
-#include <asm/msr.h>
-#ifndef MSR_FS_BASE
-#define MSR_FS_BASE 0xc0000100
-#endif
-#ifndef MSR_GS_BASE
-#define MSR_GS_BASE 0xc0000101
-#endif
-
-#include <linux/mm.h>
-
-/* The shrinker API changed in 2.6.23 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
-
-struct kvm_shrinker {
-       int (*shrink)(int nr_to_scan, gfp_t gfp_mask);
-       int seeks;
-       struct shrinker *kshrinker;
-};
-
-static inline void register_shrinker(struct kvm_shrinker *shrinker)
-{
-       shrinker->kshrinker = set_shrinker(shrinker->seeks,
shrinker->shrink);
-}
-
-static inline void unregister_shrinker(struct kvm_shrinker *shrinker)
-{
-       if (shrinker->kshrinker)
-               remove_shrinker(shrinker->kshrinker);
-}
-
-#define shrinker kvm_shrinker
-
-#endif
-
-/* undefine lapic */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-
-#undef lapic
-
-#endif
-
-/* clocksource */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
-{
-       /*  khz = cyc/(Million ns)
-        *  mult/2^shift  = ns/cyc
-        *  mult = ns/cyc * 2^shift
-        *  mult = 1Million/khz * 2^shift
-        *  mult = 1000000 * 2^shift / khz
-        *  mult = (1000000<<shift) / khz
-        */
-       u64 tmp = ((u64)1000000) << shift_constant;
-
-       tmp += khz/2; /* round for do_div */
-       do_div(tmp, khz);
-
-       return (u32)tmp;
-}
-#else
-#include <linux/clocksource.h>
-#endif
-
-/* manually export hrtimer_init/start/cancel */
-#include <linux/kallsyms.h>
-extern void (*hrtimer_init_p)(struct hrtimer *timer, clockid_t
which_clock,
-                             enum hrtimer_mode mode);
-extern int (*hrtimer_start_p)(struct hrtimer *timer, ktime_t tim,
-                             const enum hrtimer_mode mode);
-extern int (*hrtimer_cancel_p)(struct hrtimer *timer);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) &&
defined(CONFIG_KALLSYMS)
-static inline void hrtimer_kallsyms_resolve(void)
-{
-       hrtimer_init_p = (void *) kallsyms_lookup_name("hrtimer_init");
-       BUG_ON(!hrtimer_init_p);
-       hrtimer_start_p = (void *)
kallsyms_lookup_name("hrtimer_start");
-       BUG_ON(!hrtimer_start_p);
-       hrtimer_cancel_p = (void *)
kallsyms_lookup_name("hrtimer_cancel");
-       BUG_ON(!hrtimer_cancel_p);
-}
-#else
-static inline void hrtimer_kallsyms_resolve(void)
-{
-       hrtimer_init_p = hrtimer_init;
-       hrtimer_start_p = hrtimer_start;
-       hrtimer_cancel_p = hrtimer_cancel;
-}
-#endif
-
-/* handle old hrtimer API with data pointer */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
-static inline void hrtimer_data_pointer(struct hrtimer *timer)
-{
-       timer->data = (void *)timer;
-}
-#else
-static inline void hrtimer_data_pointer(struct hrtimer *timer) {}
-#endif
-
-#include <asm/hw_irq.h>
-#ifndef NMI_VECTOR
-#define NMI_VECTOR 2
-#endif
-
-#ifndef MSR_MTRRcap
-#define MSR_MTRRcap            0x0fe
-#define MSR_MTRRfix64K_00000   0x250
-#define MSR_MTRRfix16K_80000   0x258
-#define MSR_MTRRfix16K_A0000   0x259
-#define MSR_MTRRfix4K_C0000    0x268
-#define MSR_MTRRfix4K_C8000    0x269
-#define MSR_MTRRfix4K_D0000    0x26a
-#define MSR_MTRRfix4K_D8000    0x26b
-#define MSR_MTRRfix4K_E0000    0x26c
-#define MSR_MTRRfix4K_E8000    0x26d
-#define MSR_MTRRfix4K_F0000    0x26e
-#define MSR_MTRRfix4K_F8000    0x26f
-#define MSR_MTRRdefType        0x2ff
-#endif
-
-#ifndef MSR_IA32_CR_PAT
-#define MSR_IA32_CR_PAT        0x00000277
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-
-#define ns_to_timespec kvm_ns_to_timespec
-
-struct timespec kvm_ns_to_timespec(const s64 nsec);
-
-#endif
-
-/* Define DEBUGCTLMSR bits */
-#ifndef DEBUGCTLMSR_LBR
-
-#define _DEBUGCTLMSR_LBR       0 /* last branch recording */
-#define _DEBUGCTLMSR_BTF       1 /* single-step on branches */
-
-#define DEBUGCTLMSR_LBR                (1UL << _DEBUGCTLMSR_LBR)
-#define DEBUGCTLMSR_BTF                (1UL << _DEBUGCTLMSR_BTF)
-
-#endif
diff --git a/kernel/debug.h b/kernel/x86/debug.h
similarity index 100%
rename from kernel/debug.h
rename to kernel/x86/debug.h
diff --git a/kernel/external-module-compat.c
b/kernel/x86/external-module-compat.c
similarity index 100%
rename from kernel/external-module-compat.c
rename to kernel/x86/external-module-compat.c
diff --git a/kernel/x86/external-module-compat.h
b/kernel/x86/external-module-compat.h
new file mode 100644
index 0000000..ce93551
--- /dev/null
+++ b/kernel/x86/external-module-compat.h
@@ -0,0 +1,291 @@
+
+/*
+ * Compatibility header for building as an external module.
+ */
+
+#include <linux/compiler.h>
+#include <linux/version.h>
+
+#include "../external-module-compat-comm.h"
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
+
+#ifndef _EFER_SCE
+#define _EFER_SCE              0  /* SYSCALL/SYSRET */
+#endif
+
+#ifndef EFER_SCE
+#define EFER_SCE               (1<<_EFER_SCE)
+#endif
+
+#endif
+
+#include <linux/smp.h>
+
+#ifndef X86_CR0_PE
+#define X86_CR0_PE 0x00000001
+#endif
+
+#ifndef X86_CR0_MP
+#define X86_CR0_MP 0x00000002
+#endif
+
+#ifndef X86_CR0_EM
+#define X86_CR0_EM 0x00000004
+#endif
+
+#ifndef X86_CR0_TS
+#define X86_CR0_TS 0x00000008
+#endif
+
+#ifndef X86_CR0_ET
+#define X86_CR0_ET 0x00000010
+#endif
+
+#ifndef X86_CR0_NE
+#define X86_CR0_NE 0x00000020
+#endif
+
+#ifndef X86_CR0_WP
+#define X86_CR0_WP 0x00010000
+#endif
+
+#ifndef X86_CR0_AM
+#define X86_CR0_AM 0x00040000
+#endif
+
+#ifndef X86_CR0_NW
+#define X86_CR0_NW 0x20000000
+#endif
+
+#ifndef X86_CR0_CD
+#define X86_CR0_CD 0x40000000
+#endif
+
+#ifndef X86_CR0_PG
+#define X86_CR0_PG 0x80000000
+#endif
+
+#ifndef X86_CR3_PWT
+#define X86_CR3_PWT 0x00000008
+#endif
+
+#ifndef X86_CR3_PCD
+#define X86_CR3_PCD 0x00000010
+#endif
+
+#ifndef X86_CR4_VMXE
+#define X86_CR4_VMXE 0x00002000
+#endif
+
+#undef X86_CR8_TPR
+#define X86_CR8_TPR 0x0f
+
+/*
+ * 2.6.22 does not define set_64bit() under nonpae
+ */
+#ifdef CONFIG_X86_32
+
+#include <asm/cmpxchg.h>
+
+static inline void __kvm_set_64bit(u64 *ptr, u64 val)
+{
+       unsigned int low = val;
+       unsigned int high = val >> 32;
+
+       __asm__ __volatile__ (
+               "\n1:\t"
+               "movl (%0), %%eax\n\t"
+               "movl 4(%0), %%edx\n\t"
+               "lock cmpxchg8b (%0)\n\t"
+               "jnz 1b"
+               : /* no outputs */
+               :       "D"(ptr),
+                       "b"(low),
+                       "c"(high)
+               :       "ax","dx","memory");
+}
+
+#undef  set_64bit
+#define set_64bit __kvm_set_64bit
+
+static inline unsigned long long __kvm_cmpxchg64(volatile void *ptr,
+                                                unsigned long long old,
+                                                unsigned long long new)
+{
+       unsigned long long prev;
+       __asm__ __volatile__("lock cmpxchg8b %3"
+                            : "=A"(prev)
+                            : "b"((unsigned long)new),
+                              "c"((unsigned long)(new >> 32)),
+                              "m"(*__xg(ptr)),
+                              "0"(old)
+                            : "memory");
+       return prev;
+}
+
+#define kvm_cmpxchg64(ptr,o,n)\
+       ((__typeof__(*(ptr)))__kvm_cmpxchg64((ptr),(unsigned long
long)(o),\
+                                       (unsigned long long)(n)))
+
+#undef cmpxchg64
+#define cmpxchg64(ptr, o, n) kvm_cmpxchg64(ptr, o, n)
+
+#endif
+
+#ifndef CONFIG_PREEMPT_NOTIFIERS
+/*
+ * Include sched|preempt.h before defining CONFIG_PREEMPT_NOTIFIERS to
avoid
+ * a miscompile.
+ */
+#include <linux/sched.h>
+#include <linux/preempt.h>
+#define CONFIG_PREEMPT_NOTIFIERS
+#define CONFIG_PREEMPT_NOTIFIERS_COMPAT
+
+struct preempt_notifier;
+
+struct preempt_ops {
+       void (*sched_in)(struct preempt_notifier *notifier, int cpu);
+       void (*sched_out)(struct preempt_notifier *notifier,
+                         struct task_struct *next);
+};
+
+struct preempt_notifier {
+       struct list_head link;
+       struct task_struct *tsk;
+       struct preempt_ops *ops;
+};
+
+void preempt_notifier_register(struct preempt_notifier *notifier);
+void preempt_notifier_unregister(struct preempt_notifier *notifier);
+
+static inline void preempt_notifier_init(struct preempt_notifier
*notifier,
+                                    struct preempt_ops *ops)
+{
+       notifier->ops = ops;
+}
+
+void start_special_insn(void);
+void end_special_insn(void);
+void in_special_section(void);
+void special_reload_dr7(void);
+
+void preempt_notifier_sys_init(void);
+void preempt_notifier_sys_exit(void);
+
+#else
+
+static inline void start_special_insn(void) {}
+static inline void end_special_insn(void) {}
+static inline void in_special_section(void) {}
+static inline void special_reload_dr7(void) {}
+
+static inline void preempt_notifier_sys_init(void) {}
+static inline void preempt_notifier_sys_exit(void) {}
+
+#endif
+
+/* CONFIG_HAS_IOMEM is apparently fairly new too (2.6.21 for x86_64).
*/
+#ifndef CONFIG_HAS_IOMEM
+#define CONFIG_HAS_IOMEM 1
+#endif
+
+/* X86_FEATURE_NX is missing in some x86_64 kernels */
+
+#include <asm/cpufeature.h>
+
+#ifndef X86_FEATURE_NX
+#define X86_FEATURE_NX (1*32+20)
+#endif
+
+#undef true
+#define true 1
+#undef false
+#define false 0
+
+/* EFER_LMA and EFER_LME are missing in pre 2.6.24 i386 kernels */
+#ifndef EFER_LME
+#define _EFER_LME           8  /* Long mode enable */
+#define _EFER_LMA           10 /* Long mode active (read-only) */
+#define EFER_LME            (1<<_EFER_LME)
+#define EFER_LMA            (1<<_EFER_LMA)
+#endif
+
+struct kvm_desc_struct {
+       union {
+               struct { unsigned int a, b; };
+               struct {
+                       u16 limit0;
+                       u16 base0;
+                       unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1;
+                       unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1,
base2: 8;
+               };
+
+       };
+} __attribute__((packed));
+
+struct kvm_ldttss_desc64 {
+       u16 limit0;
+       u16 base0;
+       unsigned base1 : 8, type : 5, dpl : 2, p : 1;
+       unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8;
+       u32 base3;
+       u32 zero1;
+} __attribute__((packed));
+
+struct kvm_desc_ptr {
+       unsigned short size;
+       unsigned long address;
+} __attribute__((packed));
+
+#include <asm/msr.h>
+#ifndef MSR_FS_BASE
+#define MSR_FS_BASE 0xc0000100
+#endif
+#ifndef MSR_GS_BASE
+#define MSR_GS_BASE 0xc0000101
+#endif
+
+/* undefine lapic */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+
+#undef lapic
+
+#endif
+
+#include <asm/hw_irq.h>
+#ifndef NMI_VECTOR
+#define NMI_VECTOR 2
+#endif
+
+#ifndef MSR_MTRRcap
+#define MSR_MTRRcap            0x0fe
+#define MSR_MTRRfix64K_00000   0x250
+#define MSR_MTRRfix16K_80000   0x258
+#define MSR_MTRRfix16K_A0000   0x259
+#define MSR_MTRRfix4K_C0000    0x268
+#define MSR_MTRRfix4K_C8000    0x269
+#define MSR_MTRRfix4K_D0000    0x26a
+#define MSR_MTRRfix4K_D8000    0x26b
+#define MSR_MTRRfix4K_E0000    0x26c
+#define MSR_MTRRfix4K_E8000    0x26d
+#define MSR_MTRRfix4K_F0000    0x26e
+#define MSR_MTRRfix4K_F8000    0x26f
+#define MSR_MTRRdefType        0x2ff
+#endif
+
+#ifndef MSR_IA32_CR_PAT
+#define MSR_IA32_CR_PAT        0x00000277
+#endif
+
+/* Define DEBUGCTLMSR bits */
+#ifndef DEBUGCTLMSR_LBR
+
+#define _DEBUGCTLMSR_LBR       0 /* last branch recording */
+#define _DEBUGCTLMSR_BTF       1 /* single-step on branches */
+
+#define DEBUGCTLMSR_LBR                (1UL << _DEBUGCTLMSR_LBR)
+#define DEBUGCTLMSR_BTF                (1UL << _DEBUGCTLMSR_BTF)
+
+#endif
diff --git a/kernel/preempt.c b/kernel/x86/preempt.c
similarity index 100%
rename from kernel/preempt.c
rename to kernel/x86/preempt.c
diff --git a/kernel/vmx-debug.c b/kernel/x86/vmx-debug.c
similarity index 100%
rename from kernel/vmx-debug.c
rename to kernel/x86/vmx-debug.c
-- 
1.5.6.2
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to