[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] Don't allow MICROCODE built as a modul



>>> Keir Fraser <Keir.Fraser@xxxxxxxxxxxx> 17.10.06 22:19 >>>
>On 17/10/06 9:20 pm, "S.Ça*lar Onur" <caglar@xxxxxxxxxxxxx> wrote:
>
>> 17 Eki 2006 Sal 22:54 tarihinde, Keir Fraser *unlar* yazm**t*:
>>> That's not fixing the underlying problem. Why would the microcode driver
>>> require sys_munlock()? I'm sure one of the distros would have provided a
>>> patch already if they were seeing this problem.
>> 
>> Hmm, a little google search shows SUSE already has [1], im not sure original
>> author submits or not but here it is [2]
>> 
>> [1] http://lists.opensuse.org/opensuse-commit/2006-04/msg00962.html 
>> [2] http://cekirdek.pardus.org.tr/~caglar/xen-microcode-modular 
>
>Ah yes, that looks sensible. Perhaps if we ask nicely Jan will post it to
>the list with a signed-off-by attribution. :-)

Eliminating the dependency on sys_m{,un}lock as well as the needless use of
static variables.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: sle10-sp1-2006-10-05/arch/i386/kernel/microcode-xen.c
===================================================================
--- sle10-sp1-2006-10-05.orig/arch/i386/kernel/microcode-xen.c  2006-10-05 
12:23:01.000000000 +0200
+++ sle10-sp1-2006-10-05/arch/i386/kernel/microcode-xen.c       2006-10-05 
13:37:27.000000000 +0200
@@ -50,9 +50,6 @@ MODULE_LICENSE("GPL");
 
 /* 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)
 {
@@ -60,21 +57,26 @@ static int microcode_open (struct inode 
 }
 
 
-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;
-       set_xen_guest_handle(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;
+               set_xen_guest_handle(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;
 }
@@ -88,17 +90,9 @@ static ssize_t microcode_write (struct f
                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;
 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.