diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2015-01-15 10:14:30 +0100 |
---|---|---|
committer | Thomas Hellstrom <thellstrom@vmware.com> | 2015-04-07 02:01:10 -0700 |
commit | d5c1493b5fe0871f4f2823125f0d49f8e1edcda7 (patch) | |
tree | 1ca48cf131491dbea7293ecbb894288ab7f84a02 /tools | |
parent | 1cbbc03c4b37d57760c57bd2e0b0f89d744a5795 (diff) |
vmmouse: Run vmmouse_detect as an io privileged process
Many distros already include patches to do this in various more or less
hackish ways. Since VMware now is about to restrict access to the VMmouse
backdoor, let's try to support it officially.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Acked-by: Sinclair Yeh <syeh@vmware.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/Makefile.am | 2 | ||||
-rw-r--r-- | tools/vmmouse_detect.c | 1 | ||||
-rw-r--r-- | tools/vmmouse_iopl.c | 236 |
3 files changed, 238 insertions, 1 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am index a1396ba..da0e782 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -22,7 +22,7 @@ bin_PROGRAMS = @DRIVER_NAME@_detect AM_CPPFLAGS = -I$(top_srcdir)/shared $(XORG_CFLAGS) -@DRIVER_NAME@_detect_SOURCES = vmmouse_detect.c vmmouse_udev.c +@DRIVER_NAME@_detect_SOURCES = vmmouse_detect.c vmmouse_udev.c vmmouse_iopl.c @DRIVER_NAME@_detect_LDADD = $(top_builddir)/shared/lib@DRIVER_NAME@.la \ @LIBUDEV_LIBS@ @DRIVER_NAME@_detect_CFLAGS = @LIBUDEV_CFLAGS@ diff --git a/tools/vmmouse_detect.c b/tools/vmmouse_detect.c index b743b2d..1d28122 100644 --- a/tools/vmmouse_detect.c +++ b/tools/vmmouse_detect.c @@ -58,6 +58,7 @@ main(void) signal(SIGSEGV, segvCB); #if defined __i386__ || defined __x86_64__ + (void) xf86EnableIO(); if (VMMouseClient_Enable()) { VMMouseClient_Disable(); return 0; diff --git a/tools/vmmouse_iopl.c b/tools/vmmouse_iopl.c new file mode 100644 index 0000000..3b3fc0b --- /dev/null +++ b/tools/vmmouse_iopl.c @@ -0,0 +1,236 @@ +/* + * Copyright 1990, 1991 by Thomas Roell, Dinkelscherben, Germany + * Copyright 1992 by David Dawes <dawes@XFree86.org> + * Copyright 1992 by Jim Tsillas <jtsilla@damon.ccs.northeastern.edu> + * Copyright 1992 by Rich Murphey <Rich@Rice.edu> + * Copyright 1992 by Robert Baron <Robert.Baron@ernst.mach.cs.cmu.edu> + * Copyright 1992 by Orest Zborowski <obz@eskimo.com> + * Copyright 1993 by Vrije Universiteit, The Netherlands + * Copyright 1993 by David Wexelblat <dwex@XFree86.org> + * Copyright 1994, 1996 by Holger Veit <Holger.Veit@gmd.de> + * Copyright 1997 by Takis Psarogiannakopoulos <takis@dpmms.cam.ac.uk> + * Copyright 1994-2003 by The XFree86 Project, Inc + * Copyright 1999 by David Holland <davidh@iquest.net> + * Copyright 2015 by VMware Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the names of the above listed copyright holders + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The above listed + * copyright holders make no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * THE ABOVE LISTED COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDERS BE + * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_XORG_CONFIG_H +#include <xorg-config.h> +#endif + +#include <stdbool.h> + +#if defined(VMMOUSE_OS_BSD) +#define HAVE_WRAPPER_DECLS +#include "xf86_OSlib.h" +#include "xf86OSpriv.h" +#ifdef USE_I386_IOPL +/***************************************************************************/ +/* I/O Permissions section */ +/***************************************************************************/ +static bool ExtendedEnabled = false; + +bool +xf86EnableIO() +{ + if (ExtendedEnabled) + return true; + + if (i386_iopl(1) < 0) + return false; + + ExtendedEnabled = true; + return true; +} + +void +xf86DisableIO() +{ + if (!ExtendedEnabled) + return; + + i386_iopl(0); + + ExtendedEnabled = false; + return; +} + +#endif /* USE_I386_IOPL */ + +#ifdef USE_AMD64_IOPL +/***************************************************************************/ +/* I/O Permissions section */ +/***************************************************************************/ + +static bool ExtendedEnabled = false; + +bool +xf86EnableIO() +{ + if (ExtendedEnabled) + return true; + + if (amd64_iopl(1) < 0) + return false; + + ExtendedEnabled = true; + return true; +} + +void +xf86DisableIO() +{ + if (!ExtendedEnabled) + return; + + if (amd64_iopl(0) == 0) + ExtendedEnabled = false; + + return; +} + +#endif /* USE_AMD64_IOPL */ + +#ifdef USE_DEV_IO +static int IoFd = -1; + +bool +xf86EnableIO() +{ + if (IoFd >= 0) + return true; + + if ((IoFd = open("/dev/io", O_RDWR)) == -1) + return false; + + return true; +} + +void +xf86DisableIO() +{ + if (IoFd < 0) + return; + + close(IoFd); + IoFd = -1; + return; +} +#endif + +#elif defined(VMMOUSE_OS_GENERIC) + +static bool ExtendedEnabled = false; + +extern int ioperm(unsigned long __from, unsigned long __num, int __turn_on); +extern int iopl(int __level); + +bool xf86EnableIO(void) +{ + if (ExtendedEnabled) + return true; + + if (ioperm(0, 1024, 1) || iopl(3)) + return false; + + ExtendedEnabled = true; + return true; +} + +void +xf86DisableIO(void) +{ + if (!ExtendedEnabled) + return; + + iopl(0); + ioperm(0, 1024, 0); + ExtendedEnabled = false; + + return; +} + +#elif defined(VMMOUSE_OS_SOLARIS) + +#ifdef __GNUC__ +#if defined(__sun) && !defined(sun) +#define sun 1 +#endif +#if defined(__SVR4) && !defined(SVR4) +#define SVR4 1 +#endif +#endif +/* + * The below sequence of includes is stolen from Xserver. If it doesn't work + * for your setup, please propose a patch to fix it. + */ +#include <sys/types.h> +#include <errno.h> +#if !(defined (sun) && defined (SVR4)) +#include <sys/immu.h> +#include <sys/region.h> +#include <sys/proc.h> +#endif +#include <sys/tss.h> +#include <sys/sysi86.h> +#if defined(SVR4) && !defined(sun) +#include <sys/seg.h> +#endif /* SVR4 && !sun */ +/* V86SC_IOPL was moved to <sys/sysi86.h> on Solaris 7 and later */ +#if !defined(V86SC_IOPL) /* Solaris 7 or later? */ +#include <sys/v86.h> /* Nope */ +#endif +#if defined(sun) && (defined (__i386__) || defined(__i386) || defined(__x86)) && defined (SVR4) +#include <sys/psw.h> +#endif + +static bool ExtendedEnabled = false; + +bool +xf86EnableIO(void) +{ + if (ExtendedEnabled) + return true; + + if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0) + return false; + + ExtendedEnabled = true; + + return true; +} + +void +xf86DisableIO(void) +{ + if(!ExtendedEnabled) + return; + + sysi86(SI86V86, V86SC_IOPL, 0); + + ExtendedEnabled = false; +} + +#endif |