SOURCES (LINUX_2_6_16): xen-3.0-2.6.16.patch - fixed microcode-xen...

qboosh qboosh at pld-linux.org
Sun Apr 22 18:51:18 CEST 2007


Author: qboosh                       Date: Sun Apr 22 16:51:18 2007 GMT
Module: SOURCES                       Tag: LINUX_2_6_16
---- Log message:
- fixed microcode-xen (invalid user data access, unresolved symbols on x86_64)

---- Files affected:
SOURCES:
   xen-3.0-2.6.16.patch (1.1.2.2.2.4 -> 1.1.2.2.2.5) 

---- Diffs:

================================================================
Index: SOURCES/xen-3.0-2.6.16.patch
diff -u SOURCES/xen-3.0-2.6.16.patch:1.1.2.2.2.4 SOURCES/xen-3.0-2.6.16.patch:1.1.2.2.2.5
--- SOURCES/xen-3.0-2.6.16.patch:1.1.2.2.2.4	Sun Apr 22 18:31:58 2007
+++ SOURCES/xen-3.0-2.6.16.patch	Sun Apr 22 18:51:13 2007
@@ -7445,7 +7445,7 @@
 diff -durN -x '*~' -x '*.orig' -x '*.rej' linux-2.6.16.orig/arch/i386/kernel/microcode-xen.c linux-2.6.16/arch/i386/kernel/microcode-xen.c
 --- linux-2.6.16.orig/arch/i386/kernel/microcode-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.16/arch/i386/kernel/microcode-xen.c	2006-06-26 09:51:32.000000000 +0200
-@@ -0,0 +1,165 @@
+@@ -0,0 +1,159 @@
 +/*
 + *	Intel CPU Microcode Update Driver for Linux
 + *
@@ -7499,30 +7499,32 @@
 +/* no concurrent ->write()s are allowed on /dev/cpu/microcode */
 +static DECLARE_MUTEX(microcode_sem);
 +
-+static void __user *user_buffer;	/* user area microcode data buffer */
-+static unsigned int user_buffer_size;	/* it's size */
-+				
 +static int microcode_open (struct inode *unused1, struct file *unused2)
 +{
 +	return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
 +}
 +
 +
-+static int do_microcode_update (void)
++static int do_microcode_update (const void __user *ubuf, size_t len)
 +{
 +	int err;
-+	dom0_op_t op;
++	void *kbuf;
 +
-+	err = sys_mlock((unsigned long)user_buffer, user_buffer_size);
-+	if (err != 0)
-+		return err;
-+
-+	op.cmd = DOM0_MICROCODE;
-+	op.u.microcode.data = user_buffer;
-+	op.u.microcode.length = user_buffer_size;
-+	err = HYPERVISOR_dom0_op(&op);
++	kbuf = vmalloc(len);
++	if (!kbuf)
++		return -ENOMEM
++
++	if (copy_from_user(kbuf, ubuf, len) == 0) {
++		dom0_op_t op;
++
++		op.cmd = DOM0_MICROCODE;
++		op.u.microcode.data = kbuf;
++		op.u.microcode.length = len;
++		err = HYPERVISOR_dom0_op(&op);
++	} else
++		err = -EFAULT;
 +
-+	(void)sys_munlock((unsigned long)user_buffer, user_buffer_size);
++	vfree(kbuf);
 +
 +	return err;
 +}
@@ -7536,17 +7538,9 @@
 +		return -EINVAL;
 +	}
 +
-+	if ((len >> PAGE_SHIFT) > num_physpages) {
-+		printk(KERN_ERR "microcode: too much data (max %ld pages)\n", num_physpages);
-+		return -EINVAL;
-+	}
-+
 +	down(&microcode_sem);
 +
-+	user_buffer = (void __user *) buf;
-+	user_buffer_size = (int) len;
-+
-+	ret = do_microcode_update();
++	ret = do_microcode_update(buf, len);
 +	if (!ret)
 +		ret = (ssize_t)len;
 +
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/SOURCES/xen-3.0-2.6.16.patch?r1=1.1.2.2.2.4&r2=1.1.2.2.2.5&f=u



More information about the pld-cvs-commit mailing list