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

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

To: "Keir Fraser" <Keir.Fraser@xxxxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxx>,<caglar@xxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] Don't allow MICROCODE built as a modul
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Wed, 18 Oct 2006 09:44:05 +0100
Delivery-date: Wed, 18 Oct 2006 01:43:14 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <C15AF963.2A88%Keir.Fraser@xxxxxxxxxxxx>
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>
References: <200610172320.11387.caglar@xxxxxxxxxxxxx> <C15AF963.2A88%Keir.Fraser@xxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
>>> 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

<Prev in Thread] Current Thread [Next in Thread>