]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
x86/xen: allow userspace access during hypercalls
authorMarek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Mon, 26 Jun 2017 12:49:46 +0000 (14:49 +0200)
committerJuergen Gross <jgross@suse.com>
Mon, 3 Jul 2017 11:26:17 +0000 (13:26 +0200)
Userspace application can do a hypercall through /dev/xen/privcmd, and
some for some hypercalls argument is a pointers to user-provided
structure. When SMAP is supported and enabled, hypervisor can't access.
So, lets allow it.

The same applies to HYPERVISOR_dm_op, where additionally privcmd driver
carefully verify buffer addresses.

Cc: stable@vger.kernel.org
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
arch/x86/include/asm/xen/hypercall.h

index 7a4db5fefd15fccf46004370715ebda0d492dc7c..11071fcd630e46a126ed8e17be76c0e16eb759d4 100644 (file)
@@ -43,6 +43,7 @@
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
+#include <asm/smap.h>
 
 #include <xen/interface/xen.h>
 #include <xen/interface/sched.h>
@@ -216,10 +217,12 @@ privcmd_call(unsigned call,
        __HYPERCALL_DECLS;
        __HYPERCALL_5ARG(a1, a2, a3, a4, a5);
 
+       stac();
        asm volatile("call *%[call]"
                     : __HYPERCALL_5PARAM
                     : [call] "a" (&hypercall_page[call])
                     : __HYPERCALL_CLOBBER5);
+       clac();
 
        return (long)__res;
 }
@@ -478,7 +481,11 @@ static inline int
 HYPERVISOR_dm_op(
        domid_t dom, unsigned int nr_bufs, struct xen_dm_op_buf *bufs)
 {
-       return _hypercall3(int, dm_op, dom, nr_bufs, bufs);
+       int ret;
+       stac();
+       ret = _hypercall3(int, dm_op, dom, nr_bufs, bufs);
+       clac();
+       return ret;
 }
 
 static inline void