<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">diff -Nru ati-driver-legacy-13.1.orig/drmP.h ati-driver-legacy-13.1/drmP.h
--- ati-driver-legacy-13.1.orig/drmP.h	2013-01-15 22:33:27.000000000 +0100
+++ ati-driver-legacy-13.1/drmP.h	2013-12-29 18:35:01.088078362 +0100
@@ -901,10 +901,6 @@
 int                   DRM(stub_unregister)(int minor);
 
 				/* Proc support (drm_proc.h) */
-extern struct proc_dir_entry *DRM(proc_init)(drm_device_t *dev,
-					     int minor,
-					     struct proc_dir_entry *root,
-					     struct proc_dir_entry **dev_root);
 extern int            DRM(proc_cleanup)(int minor,
 					struct proc_dir_entry *root,
 					struct proc_dir_entry *dev_root);
diff -Nru ati-driver-legacy-13.1.orig/drmP.h.rej ati-driver-legacy-13.1/drmP.h.rej
--- ati-driver-legacy-13.1.orig/drmP.h.rej	1970-01-01 01:00:00.000000000 +0100
+++ ati-driver-legacy-13.1/drmP.h.rej	2013-12-29 18:35:17.302928770 +0100
@@ -0,0 +1,13 @@
+--- drmP.h	2013-05-15 09:26:23.555752577 +0300
++++ drmP.h	2013-05-16 10:39:17.496212055 +0300
+@@ -901,10 +901,6 @@
+ int                   DRM(stub_unregister)(int minor);
+ 
+ 				/* Proc support (drm_proc.h) */
+-extern struct proc_dir_entry *DRM(proc_init)(drm_device_t *dev,
+-					     int minor,
+-					     struct proc_dir_entry *root,
+-					     struct proc_dir_entry **dev_root);
+ extern int            DRM(proc_cleanup)(int minor,
+ 					struct proc_dir_entry *root,
+ 					struct proc_dir_entry *dev_root);
diff -Nru ati-driver-legacy-13.1.orig/drm_proc.h ati-driver-legacy-13.1/drm_proc.h
--- ati-driver-legacy-13.1.orig/drm_proc.h	2013-01-15 22:33:27.000000000 +0100
+++ ati-driver-legacy-13.1/drm_proc.h	2013-12-29 18:15:36.282155586 +0100
@@ -95,22 +95,35 @@
 	int		      i, j;
 	char                  name[64];
 
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,10,0)
 	if (!minor) root = create_proc_entry("dri", S_IFDIR, NULL);
+#else
+	if (!minor) root = proc_mkdir("dri", NULL);
+#endif
 	if (!root) {
 		DRM_ERROR("Cannot create /proc/ati\n");
 		return NULL;
 	}
 
 	sprintf(name, "%d", minor);
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,10,0)
 	*dev_root = create_proc_entry(name, S_IFDIR, root);
+#else
+	*dev_root = proc_mkdir(name, root);
+#endif
 	if (!*dev_root) {
 		DRM_ERROR("Cannot create /proc/ati/%s\n", name);
 		return NULL;
 	}
 
 	for (i = 0; i &lt; DRM_PROC_ENTRIES; i++) {
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,10,0)
 		ent = create_proc_entry(DRM(proc_list)[i].name,
 					S_IFREG|S_IRUGO, *dev_root);
+#else
+		ent = proc_create_data(DRM(proc_list)[i].name,
+					S_IFREG|S_IRUGO, *dev_root, &amp;firegl_fops, dev);
+#endif
 		if (!ent) {
 			DRM_ERROR("Cannot create /proc/ati/%s/%s\n",
 				  name, DRM(proc_list)[i].name);
@@ -121,8 +134,10 @@
 			if (!minor) remove_proc_entry("dri", NULL);
 			return NULL;
 		}
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,10,0)
 		ent-&gt;read_proc = DRM(proc_list)[i].f;
 		ent-&gt;data      = dev;
+#endif
 	}
 
 	return root;
diff -Nru ati-driver-legacy-13.1.orig/drm_proc.h.rej ati-driver-legacy-13.1/drm_proc.h.rej
--- ati-driver-legacy-13.1.orig/drm_proc.h.rej	1970-01-01 01:00:00.000000000 +0100
+++ ati-driver-legacy-13.1/drm_proc.h.rej	2013-12-29 18:35:18.678916069 +0100
@@ -0,0 +1,64 @@
+--- drm_proc.h	2013-05-15 09:26:23.555752577 +0300
++++ drm_proc.h	2013-05-19 02:16:16.584406160 +0300
+@@ -75,61 +75,6 @@
+ #define DRM_PROC_ENTRIES (sizeof(DRM(proc_list))/sizeof(DRM(proc_list)[0]))
+ 
+ /**
+- * Initialize the DRI proc filesystem for a device.
+- *
+- * \param dev DRM device.
+- * \param minor device minor number.
+- * \param root DRI proc dir entry.
+- * \param dev_root resulting DRI device proc dir entry.
+- * \return root entry pointer on success, or NULL on failure.
+- * 
+- * Create the DRI proc root entry "/proc/ati", the device proc root entry
+- * "/proc/ati/%minor%/", and each entry in proc_list as
+- * "/proc/ati/%minor%/%name%".
+- */
+-struct proc_dir_entry *DRM(proc_init)(drm_device_t *dev, int minor,
+-				      struct proc_dir_entry *root,
+-				      struct proc_dir_entry **dev_root)
+-{
+-	struct proc_dir_entry *ent;
+-	int		      i, j;
+-	char                  name[64];
+-
+-	if (!minor) root = create_proc_entry("dri", S_IFDIR, NULL);
+-	if (!root) {
+-		DRM_ERROR("Cannot create /proc/ati\n");
+-		return NULL;
+-	}
+-
+-	sprintf(name, "%d", minor);
+-	*dev_root = create_proc_entry(name, S_IFDIR, root);
+-	if (!*dev_root) {
+-		DRM_ERROR("Cannot create /proc/ati/%s\n", name);
+-		return NULL;
+-	}
+-
+-	for (i = 0; i &lt; DRM_PROC_ENTRIES; i++) {
+-		ent = create_proc_entry(DRM(proc_list)[i].name,
+-					S_IFREG|S_IRUGO, *dev_root);
+-		if (!ent) {
+-			DRM_ERROR("Cannot create /proc/ati/%s/%s\n",
+-				  name, DRM(proc_list)[i].name);
+-			for (j = 0; j &lt; i; j++)
+-				remove_proc_entry(DRM(proc_list)[i].name,
+-						  *dev_root);
+-			remove_proc_entry(name, root);
+-			if (!minor) remove_proc_entry("dri", NULL);
+-			return NULL;
+-		}
+-		ent-&gt;read_proc = DRM(proc_list)[i].f;
+-		ent-&gt;data      = dev;
+-	}
+-
+-	return root;
+-}
+-
+-
+-/**
+  * Cleanup the proc filesystem resources.
+  *
+  * \param minor device minor number.
diff -Nru ati-driver-legacy-13.1.orig/firegl_public.c ati-driver-legacy-13.1/firegl_public.c
--- ati-driver-legacy-13.1.orig/firegl_public.c	2013-12-29 17:45:51.000000000 +0100
+++ ati-driver-legacy-13.1/firegl_public.c	2013-12-29 18:36:57.951997428 +0100
@@ -573,6 +573,202 @@
     { "NULL",           NULL,                       NULL} // Terminate List!!!
 };
 
+
+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3,10,0)
+typedef int (read_proc_t)(char *page, char **start, off_t off, int count, int *eof, void *data);
+typedef int (write_proc_t)(struct file *file, const char __user *buffer, unsigned long count, void *data);
+#else
+#define PDE_DATA(inode) (PDE((inode))-&gt;data)
+#endif
+
+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3,10,0)
+typedef struct {
+	read_proc_t *read_func;
+	write_proc_t *write_func;
+	void *data;
+} gentoo_proc_wrapper_t;
+
+#define GENTOO_PROC_WRAPPER_OVERFLOW_MAGIC 939750305
+
+static ssize_t gentoo_proc_wrapper_read (struct file *myfile, char __user *buffer, size_t count, loff_t *offset) {
+	int is_eof=0, retval;
+	char *start, *usebuffer=NULL;
+	gentoo_proc_wrapper_t* wrapper_data=(gentoo_proc_wrapper_t*)(myfile-&gt;private_data);
+	if (PAGE_SIZE&lt;*offset) {
+		printk(KERN_ERR "Trying to read beyond 4k on proc\n");
+		return -EIO;
+	}
+	//printk(KERN_NOTICE " call with: dev %p, func %p\n", wrapper_data-&gt;data, wrapper_data-&gt;read_func);
+	
+	usebuffer=kmalloc(2*PAGE_SIZE, GFP_KERNEL);
+	if (!usebuffer)
+		return -ENOMEM;
+	((u32*)usebuffer)[1024]=GENTOO_PROC_WRAPPER_OVERFLOW_MAGIC;
+
+	retval=wrapper_data-&gt;read_func(usebuffer, &amp;start, *offset, count, &amp;is_eof, wrapper_data-&gt;data);
+
+	BUG_ON(GENTOO_PROC_WRAPPER_OVERFLOW_MAGIC != ((u32*)usebuffer)[1024]);
+
+	if (0 &gt; retval)
+	{
+		printk(KERN_ERR "Proc read failed with %d", retval);
+		goto out;
+	}
+
+	if (copy_to_user(buffer, start, retval)) {
+		printk(KERN_NOTICE "copy to user failed in amd drivers proc code\n");
+		retval=-EFAULT;
+		goto out;
+	}
+	*offset+=retval;
+	
+out:
+	if (usebuffer)
+		kfree(usebuffer);
+	return retval;
+}
+static ssize_t gentoo_proc_wrapper_write (struct file *myfile, const char __user *buffer, size_t count, loff_t *offset) {
+	gentoo_proc_wrapper_t* wrapper_data=(gentoo_proc_wrapper_t*)(myfile-&gt;private_data);
+	int retval=0;
+	void *usebuffer=NULL;
+
+	BUG_ON(*offset);
+	if (!wrapper_data-&gt;write_func)
+		return -EPERM;
+	
+	usebuffer=kmalloc(count, GFP_KERNEL);
+	if (!usebuffer)
+		return -ENOMEM;
+	if (copy_from_user(usebuffer, buffer, count)) {
+		printk(KERN_NOTICE "copy from user failed in amd drivers proc code\n");
+		retval=-EFAULT;
+		goto out;
+	}
+	
+	retval=wrapper_data-&gt;write_func(myfile, buffer, count, wrapper_data-&gt;data);
+	*offset+=retval;
+out:
+	if (usebuffer)
+		kfree(usebuffer);
+	return retval;
+}
+static int gentoo_proc_wrapper_open(struct inode *myinode, struct file *myfile) {
+	myfile-&gt;private_data=PDE_DATA(myinode);
+	return generic_file_open(myinode, myfile);
+}
+struct file_operations gentoo_proc_fops = {
+	.read=gentoo_proc_wrapper_read,
+	.write=gentoo_proc_wrapper_write,
+	.open=gentoo_proc_wrapper_open,
+};
+	
+static void *gentoo_proc_wrapper_data(read_proc_t *reader, write_proc_t *writer, void *mydata) {
+	gentoo_proc_wrapper_t *retval=kmalloc(sizeof(gentoo_proc_wrapper_t), GFP_KERNEL);
+	if (!retval)
+		return retval;
+	retval-&gt;read_func=reader;
+	retval-&gt;write_func=writer;
+	retval-&gt;data=mydata;
+	return retval;
+}
+
+static struct proc_dir_entry *firegl_proc_init( device_t *dev,
+                                                int minor,
+                                                struct proc_dir_entry *root,
+                                                struct proc_dir_entry **dev_root,
+                                                kcl_proc_list_t *proc_list ) // proc_list must be terminated!
+{
+    struct proc_dir_entry *ent;
+    char    name[64];
+    kcl_proc_list_t *list = proc_list;
+	void *tempdata;
+    KCL_DEBUG1(FN_FIREGL_PROC, "minor %d, proc_list 0x%08lx\n", minor, (unsigned long)proc_list);
+    if (!minor)
+    {
+        root = proc_mkdir("ati", NULL);
+    }
+
+    if (!root)
+    {
+        KCL_DEBUG_ERROR("Cannot create /proc/ati\n");
+        return NULL;
+    }
+
+    if (minor == 0)
+    {
+        // Global major debice number entry
+		tempdata=gentoo_proc_wrapper_data((read_proc_t*)firegl_major_proc_read, NULL, NULL);
+		if (!tempdata)
+			return NULL;
+        ent = proc_create_data("major", S_IFREG|S_IRUGO, root, &amp;gentoo_proc_fops, tempdata);
+        if (!ent)
+        {
+            remove_proc_entry("ati", NULL);
+            KCL_DEBUG_ERROR("Cannot create /proc/ati/major\n");
+            return NULL;
+        }
+    }
+
+    sprintf(name, "%d", minor);
+    *dev_root = proc_mkdir(name, root);
+    if (!*dev_root) {
+        remove_proc_entry("major", root);
+        remove_proc_entry("ati", NULL);
+        KCL_DEBUG_ERROR("Cannot create /proc/ati/%s\n", name);
+        return NULL;
+    }
+
+    while (list-&gt;f || list-&gt;fops)
+    {
+		struct file_operations *my_fops = &amp;gentoo_proc_fops;
+        if (list-&gt;fops)
+        {
+            my_fops = (struct file_operations*)list-&gt;fops;
+			tempdata=(dev-&gt;pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev);
+        }
+		else {
+			BUG_ON(!list-&gt;f);
+			tempdata=gentoo_proc_wrapper_data((read_proc_t*)list-&gt;f, NULL, (dev-&gt;pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev) );
+			if (!tempdata)
+				return NULL;
+		}
+		//printk(KERN_NOTICE "name %s, dev %p, func %p, data %p\n", list-&gt;name, (dev-&gt;pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev), list-&gt;f, tempdata);
+        ent = proc_create_data(list-&gt;name, S_IFREG|S_IRUGO, *dev_root, my_fops, tempdata);
+
+        if (!ent)
+        {
+            KCL_DEBUG_ERROR("Cannot create /proc/ati/%s/%s\n", name, list-&gt;name);
+            while (proc_list != list)
+            {
+                remove_proc_entry(proc_list-&gt;name, *dev_root);
+                proc_list++;
+            }
+            remove_proc_entry(name, root);
+            if (!minor)
+            {
+                remove_proc_entry("major", root);
+                remove_proc_entry("ati", NULL);
+            }
+            return NULL;
+        }
+
+        list++;
+    }
+
+    if (minor == 0)
+    {
+        // Global debug entry, only create it once
+		tempdata=gentoo_proc_wrapper_data((read_proc_t*)firegl_debug_proc_read_wrap, (write_proc_t*)firegl_debug_proc_write_wrap, dev);
+		if (!tempdata)
+			return NULL;
+        ent=proc_create_data("debug", S_IFREG|S_IRUGO, root, &amp;gentoo_proc_fops, tempdata);
+		if (!ent)
+			return NULL;
+    }
+
+    return root;
+}
+#else
 static struct proc_dir_entry *firegl_proc_init( device_t *dev,
                                                 int minor,
                                                 struct proc_dir_entry *root,
@@ -667,6 +863,7 @@
 
     return root;
 }
+#endif
 
 static int firegl_proc_cleanup( int minor,
                                 struct proc_dir_entry *root,
@@ -2138,6 +2335,12 @@
     }
 }
 
+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3, 5, 0)
+# define NO_DO_MMAP
+# define do_mmap(a,b,c,d,e,f) vm_mmap(a, b, c, d, e, f)
+# define do_munmap(a,b,c) vm_munmap(b, c)
+#endif
+
 unsigned long ATI_API_CALL KCL_MEM_AllocLinearAddrInterval(
                                         KCL_IO_FILE_Handle file,
                                         unsigned long addr,
@@ -2149,10 +2352,13 @@
 
     flags = MAP_SHARED;
     prot  = PROT_READ|PROT_WRITE;
-
+#ifdef NO_DO_MMAP
+    vaddr = (void *) vm_mmap(file, 0, len, prot, flags, pgoff);
+#else
     down_write(&amp;current-&gt;mm-&gt;mmap_sem);
     vaddr = (void *) do_mmap(file, 0, len, prot, flags, pgoff);
     up_write(&amp;current-&gt;mm-&gt;mmap_sem);
+#endif
     if (IS_ERR(vaddr))
        return 0;
     else
@@ -2163,7 +2369,9 @@
 {
     int retcode = 0;
 
+#ifndef NO_DO_MMAP
     down_write(&amp;current-&gt;mm-&gt;mmap_sem);
+#endif
 #ifdef FGL_LINUX_RHEL_MUNMAP_API
     retcode = do_munmap(current-&gt;mm,
                         addr,
@@ -2174,7 +2382,9 @@
                         addr,
                         len);
 #endif                        
+#ifndef NO_DO_MMAP
     up_write(&amp;current-&gt;mm-&gt;mmap_sem);
+#endif
     return retcode;
 }
 
diff -Nru ati-driver-legacy-13.1.orig/firegl_public.c.orig ati-driver-legacy-13.1/firegl_public.c.orig
--- ati-driver-legacy-13.1.orig/firegl_public.c.orig	2013-12-29 17:45:51.000000000 +0100
+++ ati-driver-legacy-13.1/firegl_public.c.orig	2013-12-29 18:35:18.682916033 +0100
@@ -573,6 +573,202 @@
     { "NULL",           NULL,                       NULL} // Terminate List!!!
 };
 
+
+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3,10,0)
+typedef int (read_proc_t)(char *page, char **start, off_t off, int count, int *eof, void *data);
+typedef int (write_proc_t)(struct file *file, const char __user *buffer, unsigned long count, void *data);
+#else
+#define PDE_DATA(inode) (PDE((inode))-&gt;data)
+#endif
+
+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3,10,0)
+typedef struct {
+	read_proc_t *read_func;
+	write_proc_t *write_func;
+	void *data;
+} gentoo_proc_wrapper_t;
+
+#define GENTOO_PROC_WRAPPER_OVERFLOW_MAGIC 939750305
+
+static ssize_t gentoo_proc_wrapper_read (struct file *myfile, char __user *buffer, size_t count, loff_t *offset) {
+	int is_eof=0, retval;
+	char *start, *usebuffer=NULL;
+	gentoo_proc_wrapper_t* wrapper_data=(gentoo_proc_wrapper_t*)(myfile-&gt;private_data);
+	if (PAGE_SIZE&lt;*offset) {
+		printk(KERN_ERR "Trying to read beyond 4k on proc\n");
+		return -EIO;
+	}
+	//printk(KERN_NOTICE " call with: dev %p, func %p\n", wrapper_data-&gt;data, wrapper_data-&gt;read_func);
+	
+	usebuffer=kmalloc(2*PAGE_SIZE, GFP_KERNEL);
+	if (!usebuffer)
+		return -ENOMEM;
+	((u32*)usebuffer)[1024]=GENTOO_PROC_WRAPPER_OVERFLOW_MAGIC;
+
+	retval=wrapper_data-&gt;read_func(usebuffer, &amp;start, *offset, count, &amp;is_eof, wrapper_data-&gt;data);
+
+	BUG_ON(GENTOO_PROC_WRAPPER_OVERFLOW_MAGIC != ((u32*)usebuffer)[1024]);
+
+	if (0 &gt; retval)
+	{
+		printk(KERN_ERR "Proc read failed with %d", retval);
+		goto out;
+	}
+
+	if (copy_to_user(buffer, start, retval)) {
+		printk(KERN_NOTICE "copy to user failed in amd drivers proc code\n");
+		retval=-EFAULT;
+		goto out;
+	}
+	*offset+=retval;
+	
+out:
+	if (usebuffer)
+		kfree(usebuffer);
+	return retval;
+}
+static ssize_t gentoo_proc_wrapper_write (struct file *myfile, const char __user *buffer, size_t count, loff_t *offset) {
+	gentoo_proc_wrapper_t* wrapper_data=(gentoo_proc_wrapper_t*)(myfile-&gt;private_data);
+	int retval=0;
+	void *usebuffer=NULL;
+
+	BUG_ON(*offset);
+	if (!wrapper_data-&gt;write_func)
+		return -EPERM;
+	
+	usebuffer=kmalloc(count, GFP_KERNEL);
+	if (!usebuffer)
+		return -ENOMEM;
+	if (copy_from_user(usebuffer, buffer, count)) {
+		printk(KERN_NOTICE "copy from user failed in amd drivers proc code\n");
+		retval=-EFAULT;
+		goto out;
+	}
+	
+	retval=wrapper_data-&gt;write_func(myfile, buffer, count, wrapper_data-&gt;data);
+	*offset+=retval;
+out:
+	if (usebuffer)
+		kfree(usebuffer);
+	return retval;
+}
+static int gentoo_proc_wrapper_open(struct inode *myinode, struct file *myfile) {
+	myfile-&gt;private_data=PDE_DATA(myinode);
+	return generic_file_open(myinode, myfile);
+}
+struct file_operations gentoo_proc_fops = {
+	.read=gentoo_proc_wrapper_read,
+	.write=gentoo_proc_wrapper_write,
+	.open=gentoo_proc_wrapper_open,
+};
+	
+static void *gentoo_proc_wrapper_data(read_proc_t *reader, write_proc_t *writer, void *mydata) {
+	gentoo_proc_wrapper_t *retval=kmalloc(sizeof(gentoo_proc_wrapper_t), GFP_KERNEL);
+	if (!retval)
+		return retval;
+	retval-&gt;read_func=reader;
+	retval-&gt;write_func=writer;
+	retval-&gt;data=mydata;
+	return retval;
+}
+
+static struct proc_dir_entry *firegl_proc_init( device_t *dev,
+                                                int minor,
+                                                struct proc_dir_entry *root,
+                                                struct proc_dir_entry **dev_root,
+                                                kcl_proc_list_t *proc_list ) // proc_list must be terminated!
+{
+    struct proc_dir_entry *ent;
+    char    name[64];
+    kcl_proc_list_t *list = proc_list;
+	void *tempdata;
+    KCL_DEBUG1(FN_FIREGL_PROC, "minor %d, proc_list 0x%08lx\n", minor, (unsigned long)proc_list);
+    if (!minor)
+    {
+        root = proc_mkdir("ati", NULL);
+    }
+
+    if (!root)
+    {
+        KCL_DEBUG_ERROR("Cannot create /proc/ati\n");
+        return NULL;
+    }
+
+    if (minor == 0)
+    {
+        // Global major debice number entry
+		tempdata=gentoo_proc_wrapper_data((read_proc_t*)firegl_major_proc_read, NULL, NULL);
+		if (!tempdata)
+			return NULL;
+        ent = proc_create_data("major", S_IFREG|S_IRUGO, root, &amp;gentoo_proc_fops, tempdata);
+        if (!ent)
+        {
+            remove_proc_entry("ati", NULL);
+            KCL_DEBUG_ERROR("Cannot create /proc/ati/major\n");
+            return NULL;
+        }
+    }
+
+    sprintf(name, "%d", minor);
+    *dev_root = proc_mkdir(name, root);
+    if (!*dev_root) {
+        remove_proc_entry("major", root);
+        remove_proc_entry("ati", NULL);
+        KCL_DEBUG_ERROR("Cannot create /proc/ati/%s\n", name);
+        return NULL;
+    }
+
+    while (list-&gt;f || list-&gt;fops)
+    {
+		struct file_operations *my_fops = &amp;gentoo_proc_fops;
+        if (list-&gt;fops)
+        {
+            my_fops = (struct file_operations*)list-&gt;fops;
+			tempdata=(dev-&gt;pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev);
+        }
+		else {
+			BUG_ON(!list-&gt;f);
+			tempdata=gentoo_proc_wrapper_data((read_proc_t*)list-&gt;f, NULL, (dev-&gt;pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev) );
+			if (!tempdata)
+				return NULL;
+		}
+		//printk(KERN_NOTICE "name %s, dev %p, func %p, data %p\n", list-&gt;name, (dev-&gt;pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev), list-&gt;f, tempdata);
+        ent = proc_create_data(list-&gt;name, S_IFREG|S_IRUGO, *dev_root, my_fops, tempdata);
+
+        if (!ent)
+        {
+            KCL_DEBUG_ERROR("Cannot create /proc/ati/%s/%s\n", name, list-&gt;name);
+            while (proc_list != list)
+            {
+                remove_proc_entry(proc_list-&gt;name, *dev_root);
+                proc_list++;
+            }
+            remove_proc_entry(name, root);
+            if (!minor)
+            {
+                remove_proc_entry("major", root);
+                remove_proc_entry("ati", NULL);
+            }
+            return NULL;
+        }
+
+        list++;
+    }
+
+    if (minor == 0)
+    {
+        // Global debug entry, only create it once
+		tempdata=gentoo_proc_wrapper_data((read_proc_t*)firegl_debug_proc_read_wrap, (write_proc_t*)firegl_debug_proc_write_wrap, dev);
+		if (!tempdata)
+			return NULL;
+        ent=proc_create_data("debug", S_IFREG|S_IRUGO, root, &amp;gentoo_proc_fops, tempdata);
+		if (!ent)
+			return NULL;
+    }
+
+    return root;
+}
+#else
 static struct proc_dir_entry *firegl_proc_init( device_t *dev,
                                                 int minor,
                                                 struct proc_dir_entry *root,
@@ -667,6 +863,7 @@
 
     return root;
 }
+#endif
 
 static int firegl_proc_cleanup( int minor,
                                 struct proc_dir_entry *root,
@@ -3699,7 +3896,11 @@
                 KCL_DEBUG_ERROR(REMAP_PAGE_RANGE_STR " failed\n");
                 return -EAGAIN;
             }
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
             vma-&gt;vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */
+#else
+            vma-&gt;vm_flags |= VM_SHM | VM_DONTEXPAND | VM_DONTDUMP; /* Don't swap */
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
             vma-&gt;vm_ops = &amp;vm_ops;
 			break;
 
@@ -3729,14 +3930,22 @@
                 KCL_DEBUG_ERROR(REMAP_PAGE_RANGE_STR " failed\n");
                 return -EAGAIN;
             }
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
             vma-&gt;vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */
+#else
+            vma-&gt;vm_flags |= VM_SHM | VM_DONTEXPAND | VM_DONTDUMP; /* Don't swap */
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
             vma-&gt;vm_ops = &amp;vm_ops;
             }
 			break;
 #endif                    
 
         case __KE_SHM:
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
             vma-&gt;vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */
+#else
+            vma-&gt;vm_flags |= VM_SHM | VM_DONTEXPAND | VM_DONTDUMP; /* Don't swap */
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
             vma-&gt;vm_ops = &amp;vm_shm_ops;
             break;
 
@@ -3744,7 +3953,11 @@
 
             pages = (vma-&gt;vm_end - vma-&gt;vm_start) &gt;&gt; PAGE_SHIFT;
 
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
             vma-&gt;vm_flags |= VM_RESERVED;
+#else
+            vma-&gt;vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
 
             //vma-&gt;vm_flags |=  VM_SHM | VM_LOCKED; /* DDDDDDDDDDon't swap */
             //vma-&gt;vm_mm-&gt;locked_vm += pages; /* Kernel tracks aqmount of locked pages */
@@ -3753,14 +3966,22 @@
 
         case __KE_CTX:
             pages = (vma-&gt;vm_end - vma-&gt;vm_start) &gt;&gt; PAGE_SHIFT;
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
             vma-&gt;vm_flags |= VM_LOCKED | VM_SHM | VM_RESERVED; /* Don't swap */
+#else
+            vma-&gt;vm_flags |= VM_LOCKED | VM_SHM | VM_DONTEXPAND | VM_DONTDUMP; /* Don't swap */
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
             vma-&gt;vm_mm-&gt;locked_vm += pages; /* Kernel tracks aqmount of locked pages */
             vma-&gt;vm_ops = &amp;vm_ctx_ops;
             break;
 
         case __KE_PCI_BQS:
             pages = (vma-&gt;vm_end - vma-&gt;vm_start) &gt;&gt; PAGE_SHIFT;
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
             vma-&gt;vm_flags |= VM_LOCKED | VM_SHM | VM_RESERVED; /* Don't swap */
+#else
+            vma-&gt;vm_flags |= VM_LOCKED | VM_SHM | VM_DONTEXPAND | VM_DONTDUMP; /* Don't swap */
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
             vma-&gt;vm_mm-&gt;locked_vm += pages; /* Kernel tracks aqmount of locked pages */
             vma-&gt;vm_ops = &amp;vm_pci_bq_ops;
             break;
@@ -3791,9 +4012,17 @@
                     return -EAGAIN;
                 }
 #ifdef __x86_64__
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
                 vma-&gt;vm_flags |= VM_RESERVED;
 #else
+                vma-&gt;vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
+#else
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
                 vma-&gt;vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */
+#else
+                vma-&gt;vm_flags |= VM_SHM | VM_DONTEXPAND | VM_DONTDUMP; /* Don't swap */
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
 #endif
                 vma-&gt;vm_ops = &amp;vm_ops;
             }
@@ -3822,9 +4051,17 @@
                     return -EAGAIN;
                 }
 #ifdef __x86_64__
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
                 vma-&gt;vm_flags |= VM_RESERVED;
 #else
+                vma-&gt;vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
+#else
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
                 vma-&gt;vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */
+#else
+                vma-&gt;vm_flags |= VM_SHM | VM_DONTEXPAND | VM_DONTDUMP; /* Don't swap */
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
 #endif
                 vma-&gt;vm_ops = &amp;vm_agp_bq_ops;
             }
@@ -3832,7 +4069,11 @@
 #endif /* __AGP__BUILTIN__ */
 
         case __KE_KMAP:
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
 		    vma-&gt;vm_flags |= VM_SHM | VM_RESERVED;
+#else
+		    vma-&gt;vm_flags |= VM_SHM | VM_DONTEXPAND | VM_DONTDUMP;
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
             vma-&gt;vm_ops = &amp;vm_kmap_ops;
             if (readonly &amp;&amp; (vma-&gt;vm_flags &amp; VM_WRITE))
             {
@@ -3853,7 +4094,11 @@
 #endif            
             // fall through
          case __KE_GART_CACHEABLE:
+#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0)
              vma-&gt;vm_flags |= VM_RESERVED;
+#else
+             vma-&gt;vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
+#endif /* LINUX_VERSION_CODE &lt; KERNEL_VERSION(3,7,0) */
              vma-&gt;vm_ops = &amp;vm_gart_ops;
              break;
         default:
</pre></body></html>