xserver: Branch 'master' - 5 commits
Keith Packard
keithp at kemper.freedesktop.org
Wed Mar 3 20:07:26 PST 2010
configure.ac | 7 -
dix/events.c | 63 ------------
hw/dmx/examples/xinput.c | 2
hw/xfree86/x86emu/sys.c | 236 ++++++++++++++---------------------------------
4 files changed, 80 insertions(+), 228 deletions(-)
New commits:
commit bbae92795c7eab062e6722c42fa7915e0cee5d69
Author: Matt Turner <mattst88 at gmail.com>
Date: Mon Feb 15 20:08:09 2010 -0500
Replace assembly with generic unaligned access code
Removes Alpha assembly, and probably works around unaligned accesses on
other sensitive platforms.
Signed-off-by: Matt Turner <mattst88 at gmail.com>
Acked-by: Adam Jackson <ajax at redhat.com>
Compiled-by: Tiago Vignatti <tiago.vignatti at nokia.com>
Signed-off-by: Keith Packard <keithp at keithp.com>
diff --git a/hw/xfree86/x86emu/sys.c b/hw/xfree86/x86emu/sys.c
index e15fb09..602b0bb 100644
--- a/hw/xfree86/x86emu/sys.c
+++ b/hw/xfree86/x86emu/sys.c
@@ -48,168 +48,104 @@
#ifndef NO_SYS_HEADERS
#include <string.h>
#endif
-/*------------------------- Global Variables ------------------------------*/
-X86EMU_sysEnv _X86EMU_env; /* Global emulator machine state */
-X86EMU_intrFuncs _X86EMU_intrTab[256];
+# ifndef NO_INLINE
+# ifdef __GNUC__
-/*----------------------------- Implementation ----------------------------*/
-#if defined(__alpha__) || defined(__alpha)
-/* to cope with broken egcs-1.1.2 :-(((( */
-
-#define ALPHA_UALOADS
-/*
- * inline functions to do unaligned accesses
- * from linux/include/asm-alpha/unaligned.h
- */
-
-/*
- * EGCS 1.1 knows about arbitrary unaligned loads. Define some
- * packed structures to talk about such things with.
- */
-
-#if defined(__GNUC__)
-struct __una_u64 { unsigned long x __attribute__((packed)); };
-struct __una_u32 { unsigned int x __attribute__((packed)); };
-struct __una_u16 { unsigned short x __attribute__((packed)); };
-#endif
+/* Define some packed structures to use with unaligned accesses */
+
+struct __una_u64 { u64 x __attribute__((packed)); };
+struct __una_u32 { u32 x __attribute__((packed)); };
+struct __una_u16 { u16 x __attribute__((packed)); };
-static __inline__ unsigned long ldq_u(unsigned long * r11)
+/* Elemental unaligned loads */
+
+static __inline__ u64 ldq_u(u64 *p)
{
-#if defined(__GNUC__)
- const struct __una_u64 *ptr = (const struct __una_u64 *) r11;
+ const struct __una_u64 *ptr = (const struct __una_u64 *) p;
return ptr->x;
-#else
- unsigned long r1,r2;
- __asm__("ldq_u %0,%3\n\t"
- "ldq_u %1,%4\n\t"
- "extql %0,%2,%0\n\t"
- "extqh %1,%2,%1"
- :"=&r" (r1), "=&r" (r2)
- :"r" (r11),
- "m" (*r11),
- "m" (*(const unsigned long *)(7+(char *) r11)));
- return r1 | r2;
-#endif
}
-static __inline__ unsigned long ldl_u(unsigned int * r11)
+static __inline__ u32 ldl_u(u32 *p)
{
-#if defined(__GNUC__)
- const struct __una_u32 *ptr = (const struct __una_u32 *) r11;
+ const struct __una_u32 *ptr = (const struct __una_u32 *) p;
return ptr->x;
-#else
- unsigned long r1,r2;
- __asm__("ldq_u %0,%3\n\t"
- "ldq_u %1,%4\n\t"
- "extll %0,%2,%0\n\t"
- "extlh %1,%2,%1"
- :"=&r" (r1), "=&r" (r2)
- :"r" (r11),
- "m" (*r11),
- "m" (*(const unsigned long *)(3+(char *) r11)));
- return r1 | r2;
-#endif
}
-static __inline__ unsigned long ldw_u(unsigned short * r11)
+static __inline__ u16 ldw_u(u16 *p)
{
-#if defined(__GNUC__)
- const struct __una_u16 *ptr = (const struct __una_u16 *) r11;
+ const struct __una_u16 *ptr = (const struct __una_u16 *) p;
return ptr->x;
-#else
- unsigned long r1,r2;
- __asm__("ldq_u %0,%3\n\t"
- "ldq_u %1,%4\n\t"
- "extwl %0,%2,%0\n\t"
- "extwh %1,%2,%1"
- :"=&r" (r1), "=&r" (r2)
- :"r" (r11),
- "m" (*r11),
- "m" (*(const unsigned long *)(1+(char *) r11)));
- return r1 | r2;
-#endif
}
-/*
- * Elemental unaligned stores
- */
+/* Elemental unaligned stores */
-static __inline__ void stq_u(unsigned long r5, unsigned long * r11)
+static __inline__ void stq_u(u64 val, u64 *p)
{
-#if defined(__GNUC__)
- struct __una_u64 *ptr = (struct __una_u64 *) r11;
- ptr->x = r5;
-#else
- unsigned long r1,r2,r3,r4;
-
- __asm__("ldq_u %3,%1\n\t"
- "ldq_u %2,%0\n\t"
- "insqh %6,%7,%5\n\t"
- "insql %6,%7,%4\n\t"
- "mskqh %3,%7,%3\n\t"
- "mskql %2,%7,%2\n\t"
- "bis %3,%5,%3\n\t"
- "bis %2,%4,%2\n\t"
- "stq_u %3,%1\n\t"
- "stq_u %2,%0"
- :"=m" (*r11),
- "=m" (*(unsigned long *)(7+(char *) r11)),
- "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4)
- :"r" (r5), "r" (r11));
-#endif
+ struct __una_u64 *ptr = (struct __una_u64 *) p;
+ ptr->x = val;
}
-static __inline__ void stl_u(unsigned long r5, unsigned int * r11)
+static __inline__ void stl_u(u32 val, u32 *p)
{
-#if defined(__GNUC__)
- struct __una_u32 *ptr = (struct __una_u32 *) r11;
- ptr->x = r5;
-#else
- unsigned long r1,r2,r3,r4;
-
- __asm__("ldq_u %3,%1\n\t"
- "ldq_u %2,%0\n\t"
- "inslh %6,%7,%5\n\t"
- "insll %6,%7,%4\n\t"
- "msklh %3,%7,%3\n\t"
- "mskll %2,%7,%2\n\t"
- "bis %3,%5,%3\n\t"
- "bis %2,%4,%2\n\t"
- "stq_u %3,%1\n\t"
- "stq_u %2,%0"
- :"=m" (*r11),
- "=m" (*(unsigned long *)(3+(char *) r11)),
- "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4)
- :"r" (r5), "r" (r11));
-#endif
+ struct __una_u32 *ptr = (struct __una_u32 *) p;
+ ptr->x = val;
}
-static __inline__ void stw_u(unsigned long r5, unsigned short * r11)
+static __inline__ void stw_u(u16 val, u16 *p)
{
-#if defined(__GNUC__)
- struct __una_u16 *ptr = (struct __una_u16 *) r11;
- ptr->x = r5;
-#else
- unsigned long r1,r2,r3,r4;
-
- __asm__("ldq_u %3,%1\n\t"
- "ldq_u %2,%0\n\t"
- "inswh %6,%7,%5\n\t"
- "inswl %6,%7,%4\n\t"
- "mskwh %3,%7,%3\n\t"
- "mskwl %2,%7,%2\n\t"
- "bis %3,%5,%3\n\t"
- "bis %2,%4,%2\n\t"
- "stq_u %3,%1\n\t"
- "stq_u %2,%0"
- :"=m" (*r11),
- "=m" (*(unsigned long *)(1+(char *) r11)),
- "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4)
- :"r" (r5), "r" (r11));
-#endif
+ struct __una_u16 *ptr = (struct __una_u16 *) p;
+ ptr->x = val;
+}
+# else /* !__GNUC__ */
+
+static __inline__ u64 ldq_u(u64 *p)
+{
+ u64 ret;
+ memmove(&ret, p, sizeof(*p));
+ return ret;
}
-#endif
+
+static __inline__ u32 ldl_u(u32 *p)
+{
+ u32 ret;
+ memmove(&ret, p, sizeof(*p));
+ return ret;
+}
+
+static __inline__ u16 ldw_u(u16 *p)
+{
+ u16 ret;
+ memmove(&ret, p, sizeof(*p));
+ return ret;
+}
+
+static __inline__ void stq_u(u64 val, u64 *p)
+{
+ u64 tmp = val;
+ memmove(p, &tmp, sizeof(*p));
+}
+
+static __inline__ void stl_u(u32 val, u32 *p)
+{
+ u32 tmp = val;
+ memmove(p, &tmp, sizeof(*p));
+}
+
+static __inline__ void stw_u(u16 val, u16 *p)
+{
+ u16 tmp = val;
+ memmove(p, &tmp, sizeof(*p));
+}
+
+# endif /* __GNUC__ */
+# endif /* NO_INLINE */
+/*------------------------- Global Variables ------------------------------*/
+
+X86EMU_sysEnv _X86EMU_env; /* Global emulator machine state */
+X86EMU_intrFuncs _X86EMU_intrTab[256];
+
+/*----------------------------- Implementation ----------------------------*/
/****************************************************************************
PARAMETERS:
@@ -262,13 +198,7 @@ u16 X86API rdw(
}
else
#endif
-#if defined(ALPHA_UALOADS)
val = ldw_u((u16*)(M.mem_base + addr));
-#elif defined(IA64_UALOADS)
- val = uldw((u16*)(M.mem_base + addr));
-#else
- val = *(u16*)(M.mem_base + addr);
-#endif
DB( if (DEBUG_MEM_TRACE())
printk("%#08x 2 -> %#x\n", addr, val);)
return val;
@@ -301,13 +231,7 @@ u32 X86API rdl(
}
else
#endif
-#if defined(ALPHA_UALOADS)
val = ldl_u((u32*)(M.mem_base + addr));
-#elif defined(IA64_UALOADS)
- val = uldl((u32*)(M.mem_base + addr));
-#else
- val = *(u32*)(M.mem_base + addr);
-#endif
DB( if (DEBUG_MEM_TRACE())
printk("%#08x 4 -> %#x\n", addr, val);)
return val;
@@ -359,13 +283,7 @@ DB( if (DEBUG_MEM_TRACE())
}
else
#endif
-#if defined(ALPHA_UALOADS)
stw_u(val,(u16*)(M.mem_base + addr));
-#elif defined(IA64_UALOADS)
- ustw(val,(u16*)(M.mem_base + addr));
-#else
- *(u16*)(M.mem_base + addr) = val;
-#endif
}
/****************************************************************************
@@ -395,13 +313,7 @@ DB( if (DEBUG_MEM_TRACE())
}
else
#endif
-#if defined(ALPHA_UALOADS)
stl_u(val,(u32*)(M.mem_base + addr));
-#elif defined(IA64_UALOADS)
- ustl(val,(u32*)(M.mem_base + addr));
-#else
- *(u32*)(M.mem_base + addr) = val;
-#endif
}
/****************************************************************************
commit 1c2abec479cfbac9aeadc121af0825d368317658
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date: Fri Feb 26 11:44:17 2010 +1000
configure: move SELINUX_LIBS to XSERVER_SYS_LIBS
All ddxs require linking against selinux if enabled.
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>
Reviewed-by: Eamon Walsh <ewalsh at tycho.nsa.gov>
Signed-off-by: Keith Packard <keithp at keithp.com>
diff --git a/configure.ac b/configure.ac
index 7d6944d..0579551 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1432,7 +1432,7 @@ PKG_CHECK_MODULES([XSERVERLIBS], [$REQUIRED_LIBS])
#
XSERVER_CFLAGS="${XSERVER_CFLAGS} ${XSERVERCFLAGS_CFLAGS}"
XSERVER_LIBS="$DIX_LIB $CONFIG_LIB $MI_LIB $OS_LIB"
-XSERVER_SYS_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS}"
+XSERVER_SYS_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS} ${SELINUX_LIBS}"
AC_SUBST([XSERVER_LIBS])
AC_SUBST([XSERVER_SYS_LIBS])
@@ -1580,7 +1580,7 @@ if test "x$XORG" = xyes; then
AC_CHECK_FUNCS([pci_device_vgaarb_init])
LIBS=$SAVE_LIBS
CFLAGS=$SAVE_CFLAGS
- XORG_SYS_LIBS="$XORG_SYS_LIBS $PCIACCESS_LIBS $GLX_SYS_LIBS $SELINUX_LIBS"
+ XORG_SYS_LIBS="$XORG_SYS_LIBS $PCIACCESS_LIBS $GLX_SYS_LIBS"
XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS"
case $host_os in
commit cab99b947c66a42dbf8a906bdb02e23aa7cab519
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date: Fri Feb 26 11:41:38 2010 +1000
configure: move libselinux requirement up to the common section.
Let's have all version-specific requirements in one block.
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>
Reviewed-by: Eamon Walsh <ewalsh at tycho.nsa.gov>
Signed-off-by: Keith Packard <keithp at keithp.com>
diff --git a/configure.ac b/configure.ac
index b9c7574..7d6944d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -786,6 +786,7 @@ LIBXTST="xtst >= 1.0.99.2"
LIBPCIACCESS="pciaccess >= 0.8.0"
LIBGLIB="glib-2.0 >= 2.16"
LIBUDEV="libudev >= 143"
+LIBSELINUX="libselinux >= 2.0.86"
if test "x$CONFIG_UDEV" = xyes &&
{ test "x$CONFIG_DBUS_API" = xyes || test "x$CONFIG_HAL" = xyes; }; then
@@ -1058,7 +1059,7 @@ if test "x$XSELINUX" = xyes; then
fi
AC_CHECK_HEADERS([libaudit.h], [], AC_MSG_ERROR([SELinux extension requires audit system headers]))
AC_CHECK_LIB(audit, audit_open, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
- PKG_CHECK_MODULES([SELINUX], [libselinux >= 2.0.86])
+ PKG_CHECK_MODULES([SELINUX], $LIBSELINUX)
SELINUX_LIBS="$SELINUX_LIBS -laudit"
AC_DEFINE(XSELINUX, 1, [Build SELinux extension])
fi
commit 9e7b6e565f6e69f20002bf03ed05fe8b63f86924
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date: Fri Feb 26 10:14:00 2010 +1000
dmx: fix OsAbort()-related build error in examples/xinput.c
5b9a52be7e975e59e0bbc6b43539ecaff96b2ecd changed the server to use OsAbort()
instead of abort(). xinput in dmx is a client program though and fails to
link if it tries to use OsAbort(). Switch it back to using abort().
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Reviewed-by: Fernando Carrijo <fcarrijo at yahoo.com.br>
Reviewed-by: Julien Cristau <jcristau at debian.org>
Reviewed-by: Rami Ylimaki <ext-rami.ylimaki at nokia.com>
Signed-off-by: Keith Packard <keithp at keithp.com>
diff --git a/hw/dmx/examples/xinput.c b/hw/dmx/examples/xinput.c
index 7421be3..b12daf2 100644
--- a/hw/dmx/examples/xinput.c
+++ b/hw/dmx/examples/xinput.c
@@ -233,7 +233,7 @@ int main(int argc, char **argv)
int total = 0;
#define ADD(type) \
- if (cnt >= MAX_EVENTS) OsAbort(); \
+ if (cnt >= MAX_EVENTS) abort(); \
names[cnt] = #type; \
type(dev, event_type[cnt], event_list[cnt]); \
if (event_type[cnt]) ++cnt
commit cf72b5437d2d620521279077a29c5df6d0fbb576
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date: Thu Feb 25 12:49:21 2010 +1000
dix: Use DeliverGrabbedEvent for implicit passive grabs (#25400)
A client requesting a GrabModeSync button grab, owner-events true, with only
the ButtonRelease mask set would never receive the press event even if the
grab window had the ButtonPress mask set.
The protocol requires that if owner-events is true, then the delivery mask
is the combination of the grab mask + the window event mask.
DeliverGrabbedEvents does this already for us, checking first the delivery
based on owner_events and then based on the grab mask. AFAICT, the device
cannot enter the states FREEZE_BOTH_NEXT_EVENT or FREEZE_NEXT_EVENT that
would be handled by DGE in any possible path here.
Bonus point - CheckPassiveGrabsOnWindows suddenly becomes a lot lesss
complicated.
X.Org Bug 25400 <http://bugs.freedesktop.org/show_bug.cgi?id=25400>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Reviewed-by: Keith Packard <keithp at keithp.com>
Signed-off-by: Keith Packard <keithp at keithp.com>
diff --git a/dix/events.c b/dix/events.c
index 8af8c5a..1611f7d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3462,7 +3462,6 @@ CheckPassiveGrabsOnWindow(
{
DeviceIntPtr gdev;
XkbSrvInfoPtr xkbi = NULL;
- Mask mask = 0;
gdev= grab->modifierDevice;
if (grab->grabtype == GRABTYPE_CORE)
@@ -3515,10 +3514,6 @@ CheckPassiveGrabsOnWindow(
(grab->confineTo->realized &&
BorderSizeNotEmpty(device, grab->confineTo))))
{
- int rc, count = 0;
- xEvent *xE = NULL;
- xEvent core;
-
event->corestate &= 0x1f00;
event->corestate |= tempGrab.modifiersDetail.exact & (~0x1f00);
grabinfo = &device->deviceGrab;
@@ -3565,62 +3560,8 @@ CheckPassiveGrabsOnWindow(
}
- if (match & CORE_MATCH)
- {
- rc = EventToCore((InternalEvent*)event, &core);
- if (rc != Success)
- {
- if (rc != BadMatch)
- ErrorF("[dix] %s: core conversion failed in CPGFW "
- "(%d, %d).\n", device->name, event->type, rc);
- continue;
- }
- xE = &core;
- count = 1;
- mask = grab->eventMask;
- } else if (match & XI2_MATCH)
- {
- rc = EventToXI2((InternalEvent*)event, &xE);
- if (rc != Success)
- {
- if (rc != BadMatch)
- ErrorF("[dix] %s: XI2 conversion failed in CPGFW "
- "(%d, %d).\n", device->name, event->type, rc);
- continue;
- }
- count = 1;
-
- /* FIXME: EventToXI2 returns NULL for enter events, so
- * dereferencing the event is bad. Internal event types are
- * aligned with core events, so the else clause is valid.
- * long-term we should use internal events for enter/focus
- * as well */
- if (xE)
- mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8];
- else if (event->type == XI_Enter || event->type == XI_FocusIn)
- mask = grab->xi2mask[device->id][event->type/8];
- } else
- {
- rc = EventToXI((InternalEvent*)event, &xE, &count);
- if (rc != Success)
- {
- if (rc != BadMatch)
- ErrorF("[dix] %s: XI conversion failed in CPGFW "
- "(%d, %d).\n", device->name, event->type, rc);
- continue;
- }
- mask = grab->eventMask;
- }
-
(*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);
-
- if (xE)
- {
- FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
-
- TryClientEvents(rClient(grab), device, xE, count, mask,
- GetEventFilter(device, xE), grab);
- }
+ DeliverGrabbedEvent((InternalEvent*)event, device, FALSE);
if (grabinfo->sync.state == FROZEN_NO_EVENT)
{
@@ -3630,8 +3571,6 @@ CheckPassiveGrabsOnWindow(
grabinfo->sync.state = FROZEN_WITH_EVENT;
}
- if (match & (XI_MATCH | XI2_MATCH))
- xfree(xE); /* on core match xE == &core */
return TRUE;
}
}
More information about the xorg-commit
mailing list