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(µcode_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