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 1/2][PV-on-HVM] Enable Front-end drivers for 2.4 kern

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Paul Burkacki <pburkacki@xxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 1/2][PV-on-HVM] Enable Front-end drivers for 2.4 kernels
From: Ben Guthro <bguthro@xxxxxxxxxxxxxxx>
Date: Tue, 18 Dec 2007 20:07:36 -0500
Delivery-date: Tue, 18 Dec 2007 17:09:06 -0800
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
User-agent: Thunderbird 2.0.0.5 (X11/20070719)
[PATCH 1/2][PV-on-HVM] Enable Front-end drivers for 2.4 kernels

This patch enables front end drivers to build under Linux 2.4 (RHEL3-U8)

Signed-off-by: Paul Burkacki <pburkacki@xxxxxxxxxxxxxxx>
Signed-off-by: Ben Guthro <bguthro@xxxxxxxxxxxxxxx>


diffstat xen-RHEL3U8-port.patch
b/unmodified_drivers/linux-2.6/balloon/K24build                   |   10
b/unmodified_drivers/linux-2.6/blkfront/K24build                  |    6
b/unmodified_drivers/linux-2.6/compat-include/linux/cpumask.h     |   17
b/unmodified_drivers/linux-2.6/compat-include/linux/device.h      |   13
b/unmodified_drivers/linux-2.6/compat-include/linux/err.h         |    9
b/unmodified_drivers/linux-2.6/compat-include/linux/kthread.h     |    7
b/unmodified_drivers/linux-2.6/compat-include/linux/preempt.h     |    7
b/unmodified_drivers/linux-2.6/compat-include/linux/seqlock.h     |    8
b/unmodified_drivers/linux-2.6/netfront/K24build                  |    8
b/unmodified_drivers/linux-2.6/platform-pci/K24build              |   29
unmodified_drivers/linux-2.6/Makefile                             |   17
unmodified_drivers/linux-2.6/balloon/Makefile                     |    7
unmodified_drivers/linux-2.6/blkfront/Makefile                    |    7
unmodified_drivers/linux-2.6/compat-include/xen/platform-compat.h | 384 ++++++++
unmodified_drivers/linux-2.6/mkbuildtree                          |   16
unmodified_drivers/linux-2.6/netfront/Makefile                    |    7
unmodified_drivers/linux-2.6/overrides.mk                         |    7
unmodified_drivers/linux-2.6/platform-pci/Makefile                |    7
unmodified_drivers/linux-2.6/platform-pci/evtchn.c                |    4
unmodified_drivers/linux-2.6/platform-pci/platform-compat.c | 453 +++++++++-
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c          |    6
unmodified_drivers/linux-2.6/platform-pci/xen_support.c           |    4
22 files changed, 1007 insertions(+), 26 deletions(-)

[PATCH 1/2][PV-on-HVM] Enable Front-end drivers for 2.4 kernels

This patch enables front end drivers to build under Linux 2.4 (RHEL3-U8)

Signed-off-by: Paul Burkacki <pburkacki@xxxxxxxxxxxxxxx>
Signed-off-by: Ben Guthro <bguthro@xxxxxxxxxxxxxxx>

diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/Makefile
--- a/unmodified_drivers/linux-2.6/Makefile     Mon Dec 17 15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/Makefile     Mon Dec 17 15:54:42 2007 -0500
@@ -1,6 +1,15 @@ include $(M)/overrides.mk
 include $(M)/overrides.mk
 
-obj-m += platform-pci/
-obj-m += balloon/
-obj-m += blkfront/
-obj-m += netfront/
+ifeq ($(VERSION).$(PATCHLEVEL),2.6)
+       obj-m += platform-pci/
+       obj-m += balloon/
+       obj-m += blkfront/
+       obj-m += netfront/
+endif
+
+ifeq ($(VERSION).$(PATCHLEVEL),2.4)
+       mod-subdirs := platform-pci balloon blkfront netfront
+       subdir-y := platform-pci balloon blkfront netfront
+
+       include $(TOPDIR)/Rules.make
+endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/balloon/K24build
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/balloon/K24build     Mon Dec 17 15:54:42 
2007 -0500
@@ -0,0 +1,10 @@
+EXTRA_CFLAGS += -I$(M)/platform-pci
+
+O_TARGET := xen-balloon.o
+
+export-objs := balloon.o
+
+obj-y := balloon.o
+obj-m := $(O_TARGET)
+
+include $(TOPDIR)/Rules.make
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/balloon/Makefile
--- a/unmodified_drivers/linux-2.6/balloon/Makefile     Mon Dec 17 15:54:42 
2007 -0500
+++ b/unmodified_drivers/linux-2.6/balloon/Makefile     Mon Dec 17 15:54:42 
2007 -0500
@@ -1,3 +1,8 @@ ifneq ($(KERNELRELEASE),)
-ifneq ($(KERNELRELEASE),)
+ifeq ($(VERSION).$(PATCHLEVEL),2.6)
 include $(src)/Kbuild
 endif
+
+ifeq ($(VERSION).$(PATCHLEVEL),2.4)
+include $(M)/overrides.mk
+include K24build
+endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/blkfront/K24build
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/blkfront/K24build    Mon Dec 17 15:54:42 
2007 -0500
@@ -0,0 +1,6 @@
+O_TARGET := xen-vbd.o
+
+obj-y := blkfront.o vbd.o
+obj-m := $(O_TARGET)
+
+include $(TOPDIR)/Rules.make
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/blkfront/Makefile
--- a/unmodified_drivers/linux-2.6/blkfront/Makefile    Mon Dec 17 15:54:42 
2007 -0500
+++ b/unmodified_drivers/linux-2.6/blkfront/Makefile    Mon Dec 17 15:54:42 
2007 -0500
@@ -1,3 +1,8 @@ ifneq ($(KERNELRELEASE),)
-ifneq ($(KERNELRELEASE),)
+ifeq ($(VERSION).$(PATCHLEVEL),2.6)
 include $(src)/Kbuild
 endif
+
+ifeq ($(VERSION).$(PATCHLEVEL),2.4)
+include $(M)/overrides.mk
+include K24build
+endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/compat-include/linux/cpumask.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/compat-include/linux/cpumask.h       Mon Dec 
17 15:54:42 2007 -0500
@@ -0,0 +1,17 @@
+/*
+ * Dummy cpumask.h header for pre 2.6.x kernels.
+ */
+#ifndef __LINUX_CPUMASK_H
+#define __LINUX_CPUMASK_H
+
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#error "This version of Linux should not need this version of linux/cpumask.h."
+#endif
+
+#include <linux/kernel.h>
+
+#include <xen/kerncompat.h>
+
+#endif /* __LINUX_CPUMASK__H */
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/compat-include/linux/device.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/compat-include/linux/device.h        Mon Dec 
17 15:54:42 2007 -0500
@@ -0,0 +1,13 @@
+/*
+ * Dummy device.h header for pre 2.6.x kernels.
+ */
+#ifndef _DEVICE_H_
+#define _DEVICE_H_
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#error "This version of Linux should not need this version of linux/device.h."
+#endif
+
+#include <xen/kerncompat.h>
+
+#endif /* _DEVICE_H_ */
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/compat-include/linux/err.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/compat-include/linux/err.h   Mon Dec 17 
15:54:42 2007 -0500
@@ -0,0 +1,9 @@
+/*
+ * Dummy err.h header for pre 2.6.x kernels.
+ */
+
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#error "This version of Linux should not need this version of linux/err.h."
+#endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/compat-include/linux/kthread.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/compat-include/linux/kthread.h       Mon Dec 
17 15:54:42 2007 -0500
@@ -0,0 +1,7 @@
+/*
+ * Dummy kthread.h header for pre 2.6.x kernels.
+ */
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#error "This version of Linux should not need this version of linux/kthread.h."
+#endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/compat-include/linux/preempt.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/compat-include/linux/preempt.h       Mon Dec 
17 15:54:42 2007 -0500
@@ -0,0 +1,7 @@
+/*
+ * Dummy preempt.h header for pre 2.6.x kernels.
+ */
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#error "This version of Linux should not need this version of linux/preempt.h."
+#endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/compat-include/linux/seqlock.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/compat-include/linux/seqlock.h       Mon Dec 
17 13:59:05 2007 -0500
@@ -0,0 +1,8 @@
+#ifndef _LINUX_SEQLOCK_H
+#define _LINUX_SEQLOCK_H
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#error "This version of Linux should not need compat linux/seqlock.h"
+#endif
+
+#endif
diff -r 6349a4bceff8 
unmodified_drivers/linux-2.6/compat-include/xen/platform-compat.h
--- a/unmodified_drivers/linux-2.6/compat-include/xen/platform-compat.h Mon Dec 
17 15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/compat-include/xen/platform-compat.h Mon Dec 
17 15:54:42 2007 -0500
@@ -58,10 +58,25 @@
 #define blocking_notifier_call_chain(chain,val,v) 
notifier_call_chain(chain,val,v)
 #endif
 
+/*
+ * Under kernel 2.4, set_page_count() resides in mm_inline.h, not in mm.h.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#include <linux/mm_inline.h>
+
+#if defined(_LINUX_MM_INLINE_H) && defined set_page_count
+#define init_page_count(page) set_page_count(page, 1)
+#endif
+
+#else
+
 #if defined(_LINUX_MM_H) && defined set_page_count
 #define init_page_count(page) set_page_count(page, 1)
 #endif
 
+#endif
+
 #if defined(__LINUX_GFP_H) && !defined __GFP_NOMEMALLOC
 #define __GFP_NOMEMALLOC 0
 #endif
@@ -86,7 +101,11 @@ void *kzalloc(size_t size, int flags);
 void *kzalloc(size_t size, int flags);
 #endif
 
-#if defined(_LINUX_BLKDEV_H) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
+/*
+ * Ensure that the following definition of end_that_request_last() is not used
+ * under kernel 2.4.  We provide a compatibility macro for this API below.
+ */
+#if defined(_LINUX_BLKDEV_H) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) 
&& (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)))
 #define end_that_request_last(req, uptodate) end_that_request_last(req)
 #endif
 
@@ -97,10 +116,6 @@ void *kzalloc(size_t size, int flags);
 #if defined(_LINUX_KERNEL_H) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
 extern char *kasprintf(gfp_t gfp, const char *fmt, ...)
        __attribute__ ((format (printf, 2, 3)));
-#endif
-
-#if defined(_LINUX_SYSRQ_H) && LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)
-#define handle_sysrq(x,y,z) handle_sysrq(x,y)
 #endif
 
 #if defined(_PAGE_PRESENT) && !defined(_PAGE_NX)
@@ -140,7 +155,7 @@ extern char *kasprintf(gfp_t gfp, const 
 #define DEFINE_RWLOCK(x) rwlock_t x = RW_LOCK_UNLOCKED
 #endif
 
-#if defined(_LINUX_INTERRUPT_H) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
+#if defined(_LINUX_INTERRUPT_H) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) 
&& LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 /**
  *   RHEL4-U5 pulled back this feature into the older kernel 
  *   Since it is a typedef, and not a macro - detect this kernel via
@@ -155,4 +170,359 @@ typedef irqreturn_t (*irq_handler_t)(int
 #define setup_xen_features xen_setup_features
 #endif
 
-#endif
+/*
+ * Map struct kvec into a struct iovec under kernel 2.4.
+ */
+#if defined(__LINUX_UIO_H) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define kvec iovec
+#endif
+
+/*
+ * Translate work queues into task queues for kernel 2.4.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define work_struct tq_struct
+#define schedule_work schedule_task
+#define schedule_delayed_work(func, delay)    schedule_task(func)
+#define flush_scheduled_work    flush_scheduled_tasks
+
+#ifdef INIT_WORK
+#undef INIT_WORK
+#endif
+#define INIT_WORK    INIT_TQUEUE
+
+#ifdef DECLARE_WORK
+#undef DECLARE_WORK
+#endif
+#define DECLARE_WORK(n, f, d)    struct work_struct n = {    \
+    .list = { &(n).list, &(n).list },                        \
+    .sync = 0,                                               \
+    .routine = (f),                                          \
+    .data = (d)                                              \
+}
+
+#endif
+
+#if defined(MODULE) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define subsys_initcall module_init
+#endif
+
+/*
+ * Hide differences which exist in thread APIs between kernel 2.4 and kernel 
2.6.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define kthread_should_stop()    0
+
+#define kthread_run(threadfn, data, namefmt, ...)                              
      \
+({                                                                             
      \
+    struct task_struct *__task;                                                
      \
+    long __pid;                                                                
      \
+                                                                               
      \
+    __pid = kernel_thread((threadfn), (data), CLONE_KERNEL);                   
      \
+                                                                               
      \
+    if (__pid < 0)                                                             
      \
+        __task = NULL;                                                         
      \
+    else {                                                                     
      \
+        read_lock(&tasklist_lock);                                             
      \
+        __task = find_task_by_pid(__pid);                                      
      \
+        read_unlock(&tasklist_lock);                                           
      \
+                                                                               
      \
+        snprintf(__task->comm, sizeof(__task->comm) - 1, (namefmt), ## 
__VA_ARGS__); \
+                                                                               
      \
+        spin_lock_irq(&__task->sighand->siglock);                              
      \
+        sigfillset(&__task->blocked);                                          
      \
+        flush_signals(__task);                                                 
      \
+        spin_unlock_irq(&__task->sighand->siglock);                            
      \
+    }                                                                          
      \
+                                                                               
      \
+    __task;                                                                    
      \
+})
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define might_sleep()    do {} while (0)
+#endif
+
+/*
+ * Provide structures, prototypes and other primitives required by the generic
+ * device model code implemented for kernel 2.4.  This is the stripped down
+ * version of generic device model subsystem implemented in kernel 2.6.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#include <asm/atomic.h>
+#include <linux/list.h>
+
+#define BUS_ID_SIZE    20
+
+struct device;
+struct device_driver;
+
+struct bus_type {
+    char *name;
+    int  (*match)(struct device *dev, struct device_driver *drv);
+
+    struct list_head node;               /* node in the list of buses        */
+    struct list_head drivers;            /* drivers registered with this bus */
+    struct list_head devices;            /* devices on this bus              */
+};
+
+struct device {
+    struct device *parent;               /* parent or root device */
+    char bus_id[64];                     /* device's id on the owning bus */
+    atomic_t refcount;
+    struct bus_type *bus;
+    struct device_driver *driver;
+    void *driver_data;
+    void (*release)(struct device *dev);
+
+    struct list_head node;               /* node in a bus's device list */
+    struct list_head *bus_node;          /* owning bus node */
+};
+
+struct device_driver {
+    char *name;
+    struct bus_type *bus;
+    int (*probe)(struct device *dev);
+    int (*remove)(struct device *dev);
+    void (*shutdown)(struct device *dev);
+
+    struct list_head node;               /* node in a bus's driver list */
+    struct list_head *bus_node;          /* owning bus node */
+};
+
+struct attribute {
+    char *name;
+    struct module *owner;
+    mode_t mode;
+};
+
+struct device_attribute {
+    struct attribute attr;
+    ssize_t (*show)(struct device *dev, char *buf);
+    ssize_t (*store)(struct device *dev, const char *buf, size_t count);
+};
+
+int driver_register(struct device_driver *);
+void driver_unregister(struct device_driver *);
+
+struct device * get_device(struct device *);
+void put_device(struct device *);
+int device_register(struct device *);
+void device_unregister(struct device *);
+
+int bus_for_each_dev(struct bus_type *, struct device *, void *, int 
(*fn)(struct device *, void *));
+int bus_find_device(struct bus_type *, struct device *);
+int bus_register(struct bus_type *);
+void bus_unregister(struct bus_type *);
+int device_create_file(struct device *, struct device_attribute *);
+void device_remove_file(struct device *, struct device_attribute *);
+
+#define __ATTR(_name,_mode,_show,_store) { \
+    .attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE 
}, \
+    .show   = _show,                                        \
+    .store  = _store,                                       \
+}
+
+#define DEVICE_ATTR(_name,_mode,_show,_store) \
+struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
+
+#define dev_printk(level, dev, format, arg...)  \
+        printk(level "%s %s: " format , (dev)->driver ? (dev)->driver->name : 
"" , (dev)->bus_id , ## arg)
+
+#define dev_err(dev, format, arg...)            \
+        dev_printk(KERN_ERR , dev , format , ## arg)
+
+#endif
+
+
+/*
+ * Provide a 2.4 version of cpumask_of_cpu().
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+typedef unsigned long cpumask_t;
+/*typedef struct { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;*/
+#define cpumask_of_cpu(x)             (1 << cpu_logical_map(x))
+
+#endif
+
+/*
+ * Hide miscellaneous differences which exist between kernel 2.4 and 2.6.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#define __GFP_NOWARN        0
+#define __GFP_NOFAIL        0
+#define __GFP_NORETRY       0
+#define __GFP_NOMEMALLOC    0
+
+#define __user
+
+typedef void irqreturn_t;
+typedef irqreturn_t (*irq_handler_t)(int, void *, struct pt_regs *);
+#define IRQ_NONE
+#define IRQ_HANDLED
+#define IRQ_RETVAL(x)
+
+#define preempt_enable()      do { } while(0)
+#define preempt_disable()     do { } while(0)
+
+#ifdef CONFIG_SMP
+#define num_online_cpus()     smp_num_cpus
+#else
+#define num_online_cpus()     1
+#endif
+
+#include <linux/pci.h>
+
+static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
+
+static inline void wrmsrl(unsigned long msr, unsigned long long val)
+{
+    unsigned long lo, hi;
+    lo = (unsigned long) val;
+    hi = val >> 32;
+    wrmsr (msr, lo, hi);
+}
+
+#define strlcpy    strncpy
+#define strcspn    strspn
+
+void * kzalloc(size_t size, int flags);
+
+#endif
+
+/*
+ * Provide 2.4 versions of macros, functions and other definitions required
+ * by the netfront driver.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#include <linux/netdevice.h>
+
+#define NETDEV_ALIGN            32
+#define NETDEV_ALIGN_CONST      (NETDEV_ALIGN - 1)
+
+static inline void *netdev_priv(struct net_device *dev)
+{
+    return (char *) dev + ((sizeof(struct net_device) + NETDEV_ALIGN_CONST) &
+                            ~NETDEV_ALIGN_CONST);
+}
+
+#define offset_in_page(p)  ((unsigned long)(p) & ~PAGE_MASK)
+
+static inline unsigned int jiffies_to_msecs(const unsigned long j)
+{
+#if HZ <= 1000 && !(1000 % HZ)
+    return (1000 / HZ) * j;
+#elif HZ > 1000 && !(HZ % 1000)
+    return (j + (HZ / 1000) - 1)/(HZ / 1000);
+#else
+    return (j * 1000) / HZ;
+#endif
+}
+
+static inline unsigned long msecs_to_jiffies(const unsigned int m)
+{
+    if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
+        return MAX_JIFFY_OFFSET;
+#if HZ <= 1000 && !(1000 % HZ)
+    return (m + (1000 / HZ) - 1) / (1000 / HZ);
+#elif HZ > 1000 && !(HZ % 1000)
+    return m * (HZ / 1000);
+#else
+    return (m * HZ + 999) / 1000;
+#endif
+}
+
+#endif
+
+/*
+ * Provide a 2.4 version of the MODULE_ALIAS() macro.
+ */
+#if !defined(MODULE_ALIAS) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#ifdef MODULE
+#define ___module_cat(a,b)    __mod_ ## a ## b
+#define __module_cat(a,b)    ___module_cat(a,b)
+#define __MODULE_INFO(tag, name, info)                                    \
+static const char __module_cat(name,__LINE__)[]                           \
+  __attribute__((section(".modinfo"),unused)) = __stringify(tag) "=" info
+#define MODULE_ALIAS(_alias)    __MODULE_INFO(alias, alias, _alias)
+#endif
+
+#endif
+
+/*
+ * Provide various definitions required by the blkfront driver under kernel 
2.4.
+ * Compatibility versions of rq_for_each_bio() and bio_for_each_segment() refer
+ * to struct bio and struct bio_vec but use struct buffer_head.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#include <linux/blk.h>
+
+#define SCSI_DISK8_MAJOR     126
+#define GENHD_FL_CD          8
+#define GENHD_FL_VIRT_PARTNS 4
+
+#define blkif_io_lock io_request_lock
+
+#define blk_start_queue
+#define blk_stop_queue
+
+typedef unsigned long sector_t;
+
+#define sector_div(n, b) \
+do {                     \
+    int _res;            \
+    _res = (n) % (b);    \
+    (n) /= (b);          \
+    _res;                \
+} while (0)
+
+
+#define bio buffer_head
+struct bio_vec {
+    struct page *bv_page;
+    unsigned int bv_len;
+    unsigned int bv_offset;
+};
+
+#define rq_for_each_bio(_bio, rq)                                   \
+    if ((rq)->bh)                                                  \
+        for ((_bio) = (rq)->bh; (_bio); (_bio) = (_bio)->b_reqnext)
+
+#define bio_for_each_segment(_biovec, _bio, i)                                 
                               \
+    struct bio_vec _bv;                                                        
                               \
+    (_biovec) = &_bv;                                                          
                               \
+    for ((i) = 0, _bv.bv_page = (_bio)->b_page, _bv.bv_offset = 
bh_offset(_bio), _bv.bv_len = (_bio)->b_size; \
+         (i) < 1;                                                              
                               \
+         (i)++)
+
+static inline struct request * elv_next_request(request_queue_t *rq)
+{
+    if (rq->plugged || list_empty(&rq->queue_head))
+        return NULL;
+
+    return (blkdev_entry_next_request(&rq->queue_head));
+}
+
+static inline void blk_requeue_request(struct request_queue *rq, struct 
request *r)
+{
+    list_add(&r->queue, &rq->queue_head);
+}
+
+#define put_disk(gd)
+
+#endif
+
+/*
+ * Block barriers are not supported under kernel 2.4.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define blk_barrier_rq(req)    0
+#endif
+
+#endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/mkbuildtree
--- a/unmodified_drivers/linux-2.6/mkbuildtree  Mon Dec 17 15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/mkbuildtree  Mon Dec 17 15:54:42 2007 -0500
@@ -35,6 +35,22 @@ ln -sf ${XL}/drivers/xen/core/features.c
 ln -sf ${XL}/drivers/xen/core/features.c platform-pci
 ln -sf ${XL}/drivers/xen/core/xen_proc.c xenbus
 ln -sf ${XL}/drivers/xen/core/reboot.c platform-pci
+
+# The export-objs target for the 2.4 build of platform-pci requires that 
sources
+# listed in that target appear in the same tree in which the module is being
+# built.  That is, references which use relative paths to get to xenbus_*.c
+# (i.e. xenbus/xenbus_xs.c, etc.) do not work under kernel 2.4.  To keep things
+# clean, we are setting up symbolic links from platform-pci to all files needed
+# from under xenbus.  This includes xenbus_xs.c, xenbus_probe.c, 
xenbus_client.c,
+# xen_proc.c, xenbus_comms.c and xenbus_dev.c
+if [ "$2" = "RHEL3-U8-32" ] ; then
+    ln -sf ${XL}/drivers/xen/xenbus/xenbus_xs.c platform-pci
+    ln -sf ${XL}/drivers/xen/xenbus/xenbus_probe.c platform-pci
+    ln -sf ${XL}/drivers/xen/xenbus/xenbus_client.c platform-pci
+    ln -sf ${XL}/drivers/xen/core/xen_proc.c platform-pci
+    ln -sf ${XL}/drivers/xen/xenbus/xenbus_comms.c platform-pci
+    ln -sf ${XL}/drivers/xen/xenbus/xenbus_dev.c platform-pci
+fi
 
 mkdir -p include/asm include/xen
 
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/netfront/K24build
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/netfront/K24build    Mon Dec 17 15:54:42 
2007 -0500
@@ -0,0 +1,8 @@
+O_TARGET := xen-vnif.o
+
+export-objs := netfront.o accel.o
+
+obj-y := netfront.o accel.o
+obj-m := $(O_TARGET)
+
+include $(TOPDIR)/Rules.make
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/netfront/Makefile
--- a/unmodified_drivers/linux-2.6/netfront/Makefile    Mon Dec 17 15:54:42 
2007 -0500
+++ b/unmodified_drivers/linux-2.6/netfront/Makefile    Mon Dec 17 15:54:42 
2007 -0500
@@ -1,3 +1,8 @@ ifneq ($(KERNELRELEASE),)
-ifneq ($(KERNELRELEASE),)
+ifeq ($(VERSION).$(PATCHLEVEL),2.6)
 include $(src)/Kbuild
 endif
+
+ifeq ($(VERSION).$(PATCHLEVEL),2.4)
+include $(M)/overrides.mk
+include K24build
+endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/overrides.mk
--- a/unmodified_drivers/linux-2.6/overrides.mk Mon Dec 17 15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/overrides.mk Mon Dec 17 15:54:42 2007 -0500
@@ -11,4 +11,9 @@ ifeq ($(ARCH),ia64)
   EXTRA_CFLAGS += -DCONFIG_VMX_GUEST
 endif
 
-EXTRA_CFLAGS += -include $(objtree)/include/linux/autoconf.h
+ifeq ($(VERSION).$(PATCHLEVEL),2.4)
+srctree := $(TOPDIR)
+export srctree
+endif
+
+EXTRA_CFLAGS += -include $(srctree)/include/linux/autoconf.h
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/platform-pci/K24build
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/platform-pci/K24build        Mon Dec 17 
15:54:42 2007 -0500
@@ -0,0 +1,29 @@
+include $(M)/overrides.mk
+
+O_TARGET := xen-platform-pci.o
+
+EXTRA_CFLAGS += -I$(M)/platform-pci -I$(M)/xenbus
+
+export-objs := evtchn.o platform-pci.o gnttab.o xen_support.o
+export-objs += features.o platform-compat.o xenbus_xs.o xenbus_probe.o
+export-objs += xenbus_client.o xen_proc.o
+
+obj-y := evtchn.o platform-pci.o gnttab.o xen_support.o
+obj-y += features.o platform-compat.o
+obj-y += reboot.o machine_reboot.o
+
+obj-y += xenbus_comms.o
+obj-y += xenbus_xs.o
+obj-y += xenbus_probe.o
+obj-y += xenbus_dev.o
+obj-y += xenbus_client.o
+obj-y += xen_proc.o
+
+# Can we do better ?
+ifeq ($(ARCH),ia64)
+  obj-y += xcom_mini.o xencomm.o
+endif
+
+obj-m := $(O_TARGET)
+
+include $(TOPDIR)/Rules.make
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/platform-pci/Makefile
--- a/unmodified_drivers/linux-2.6/platform-pci/Makefile        Mon Dec 17 
15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/platform-pci/Makefile        Mon Dec 17 
15:54:42 2007 -0500
@@ -1,3 +1,8 @@ ifneq ($(KERNELRELEASE),)
-ifneq ($(KERNELRELEASE),)
+ifeq ($(VERSION).$(PATCHLEVEL),2.6)
 include $(src)/Kbuild
 endif
+
+ifeq ($(VERSION).$(PATCHLEVEL),2.4)
+include $(M)/overrides.mk
+include K24build
+endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/platform-pci/evtchn.c
--- a/unmodified_drivers/linux-2.6/platform-pci/evtchn.c        Mon Dec 17 
15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/platform-pci/evtchn.c        Mon Dec 17 
15:54:42 2007 -0500
@@ -36,9 +36,7 @@
 #include <xen/features.h>
 #include "platform-pci.h"
 
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
 
 void *shared_info_area;
 
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/platform-pci/platform-compat.c
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-compat.c       Mon Dec 
17 15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-compat.c       Mon Dec 
17 15:54:42 2007 -0500
@@ -5,7 +5,7 @@
 #include <linux/sched.h>
 #include <linux/slab.h>
 
-#include <xen/platform-compat.h>
+#include <xen/kerncompat.h>
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)
 static int system_state = 1;
@@ -141,3 +141,454 @@ char *kasprintf(gfp_t gfp, const char *f
 }
 EXPORT_SYMBOL(kasprintf);
 #endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+/*
+ * Generic device model subsystem does not exist under kernel 2.4.  In order to
+ * allow front end drivers to compile under kernel 2.4, the following code
+ * implements those generic device model APIs which are called in front end
+ * drivers.  Specifically, implemented APIs are: driver_register(),
+ * driver_unregister(), get_device(), put_device(), device_register(),
+ * device_unregister(), bus_for_each_dev(), bus_register(), bus_unregister(),
+ * device_create_file and device_remove_file().  The last two functions are
+ * stubs only.  The one function implemented here which is not a member of
+ * the formal generic device model API is bus_find_device().  This is a local
+ * helper function.  Otherwise, all APIs implemented here have formal 
equivalents
+ * under kernel 2.6.  In the formal implementation of the generic device model
+ * under kernel 2.6, all equivalent APIs are defined in linux/device.h.
+ */
+
+static LIST_HEAD(bus_list);
+
+/*
+ * driver_register()
+ *
+ * Find the bus which this driver wants to be associated with.  For now, bus 
drivers
+ * are not handled because only device drivers are registered.  Once the new 
driver
+ * is registered, walk the list of devices registered with the bus to allow
+ * the driver to assume ownership of devices it can handle.
+ *
+ * A device driver is identified by:
+ * 1. having a drv->bus member which points to an already registered bus
+ *
+ * NOTE: this routine does not pay attention to device's refcount value.
+ *
+ * Arguments:
+ * drv - driver to be registered
+ *
+ * Returns:
+ * 0 - success
+ * 1 - failure
+ */
+int driver_register(struct device_driver *drv)
+{
+       struct list_head *entry;
+       struct bus_type *bus;
+       struct device *dev;
+
+       /* Find a matching bus. */
+       list_for_each(entry, &bus_list) {
+               bus = list_entry(entry, struct bus_type, node);
+
+               if (drv->bus == bus)
+                       /* We found a matching bus. */
+                       break;
+       }
+
+       if (entry == &bus_list) {
+               pr_debug("%s: no matching bus found for driver %p.\n", 
__FUNCTION__,
+                               drv->name == NULL ? "unknown" : drv->name);
+               return 1;
+       }
+
+       /*
+       * OK, we found a match.  Put this driver on bus's driver list and 
initialize
+       * relevant fields in the driver structure.
+       */
+       list_add_tail(&drv->node, &bus->drivers);
+       drv->bus_node = entry;
+
+       /*
+       * Walk the list of devices registered with this bus to allow the new 
driver
+       * to claim ownership of devices it can handle.
+       */
+       list_for_each(entry, &bus->devices) {
+               dev = list_entry(entry, struct device, node);
+
+               /* Skip over the root device and devices which are already 
claimed. */
+               if (!dev->parent || dev->driver)
+                       continue;
+
+               if (bus->match && bus->match(dev, drv)) {
+                       dev->driver = drv;
+
+                       if (drv->probe && drv->probe(dev) == 0)
+                               continue;
+                       else
+                               dev->driver = NULL;
+               }
+       }
+
+       pr_debug("%s: driver %s registered with bus %s.\n", __FUNCTION__,
+                       drv->name == NULL ? "unknown" : drv->name, bus->name);
+
+       return 0;
+}
+
+/*
+ * driver_unregister()
+ *
+ * Find the bus which this driver is associated with and unlink it.  That is:
+ * 1. remove it from bus's driver list
+ * 2. find all devices registered with this bus and remove references to this
+ *     driver
+ *
+ * NOTE: this routine does not pay attention to device's refcount value.
+ *
+ * Arguments:
+ * drv - driver to be unregistered
+ *
+ * Returns:
+ * nothing
+ */
+void driver_unregister(struct device_driver *drv)
+{
+       struct list_head *entry;
+       struct bus_type *bus;
+       struct device *dev;
+
+       /* Find a matching bus. */
+       list_for_each(entry, &bus_list) {
+               bus = list_entry(entry, struct bus_type, node);
+
+               if (drv->bus == bus)
+                       /* We found a matching bus. */
+                       break;
+       }
+
+       if (entry == &bus_list) {
+               pr_debug("%s: no matching bus found for driver %p.\n", 
__FUNCTION__,
+                               drv->name == NULL ? "unknown" : drv->name);
+               return;
+       }
+
+       /* OK, we found a match.  Remove this driver from bus's driver list. */
+       list_del(&drv->node);
+       drv->bus_node = NULL;
+
+       /*
+       * Walk the list of devices registered with this bus and disassociate 
them
+       * with this driver.
+       */
+       list_for_each(entry, &bus->devices) {
+               dev = list_entry(entry, struct device, node);
+
+               /* Skip over the root device. */
+               if (!dev->parent)
+                       continue;
+
+               if (dev->driver == drv) {
+                       if (drv->remove)
+                               drv->remove(dev);
+
+                       dev->driver = NULL;
+               }
+       }
+
+       pr_debug("%s: driver %s unregistered on bus %s.\n", __FUNCTION__,
+                       drv->name == NULL ? "unknown" : drv->name, bus->name);
+
+       return;
+}
+
+struct device * get_device(struct device *dev)
+{
+       atomic_inc(&dev->refcount);
+
+       return dev;
+}
+
+void put_device(struct device *dev)
+{
+       atomic_dec(&dev->refcount);
+
+       return;
+}
+
+/*
+ * device_register()
+ *
+ * Find the bus which this device wants to be associated with and add it to 
this
+ * bus's device list.  Once the new device is registered, walk the list of 
registered
+ * drivers and probe each to allow one to accept ownership of the new device.
+ *
+ * The bus device, that is to say, the one which is always registered along 
with
+ * the bus, is identified by:
+ * 1. having a dev->bus member which is NULL
+ * 2. having a dev->bus_id member which is equal to the bus->name memeber of
+ *     the corresponding bus
+ *
+ * A device which defines something other than a bus is, in turn, identified 
by:
+ * 1. having a dev->bus member which points to an already registered bus.
+ * 2. having a dev->parent member which points to the same bus's device (i.e.
+ *     bus->dev).
+ *
+ * NOTE: this routine does not pay attention to device's refcount value.
+ *
+ * Arguments:
+ * dev - device to be registered
+ *
+ * Returns:
+ * 0 - success
+ * 1 - failure
+ */
+int device_register(struct device *dev)
+{
+       struct list_head *entry;
+       struct bus_type *bus;
+       struct device_driver *drv;
+
+       /* Locate matching bus. */
+       list_for_each(entry, &bus_list) {
+               bus = list_entry(entry, struct bus_type, node);
+
+               if (dev->bus == NULL && (dev->bus_id != NULL && 
strcmp(dev->bus_id, bus->name) == 0))
+                       /* This is a root device and we found a bus for it. */
+                       break;
+
+               if (dev->bus == bus && bus_find_device(bus, dev->parent))
+                       /* This is a non root device and we found a bus for it. 
*/
+                       break;
+       }
+
+       if (entry == &bus_list) {
+               pr_debug("%s: no matching bus found for device %s.\n", 
__FUNCTION__,
+                               dev->bus_id == NULL ? "unknown" : dev->bus_id);
+               return 1;
+       }
+
+       /*
+       * OK, we found a match.  Put this device on bus's device list and 
initialize
+       * relevant fields in the device structure.
+       */
+       list_add_tail(&dev->node, &bus->devices);
+       dev->bus_node = entry;
+
+       /*
+       * Walk the list of drivers registered with this bus to allow the new 
device
+       * to be claimed by one of the drivers.
+       */
+       list_for_each(entry, &bus->drivers) {
+               drv = list_entry(entry, struct device_driver, node);
+
+               if (bus->match && bus->match(dev, drv)) {
+                       dev->driver = drv;
+
+                       if (drv->probe && drv->probe(dev) == 0)
+                               /* Only one driver gets to own this device. */
+                               break;
+                       else
+                               /* Try for another driver. */
+                               dev->driver = NULL;
+               }
+       }
+
+       pr_debug("%s: device %s registered with bus %s.\n", __FUNCTION__,
+                       dev->bus_id == NULL ? "unknown" : dev->bus_id, 
bus->name);
+
+       return 0;
+}
+
+/*
+ * device_unregister()
+ *
+ * Find the bus which this device is associated with and remove it from this 
bus's
+ * device list.  If this device is owned by a driver, call the drivers's remove
+ * handler.  Note that this routine assumes that the root device is never 
unregistered.
+ *
+ * Arguments:
+ * dev - device to be unregistered
+ *
+ * Returns:
+ * nothing
+ */
+void device_unregister(struct device *dev)
+{
+       struct list_head *entry;
+       struct bus_type *bus;
+       struct device_driver *drv;
+
+       /* Locate matching bus. */
+       list_for_each(entry, &bus_list) {
+               bus = list_entry(entry, struct bus_type, node);
+
+               if (dev->bus == bus)
+                       break;
+       }
+
+       if (entry == &bus_list) {
+               pr_debug("%s: no matching bus found for device %s.\n", 
__FUNCTION__,
+                               dev->bus_id == NULL ? "unknown" : dev->bus_id);
+               return;
+       }
+
+       /* Found the matching bus, remove the device. */
+       list_del(&dev->node);
+       dev->bus_node = NULL;
+
+       /* Walk the list of drivers on this bus and make this device disappear. 
*/
+       list_for_each(entry, &bus->drivers) {
+               drv = list_entry(entry, struct device_driver, node);
+
+               if (dev->driver == drv && drv->remove) {
+                       drv->remove(dev);
+
+                       /* Only one driver owns this device. */
+                       break;
+               }
+       }
+
+       pr_debug("%s: device %s unregistered on bus %s.\n", __FUNCTION__,
+                       dev->bus_id == NULL ? "unknown" : dev->bus_id, 
bus->name);
+
+       return;
+}
+
+/*
+ * bus_for_each_dev()
+ *
+ * Execute "fn" for every device on "bus" starting with device "dev" (if it is 
not
+ * NULL) and pass to it data pointed to by "data".
+ *
+ * Arguments:
+ * bus - bus to be searched
+ * dev - device at which to start the search (if not NULL)
+ * data - data to be passed to fn
+ * fn - function to call for every device on the bus.  When this function 
returns
+ *      0, this means we should keep calling.  If it returns 1, we should stop.
+ *
+ * Returns:
+ * 0 - success
+ * 1 - failure
+ */
+int bus_for_each_dev(struct bus_type *bus, struct device *dev, void *data, int 
(*fn)(struct device *, void *))
+{
+       struct list_head *entry;
+       struct device *device;
+       int error;
+
+       /* Find the correct bus. */
+       list_for_each(entry, &bus_list) {
+               if (bus == list_entry(entry, struct bus_type, node))
+                       break;
+       }
+
+       if (entry == &bus_list) {
+               pr_debug("%s: bus %s is not registered.\n", __FUNCTION__,
+                               bus->name == NULL ? "unknown" : bus->name);
+               return 1;
+       }
+
+       /* We found the correct bus.  Now, find the starting device. */
+       if (dev && bus_find_device(bus, dev))
+               entry = &dev->node;
+       else
+               entry = NULL;
+
+       /* Finally, call fn for every device except the root device. */
+       list_for_each(entry, &bus->devices) {
+               device = list_entry(entry, struct device, node);
+
+               if (!device->parent)
+                       continue;
+
+               if ((error=(fn)(device, data)) != 0)
+               return error;
+       }
+
+       return 0;
+}
+
+int bus_find_device(struct bus_type *bus, struct device *device)
+{
+       struct list_head *device_node;
+
+       list_for_each(device_node, &bus->devices) {
+               if (device == list_entry(device_node, struct device, node))
+                       return 1;
+       }
+
+       return 0;
+}
+
+/*
+ * bus_register()
+ *
+ * Register a bus on our local bus list.
+ *
+ * Arguments:
+ * bus - bus to be registered
+ *
+ * Returns:
+ * 0 - success
+ */
+int bus_register(struct bus_type *bus)
+{
+       /* Initialize this bus's driver and device list. */
+       INIT_LIST_HEAD(&bus->drivers);
+       INIT_LIST_HEAD(&bus->devices);
+
+       /* Put the bus into our local bus list. */
+       list_add_tail(&bus->node, &bus_list);
+
+       pr_debug("%s: bus %s registered.\n", __FUNCTION__, bus->name == NULL ? 
"unknown" : bus->name);
+
+       return 0;
+}
+
+/*
+ * bus_unregister()
+ *
+ * Unregister a bus from our local bus list.
+ *
+ * Arguments:
+ * bus - bus to be unregistered
+ *
+ * Returns:
+ * nothing
+ */
+void bus_unregister(struct bus_type *bus)
+{
+       struct list_head *entry;
+       struct bus_type *_bus;
+
+       /* Find a matching bus. */
+       list_for_each(entry, &bus_list) {
+               _bus = list_entry(entry, struct bus_type, node);
+
+               if (_bus == bus)
+                       /* We found a matching bus. */
+                       break;
+       }
+
+       if (entry == &bus_list) {
+               pr_debug("%s: no matching bus found for bus %s.\n", 
__FUNCTION__,
+                               bus->name == NULL ? "unknown" : bus->name);
+       }
+
+       /* OK, we found a match.  Remove this bus from the bus list. */
+       list_del(&bus->node);
+
+       pr_debug("%s: bus %s unregistered.\n", __FUNCTION__, bus->name == NULL 
? "unknown" : bus->name);
+}
+
+int device_create_file(struct device *dev, struct device_attribute *attr)
+{
+       return 0;
+}
+
+void device_remove_file(struct device *dev, struct device_attribute *attr)
+{
+}
+
+#endif
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Mon Dec 17 
15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Mon Dec 17 
15:54:42 2007 -0500
@@ -30,6 +30,7 @@
 #include <linux/interrupt.h>
 #include <linux/vmalloc.h>
 #include <linux/mm.h>
+#include <linux/kthread.h>
 #include <asm/system.h>
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -40,15 +41,14 @@
 #include <xen/interface/hvm/params.h>
 #include <xen/features.h>
 #include <xen/evtchn.h>
+#include <xen/xen_proc.h>
 #ifdef __ia64__
 #include <asm/xen/xencomm.h>
 #endif
 
 #include "platform-pci.h"
 
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
 
 #define DRV_NAME    "xen-platform-pci"
 #define DRV_VERSION "0.10"
diff -r 6349a4bceff8 unmodified_drivers/linux-2.6/platform-pci/xen_support.c
--- a/unmodified_drivers/linux-2.6/platform-pci/xen_support.c   Mon Dec 17 
15:54:42 2007 -0500
+++ b/unmodified_drivers/linux-2.6/platform-pci/xen_support.c   Mon Dec 17 
15:54:42 2007 -0500
@@ -26,9 +26,7 @@
 #include <asm/hypervisor.h>
 #include "platform-pci.h"
 
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
 
 #if defined (__ia64__)
 unsigned long __hypercall(unsigned long a1, unsigned long a2,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH 1/2][PV-on-HVM] Enable Front-end drivers for 2.4 kernels, Ben Guthro <=