aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2013-11-14 08:33:57 +0100
committermarha <marha@users.sourceforge.net>2013-11-14 08:33:57 +0100
commitcb9ef04f0bb4cc87787a113f61fcfa7c4818b29b (patch)
tree91ed73daada51bddd5652fd847f30b3593ecff04
parent6d8fefe38077f4d532c256e79cfcaf2a46c5269d (diff)
parent8fbb807d1029b012d2f45cb0f3ea0c6a6ebded6d (diff)
downloadvcxsrv-cb9ef04f0bb4cc87787a113f61fcfa7c4818b29b.tar.gz
vcxsrv-cb9ef04f0bb4cc87787a113f61fcfa7c4818b29b.tar.bz2
vcxsrv-cb9ef04f0bb4cc87787a113f61fcfa7c4818b29b.zip
Merge remote-tracking branch 'origin/released'
* origin/released: mesa xserver pixman git update 9 nov 2013 Conflicts: mesalib/src/mesa/drivers/dri/common/dri_util.c xorg-server/Xext/shm.c
-rw-r--r--gl/internal/dri_interface.h12
-rw-r--r--mesalib/include/GL/internal/dri_interface.h12
-rw-r--r--mesalib/src/mesa/drivers/common/meta.c5
-rw-r--r--mesalib/src/mesa/drivers/dri/common/dri_util.c1
-rw-r--r--mesalib/src/mesa/main/arrayobj.c29
-rw-r--r--mesalib/src/mesa/main/mtypes.h6
-rw-r--r--mesalib/src/mesa/main/varray.c10
-rw-r--r--mesalib/src/mesa/main/varray.h15
-rw-r--r--pixman/pixman/pixman-x86.c2
-rw-r--r--xorg-server/Xext/shm.c51
-rw-r--r--xorg-server/Xext/shmint.h22
-rw-r--r--xorg-server/configure.ac118
-rw-r--r--xorg-server/hw/xfree86/common/xf86Bus.c5
-rw-r--r--xorg-server/hw/xfree86/x86emu/decode.c10
-rw-r--r--xorg-server/hw/xfree86/x86emu/x86emu/regs.h9
-rw-r--r--xorg-server/hw/xfree86/x86emu/x86emu/x86emui.h12
-rw-r--r--xorg-server/hw/xquartz/X11Controller.m2
-rw-r--r--xorg-server/hw/xquartz/bundle/Info.plist.cpp4
-rw-r--r--xorg-server/include/Makefile.am1
-rw-r--r--xorg-server/include/busfault.h48
-rw-r--r--xorg-server/include/dix-config.h.in14
-rw-r--r--xorg-server/include/dixstruct.h4
-rw-r--r--xorg-server/include/os.h2
-rw-r--r--xorg-server/include/protocol-versions.h4
-rw-r--r--xorg-server/include/xorg-config.h.in3
-rw-r--r--xorg-server/include/xorg-server.h.in3
-rw-r--r--xorg-server/mi/miinitext.c2
-rw-r--r--xorg-server/os/Makefile.am5
-rw-r--r--xorg-server/os/WaitFor.c5
-rw-r--r--xorg-server/os/busfault.c150
-rw-r--r--xorg-server/os/io.c4
-rw-r--r--xorg-server/os/osinit.c5
-rw-r--r--xorg-server/present/present.c16
-rw-r--r--xorg-server/record/record.c4
34 files changed, 502 insertions, 93 deletions
diff --git a/gl/internal/dri_interface.h b/gl/internal/dri_interface.h
index ed6142028..89b559b4e 100644
--- a/gl/internal/dri_interface.h
+++ b/gl/internal/dri_interface.h
@@ -787,12 +787,6 @@ typedef __DRIdrawable *
void *loaderPrivate);
typedef __DRIcontext *
-(*__DRIcreateNewContextFunc)(__DRIscreen *screen,
- const __DRIconfig *config,
- __DRIcontext *shared,
- void *loaderPrivate);
-
-typedef __DRIcontext *
(*__DRIcreateContextAttribsFunc)(__DRIscreen *screen,
int api,
const __DRIconfig *config,
@@ -953,7 +947,10 @@ struct __DRIdri2ExtensionRec {
void *loaderPrivate);
__DRIcreateNewDrawableFunc createNewDrawable;
- __DRIcreateNewContextFunc createNewContext;
+ __DRIcontext *(*createNewContext)(__DRIscreen *screen,
+ const __DRIconfig *config,
+ __DRIcontext *shared,
+ void *loaderPrivate);
/* Since version 2 */
__DRIgetAPIMaskFunc getAPIMask;
@@ -1409,7 +1406,6 @@ struct __DRIimageDriverExtensionRec {
/* Common DRI functions, shared with DRI2 */
__DRIcreateNewScreen2Func createNewScreen2;
__DRIcreateNewDrawableFunc createNewDrawable;
- __DRIcreateNewContextFunc createNewContext;
__DRIcreateContextAttribsFunc createContextAttribs;
__DRIgetAPIMaskFunc getAPIMask;
};
diff --git a/mesalib/include/GL/internal/dri_interface.h b/mesalib/include/GL/internal/dri_interface.h
index ed6142028..89b559b4e 100644
--- a/mesalib/include/GL/internal/dri_interface.h
+++ b/mesalib/include/GL/internal/dri_interface.h
@@ -787,12 +787,6 @@ typedef __DRIdrawable *
void *loaderPrivate);
typedef __DRIcontext *
-(*__DRIcreateNewContextFunc)(__DRIscreen *screen,
- const __DRIconfig *config,
- __DRIcontext *shared,
- void *loaderPrivate);
-
-typedef __DRIcontext *
(*__DRIcreateContextAttribsFunc)(__DRIscreen *screen,
int api,
const __DRIconfig *config,
@@ -953,7 +947,10 @@ struct __DRIdri2ExtensionRec {
void *loaderPrivate);
__DRIcreateNewDrawableFunc createNewDrawable;
- __DRIcreateNewContextFunc createNewContext;
+ __DRIcontext *(*createNewContext)(__DRIscreen *screen,
+ const __DRIconfig *config,
+ __DRIcontext *shared,
+ void *loaderPrivate);
/* Since version 2 */
__DRIgetAPIMaskFunc getAPIMask;
@@ -1409,7 +1406,6 @@ struct __DRIimageDriverExtensionRec {
/* Common DRI functions, shared with DRI2 */
__DRIcreateNewScreen2Func createNewScreen2;
__DRIcreateNewDrawableFunc createNewDrawable;
- __DRIcreateNewContextFunc createNewContext;
__DRIcreateContextAttribsFunc createContextAttribs;
__DRIgetAPIMaskFunc getAPIMask;
};
diff --git a/mesalib/src/mesa/drivers/common/meta.c b/mesalib/src/mesa/drivers/common/meta.c
index aa50dde73..99b02baad 100644
--- a/mesalib/src/mesa/drivers/common/meta.c
+++ b/mesalib/src/mesa/drivers/common/meta.c
@@ -1515,6 +1515,9 @@ setup_glsl_blit_framebuffer(struct gl_context *ctx,
sizeof(struct vertex), OFFSET(x));
_mesa_VertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,
sizeof(struct vertex), OFFSET(s));
+
+ _mesa_EnableVertexAttribArray(0);
+ _mesa_EnableVertexAttribArray(1);
}
/* Generate a relevant fragment shader program for the texture target */
@@ -1591,8 +1594,6 @@ setup_glsl_blit_framebuffer(struct gl_context *ctx,
_mesa_DeleteObjectARB(vs);
_mesa_BindAttribLocation(ShaderProg, 0, "position");
_mesa_BindAttribLocation(ShaderProg, 1, "texcoords");
- _mesa_EnableVertexAttribArray(0);
- _mesa_EnableVertexAttribArray(1);
link_program_with_debug(ctx, ShaderProg);
ralloc_free(mem_ctx);
if (texture_2d)
diff --git a/mesalib/src/mesa/drivers/dri/common/dri_util.c b/mesalib/src/mesa/drivers/dri/common/dri_util.c
index 75dc645ff..6ca75f41d 100644
--- a/mesalib/src/mesa/drivers/dri/common/dri_util.c
+++ b/mesalib/src/mesa/drivers/dri/common/dri_util.c
@@ -872,7 +872,6 @@ const __DRIimageDriverExtension driImageDriverExtension = {
/*.createNewScreen2 =*/ driCreateNewScreen2,
/*.createNewDrawable =*/ driCreateNewDrawable,
- /*.createNewContext =*/ driCreateNewContext,
/*.createContextAttribs =*/ driCreateContextAttribs,
/*.getAPIMask =*/ driGetAPIMask,
};
diff --git a/mesalib/src/mesa/main/arrayobj.c b/mesalib/src/mesa/main/arrayobj.c
index dbf8fdc73..fdcf172ea 100644
--- a/mesalib/src/mesa/main/arrayobj.c
+++ b/mesalib/src/mesa/main/arrayobj.c
@@ -53,7 +53,7 @@
/**
* Look up the array object for the given ID.
- *
+ *
* \returns
* Either a pointer to the array object with the specified ID or \c NULL for
* a non-existent ID. The spec defines ID 0 as being technically
@@ -91,7 +91,7 @@ unbind_array_object_vbos(struct gl_context *ctx, struct gl_array_object *obj)
/**
* Allocate and initialize a new vertex array object.
- *
+ *
* This function is intended to be called via
* \c dd_function_table::NewArrayObject.
*/
@@ -107,7 +107,7 @@ _mesa_new_array_object( struct gl_context *ctx, GLuint name )
/**
* Delete an array object.
- *
+ *
* This function is intended to be called via
* \c dd_function_table::DeleteArrayObject.
*/
@@ -298,18 +298,18 @@ static GLuint
compute_max_element(struct gl_array_object *arrayObj, GLbitfield64 enabled)
{
GLuint min = ~((GLuint)0);
-
+
while (enabled) {
struct gl_client_array *client_array;
GLint attrib = ffsll(enabled) - 1;
enabled ^= BITFIELD64_BIT(attrib);
-
+
client_array = &arrayObj->_VertexAttrib[attrib];
assert(client_array->Enabled);
_mesa_update_array_max_element(client_array);
min = MIN2(min, client_array->_MaxElement);
}
-
+
return min;
}
@@ -340,7 +340,8 @@ _mesa_update_array_object_max_element(struct gl_context *ctx,
* or a gl_vertex_buffer_binding has changed.
*/
void
-_mesa_update_array_object_client_arrays(struct gl_context *ctx, struct gl_array_object *arrayObj)
+_mesa_update_array_object_client_arrays(struct gl_context *ctx,
+ struct gl_array_object *arrayObj)
{
GLbitfield64 arrays = arrayObj->NewArrays;
@@ -356,7 +357,8 @@ _mesa_update_array_object_client_arrays(struct gl_context *ctx, struct gl_array_
buffer_binding = &arrayObj->VertexBinding[attrib_array->VertexBinding];
client_array = &arrayObj->_VertexAttrib[attrib];
- _mesa_update_client_array(ctx, client_array, attrib_array, buffer_binding);
+ _mesa_update_client_array(ctx, client_array, attrib_array,
+ buffer_binding);
}
}
@@ -396,7 +398,8 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, GLboolean genRequired)
newObj = _mesa_lookup_arrayobj(ctx, id);
if (!newObj) {
if (genRequired) {
- _mesa_error(ctx, GL_INVALID_OPERATION, "glBindVertexArray(non-gen name)");
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBindVertexArray(non-gen name)");
return;
}
@@ -463,7 +466,7 @@ _mesa_BindVertexArrayAPPLE( GLuint id )
/**
* Delete a set of array objects.
- *
+ *
* \param n Number of array objects to delete.
* \param ids Array of \c n array object IDs.
*/
@@ -511,7 +514,7 @@ _mesa_DeleteVertexArrays(GLsizei n, const GLuint *ids)
* \param arrays Array of \c n locations to store the IDs.
* \param vboOnly Will arrays have to reside in VBOs?
*/
-static void
+static void
gen_vertex_arrays(struct gl_context *ctx, GLsizei n, GLuint *arrays)
{
GLuint first;
@@ -570,9 +573,9 @@ _mesa_GenVertexArraysAPPLE(GLsizei n, GLuint *arrays)
/**
* Determine if ID is the name of an array object.
- *
+ *
* \param id ID of the potential array object.
- * \return \c GL_TRUE if \c id is the name of a array object,
+ * \return \c GL_TRUE if \c id is the name of a array object,
* \c GL_FALSE otherwise.
*/
GLboolean GLAPIENTRY
diff --git a/mesalib/src/mesa/main/mtypes.h b/mesalib/src/mesa/main/mtypes.h
index ae96e2326..41ffdb765 100644
--- a/mesalib/src/mesa/main/mtypes.h
+++ b/mesalib/src/mesa/main/mtypes.h
@@ -1502,6 +1502,12 @@ struct gl_vertex_attrib_array
GLuint VertexBinding; /**< Vertex buffer binding */
};
+
+/**
+ * This describes the buffer object used for a vertex array (or
+ * multiple vertex arrays). If BufferObj points to the default/null
+ * buffer object, then the vertex array lives in user memory and not a VBO.
+ */
struct gl_vertex_buffer_binding
{
GLintptr Offset; /**< User-specified offset */
diff --git a/mesalib/src/mesa/main/varray.c b/mesalib/src/mesa/main/varray.c
index d17d698d3..0f38270d5 100644
--- a/mesalib/src/mesa/main/varray.c
+++ b/mesalib/src/mesa/main/varray.c
@@ -390,11 +390,6 @@ update_array(struct gl_context *ctx,
return;
}
- if (!update_array_format(ctx, func, attrib, legalTypesMask, sizeMin, sizeMax,
- size, type, normalized, integer, 0)) {
- return;
- }
-
if (stride < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride );
return;
@@ -418,6 +413,11 @@ update_array(struct gl_context *ctx,
return;
}
+ if (!update_array_format(ctx, func, attrib, legalTypesMask, sizeMin,
+ sizeMax, size, type, normalized, integer, 0)) {
+ return;
+ }
+
/* Reset the vertex attrib binding */
vertex_attrib_binding(ctx, attrib, attrib);
diff --git a/mesalib/src/mesa/main/varray.h b/mesalib/src/mesa/main/varray.h
index 8a9487c6e..3b9f39a61 100644
--- a/mesalib/src/mesa/main/varray.h
+++ b/mesalib/src/mesa/main/varray.h
@@ -73,12 +73,13 @@ _mesa_update_array_max_element(struct gl_client_array *array)
* a vertex buffer.
*/
static inline const GLubyte *
-_mesa_vertex_attrib_address(struct gl_vertex_attrib_array *array,
- struct gl_vertex_buffer_binding *binding)
+_mesa_vertex_attrib_address(const struct gl_vertex_attrib_array *array,
+ const struct gl_vertex_buffer_binding *binding)
{
- return (binding->BufferObj->Name == 0 ?
- array->Ptr :
- (const GLubyte *)(binding->Offset + array->RelativeOffset));
+ if (_mesa_is_bufferobj(binding->BufferObj))
+ return (const GLubyte *) (binding->Offset + array->RelativeOffset);
+ else
+ return array->Ptr;
}
/**
@@ -88,8 +89,8 @@ _mesa_vertex_attrib_address(struct gl_vertex_attrib_array *array,
static inline void
_mesa_update_client_array(struct gl_context *ctx,
struct gl_client_array *dst,
- struct gl_vertex_attrib_array *src,
- struct gl_vertex_buffer_binding *binding)
+ const struct gl_vertex_attrib_array *src,
+ const struct gl_vertex_buffer_binding *binding)
{
dst->Size = src->Size;
dst->Type = src->Type;
diff --git a/pixman/pixman/pixman-x86.c b/pixman/pixman/pixman-x86.c
index 652776021..05297c476 100644
--- a/pixman/pixman/pixman-x86.c
+++ b/pixman/pixman/pixman-x86.c
@@ -170,7 +170,7 @@ detect_cpu_features (void)
features |= X86_SSE;
if (d & (1 << 26))
features |= X86_SSE2;
- if (d & (1 << 9))
+ if (c & (1 << 9))
features |= X86_SSSE3;
/* Check for AMD specific features */
diff --git a/xorg-server/Xext/shm.c b/xorg-server/Xext/shm.c
index 0bf27f4c6..c9d39b22e 100644
--- a/xorg-server/Xext/shm.c
+++ b/xorg-server/Xext/shm.c
@@ -401,7 +401,7 @@ ProcShmAttach(ClientPtr client)
return BadValue;
}
for (shmdesc = Shmsegs; shmdesc; shmdesc = shmdesc->next) {
- if (!shmdesc->is_fd && shmdesc->shmid == stuff->shmid)
+ if (!SHMDESC_IS_FD(shmdesc) && shmdesc->shmid == stuff->shmid)
break;
}
if (shmdesc) {
@@ -413,7 +413,9 @@ ProcShmAttach(ClientPtr client)
shmdesc = malloc(sizeof(ShmDescRec));
if (!shmdesc)
return BadAlloc;
+#ifdef SHM_FD_PASSING
shmdesc->is_fd = FALSE;
+#endif
shmdesc->addr = shmat(stuff->shmid, 0,
stuff->readOnly ? SHM_RDONLY : 0);
if ((shmdesc->addr == ((char *) -1)) || SHMSTAT(stuff->shmid, &buf)) {
@@ -453,9 +455,13 @@ ShmDetachSegment(pointer value, /* must conform to DeleteType */
if (--shmdesc->refcnt)
return TRUE;
#ifndef _MSC_VER
- if (shmdesc->is_fd)
+#if SHM_FD_PASSING
+ if (shmdesc->is_fd) {
+ if (shmdesc->busfault)
+ busfault_unregister(shmdesc->busfault);
munmap(shmdesc->addr, shmdesc->size);
- else
+ } else
+#endif
shmdt(shmdesc->addr);
#endif
for (prev = &Shmsegs; *prev != shmdesc; prev = &(*prev)->next);
@@ -1113,6 +1119,20 @@ ProcShmCreatePixmap(ClientPtr client)
return BadAlloc;
}
+#ifdef SHM_FD_PASSING
+
+static void
+ShmBusfaultNotify(void *context)
+{
+ ShmDescPtr shmdesc = context;
+
+ ErrorF("shared memory 0x%x truncated by client\n",
+ (unsigned int) shmdesc->resource);
+ busfault_unregister(shmdesc->busfault);
+ shmdesc->busfault = NULL;
+ FreeResource (shmdesc->resource, RT_NONE);
+}
+
static int
ProcShmAttachFd(ClientPtr client)
{
@@ -1157,6 +1177,15 @@ ProcShmAttachFd(ClientPtr client)
shmdesc->refcnt = 1;
shmdesc->writable = !stuff->readOnly;
shmdesc->size = statb.st_size;
+ shmdesc->resource = stuff->shmseg;
+
+ shmdesc->busfault = busfault_register_mmap(shmdesc->addr, shmdesc->size, ShmBusfaultNotify, shmdesc);
+ if (!shmdesc->busfault) {
+ munmap(shmdesc->addr, shmdesc->size);
+ free(shmdesc);
+ return BadAlloc;
+ }
+
shmdesc->next = Shmsegs;
Shmsegs = shmdesc;
@@ -1212,6 +1241,15 @@ ProcShmCreateSegment(ClientPtr client)
shmdesc->refcnt = 1;
shmdesc->writable = !stuff->readOnly;
shmdesc->size = stuff->size;
+
+ shmdesc->busfault = busfault_register_mmap(shmdesc->addr, shmdesc->size, ShmBusfaultNotify, shmdesc);
+ if (!shmdesc->busfault) {
+ close(fd);
+ munmap(shmdesc->addr, shmdesc->size);
+ free(shmdesc);
+ return BadAlloc;
+ }
+
shmdesc->next = Shmsegs;
Shmsegs = shmdesc;
@@ -1228,6 +1266,7 @@ ProcShmCreateSegment(ClientPtr client)
WriteToClient(client, sizeof (xShmCreateSegmentReply), &rep);
return Success;
}
+#endif /* SHM_FD_PASSING */
static int
ProcShmDispatch(ClientPtr client)
@@ -1258,10 +1297,12 @@ ProcShmDispatch(ClientPtr client)
return ProcPanoramiXShmCreatePixmap(client);
#endif
return ProcShmCreatePixmap(client);
+#ifdef SHM_FD_PASSING
case X_ShmAttachFd:
return ProcShmAttachFd(client);
case X_ShmCreateSegment:
return ProcShmCreateSegment(client);
+#endif
default:
return BadRequest;
}
@@ -1362,6 +1403,7 @@ SProcShmCreatePixmap(ClientPtr client)
return ProcShmCreatePixmap(client);
}
+#ifdef SHM_FD_PASSING
static int
SProcShmAttachFd(ClientPtr client)
{
@@ -1383,6 +1425,7 @@ SProcShmCreateSegment(ClientPtr client)
swapl(&stuff->size);
return ProcShmCreateSegment(client);
}
+#endif /* SHM_FD_PASSING */
static int
SProcShmDispatch(ClientPtr client)
@@ -1401,10 +1444,12 @@ SProcShmDispatch(ClientPtr client)
return SProcShmGetImage(client);
case X_ShmCreatePixmap:
return SProcShmCreatePixmap(client);
+#ifdef SHM_FD_PASSING
case X_ShmAttachFd:
return SProcShmAttachFd(client);
case X_ShmCreateSegment:
return SProcShmCreateSegment(client);
+#endif
default:
return BadRequest;
}
diff --git a/xorg-server/Xext/shmint.h b/xorg-server/Xext/shmint.h
index db35fbbbe..21d6cc4ee 100644
--- a/xorg-server/Xext/shmint.h
+++ b/xorg-server/Xext/shmint.h
@@ -56,16 +56,36 @@ typedef struct _ShmFuncs {
void (*PutImage) (XSHM_PUT_IMAGE_ARGS);
} ShmFuncs, *ShmFuncsPtr;
+#include <protocol-versions.h>
+
+#if SERVER_SHM_MAJOR_VERSION == 1 && SERVER_SHM_MINOR_VERSION >= 2
+#define SHM_FD_PASSING 1
+#endif
+
+#ifdef SHM_FD_PASSING
+#include "busfault.h"
+#endif
+
typedef struct _ShmDesc {
struct _ShmDesc *next;
int shmid;
int refcnt;
char *addr;
- Bool is_fd;
Bool writable;
unsigned long size;
+#ifdef SHM_FD_PASSING
+ Bool is_fd;
+ struct busfault *busfault;
+ XID resource;
+#endif
} ShmDescRec, *ShmDescPtr;
+#ifdef SHM_FD_PASSING
+#define SHMDESC_IS_FD(shmdesc) ((shmdesc)->is_fd)
+#else
+#define SHMDESC_IS_FD(shmdesc) (0)
+#endif
+
extern _X_EXPORT void
ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
diff --git a/xorg-server/configure.ac b/xorg-server/configure.ac
index 6925df814..eb90b1ae0 100644
--- a/xorg-server/configure.ac
+++ b/xorg-server/configure.ac
@@ -31,6 +31,7 @@ RELEASE_DATE="2013-10-31"
RELEASE_NAME="Bom Retiro"
AC_CONFIG_SRCDIR([Makefile.am])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AC_USE_SYSTEM_EXTENSIONS
# Require xorg-macros minimum of 1.14 for XORG_COMPILER_BRAND in XORG_DEFAULT_OPTIONS
m4_ifndef([XORG_MACROS_VERSION],
@@ -798,7 +799,7 @@ dnl Required modules
XPROTO="xproto >= 7.0.22"
RANDRPROTO="randrproto >= 1.4.0"
RENDERPROTO="renderproto >= 0.11"
-XEXTPROTO="xextproto >= 7.1.99"
+XEXTPROTO="xextproto >= 7.2.99.901"
INPUTPROTO="inputproto >= 2.3"
KBPROTO="kbproto >= 1.0.3"
FONTSPROTO="fontsproto"
@@ -806,7 +807,7 @@ FIXESPROTO="fixesproto >= 5.0"
DAMAGEPROTO="damageproto >= 1.1"
XCMISCPROTO="xcmiscproto >= 1.2.0"
BIGREQSPROTO="bigreqsproto >= 1.1.0"
-XTRANS="xtrans >= 1.2.2"
+XTRANS="xtrans >= 1.3.2"
PRESENTPROTO="presentproto >= 1.0"
dnl List of libraries that require a specific version
@@ -814,7 +815,7 @@ LIBAPPLEWM="applewm >= 1.4"
LIBDMX="dmx >= 1.0.99.1"
LIBDRI="dri >= 7.8.0"
LIBDRM="libdrm >= 2.3.0"
-LIBGL="gl >= 9.2.0"
+LIBGL="gl >= 7.1.0"
LIBXEXT="xext >= 1.0.99.4"
LIBXFONT="xfont >= 1.4.2"
LIBXI="xi >= 1.2.99.1"
@@ -1069,34 +1070,6 @@ fi
AC_MSG_RESULT([$CLIENTIDS])
AM_CONDITIONAL(CLIENTIDS, [test "x$CLIENTIDS" = xyes])
-if test "x$GLX" = xyes; then
- PKG_CHECK_MODULES([XLIB], [x11])
- PKG_CHECK_MODULES([GL], $GLPROTO $LIBGL)
- AC_SUBST(XLIB_CFLAGS)
- AC_DEFINE(GLXEXT, 1, [Build GLX extension])
- GLX_LIBS='$(top_builddir)/glx/libglx.la'
- GLX_SYS_LIBS="$GLX_SYS_LIBS $GL_LIBS"
-else
- GLX=no
-fi
-AM_CONDITIONAL(GLX, test "x$GLX" = xyes)
-
-if test "x$GLX" = xno; then
- AIGLX=no
-fi
-
-if test "x$AIGLX" = xyes -a \( "x$DRI2" = xyes \); then
- AC_DEFINE(AIGLX, 1, [Build AIGLX loader])
-fi
-AM_CONDITIONAL(AIGLX_DRI_LOADER, { test "x$DRI2" = xyes; } && test "x$AIGLX" = xyes)
-
-if test "x$GLX_USE_TLS" = xyes ; then
- GLX_DEFINES="-DGLX_USE_TLS -DPTHREADS"
- GLX_SYS_LIBS="$GLX_SYS_LIBS -lpthread"
-fi
-AC_SUBST([GLX_DEFINES])
-AC_SUBST([GLX_SYS_LIBS])
-
AM_CONDITIONAL(DRI, test "x$DRI" = xyes)
if test "x$DRI" = xyes; then
AC_DEFINE(XF86DRI, 1, [Build DRI extension])
@@ -1113,11 +1086,47 @@ case "$DRI2,$HAVE_DRI2PROTO" in
yes,yes | auto,yes)
AC_DEFINE(DRI2, 1, [Build DRI2 extension])
DRI2=yes
+ LIBGL="gl >= 9.2.0"
SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $DRI2PROTO"
;;
esac
AM_CONDITIONAL(DRI2, test "x$DRI2" = xyes)
+AC_ARG_ENABLE(xtrans-send-fds, AS_HELP_STRING([--disable-xtrans-send-fds], [Use Xtrans support for fd passing (default: auto)]), [XTRANS_SEND_FDS=$enableval], [XTRANS_SEND_FDS=auto])
+
+case "x$XTRANS_SEND_FDS" in
+xauto)
+ case "$host_os" in
+ linux*|solaris*)
+ XTRANS_SEND_FDS=yes
+ ;;
+ *)
+ XTRANS_SEND_FDS=no
+ ;;
+ esac
+esac
+
+case "x$XTRANS_SEND_FDS" in
+xyes)
+ AC_DEFINE(XTRANS_SEND_FDS, 1, [Enable xtrans fd passing support])
+ ;;
+esac
+
+case "$DRI3,$XTRANS_SEND_FDS" in
+ yes,yes | auto,yes)
+ ;;
+ yes,no)
+ AC_MSG_ERROR([DRI3 requested, but xtrans fd passing support not found.])
+ DRI3=no
+ ;;
+ no,*)
+ ;;
+ *)
+ AC_MSG_NOTICE([DRI3 disabled because xtrans fd passing support not found.])
+ DRI3=no
+ ;;
+esac
+
PKG_CHECK_MODULES([DRI3PROTO], $DRI3PROTO,
[HAVE_DRI3PROTO=yes], [HAVE_DRI3PROTO=no])
@@ -1136,6 +1145,25 @@ case "$DRI3,$HAVE_DRI3PROTO" in
;;
esac
+AC_CHECK_FUNCS([sigaction])
+
+BUSFAULT=no
+
+case x"$ac_cv_func_sigaction" in
+ xyes)
+ AC_DEFINE(HAVE_SIGACTION, 1, [Have sigaction function])
+ BUSFAULT=yes
+ ;;
+esac
+
+case x"$BUSFAULT" in
+ xyes)
+ AC_DEFINE(BUSFAULT, 1, [Include busfault OS API])
+ ;;
+esac
+
+AM_CONDITIONAL(BUSFAULT, test x"$BUSFAULT" = xyes)
+
PKG_CHECK_MODULES([XSHMFENCE], $XSHMFENCE,
[HAVE_XSHMFENCE=yes], [HAVE_XSHMFENCE=no])
@@ -1204,6 +1232,34 @@ if test "x$DRI2" = xyes; then
fi
AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" = xyes)
+if test "x$GLX" = xyes; then
+ PKG_CHECK_MODULES([XLIB], [x11])
+ PKG_CHECK_MODULES([GL], $GLPROTO $LIBGL)
+ AC_SUBST(XLIB_CFLAGS)
+ AC_DEFINE(GLXEXT, 1, [Build GLX extension])
+ GLX_LIBS='$(top_builddir)/glx/libglx.la'
+ GLX_SYS_LIBS="$GLX_SYS_LIBS $GL_LIBS"
+else
+ GLX=no
+fi
+AM_CONDITIONAL(GLX, test "x$GLX" = xyes)
+
+if test "x$GLX" = xno; then
+ AIGLX=no
+fi
+
+if test "x$AIGLX" = xyes -a \( "x$DRI2" = xyes \); then
+ AC_DEFINE(AIGLX, 1, [Build AIGLX loader])
+fi
+AM_CONDITIONAL(AIGLX_DRI_LOADER, { test "x$DRI2" = xyes; } && test "x$AIGLX" = xyes)
+
+if test "x$GLX_USE_TLS" = xyes ; then
+ GLX_DEFINES="-DGLX_USE_TLS -DPTHREADS"
+ GLX_SYS_LIBS="$GLX_SYS_LIBS -lpthread"
+fi
+AC_SUBST([GLX_DEFINES])
+AC_SUBST([GLX_SYS_LIBS])
+
AM_CONDITIONAL(PRESENT, [test "x$PRESENT" = xyes])
if test "x$PRESENT" = xyes; then
AC_DEFINE(PRESENT, 1, [Support Present extension])
diff --git a/xorg-server/hw/xfree86/common/xf86Bus.c b/xorg-server/hw/xfree86/common/xf86Bus.c
index 329d0b3d5..d463e9196 100644
--- a/xorg-server/hw/xfree86/common/xf86Bus.c
+++ b/xorg-server/hw/xfree86/common/xf86Bus.c
@@ -266,9 +266,12 @@ xf86IsEntityPrimary(int entityIndex)
{
EntityPtr pEnt = xf86Entities[entityIndex];
+#ifdef XSERVER_LIBPCIACCESS
if (primaryBus.type == BUS_PLATFORM && pEnt->bus.type == BUS_PCI)
return MATCH_PCI_DEVICES(pEnt->bus.id.pci, primaryBus.id.plat->pdev);
- else if (primaryBus.type != pEnt->bus.type)
+#endif
+
+ if (primaryBus.type != pEnt->bus.type)
return FALSE;
switch (pEnt->bus.type) {
diff --git a/xorg-server/hw/xfree86/x86emu/decode.c b/xorg-server/hw/xfree86/x86emu/decode.c
index 12f8fb84b..08a07b1bb 100644
--- a/xorg-server/hw/xfree86/x86emu/decode.c
+++ b/xorg-server/hw/xfree86/x86emu/decode.c
@@ -38,6 +38,16 @@
****************************************************************************/
#include <stdlib.h>
+
+#if defined(__sun) && defined(CS) /* avoid conflicts with Solaris sys/regset.h */
+# undef CS
+# undef DS
+# undef SS
+# undef ES
+# undef FS
+# undef GS
+#endif
+
#include "x86emu/x86emui.h"
/*----------------------------- Implementation ----------------------------*/
diff --git a/xorg-server/hw/xfree86/x86emu/x86emu/regs.h b/xorg-server/hw/xfree86/x86emu/x86emu/regs.h
index 6bd061166..2ecafa047 100644
--- a/xorg-server/hw/xfree86/x86emu/x86emu/regs.h
+++ b/xorg-server/hw/xfree86/x86emu/x86emu/regs.h
@@ -112,6 +112,15 @@ struct i386_special_regs {
* CS, DS, ES, SS.
*/
+#if defined(__sun) && defined(CS) /* avoid conflicts with Solaris sys/regset.h */
+# undef CS
+# undef DS
+# undef SS
+# undef ES
+# undef FS
+# undef GS
+#endif
+
struct i386_segment_regs {
u16 CS, DS, SS, ES, FS, GS;
};
diff --git a/xorg-server/hw/xfree86/x86emu/x86emu/x86emui.h b/xorg-server/hw/xfree86/x86emu/x86emu/x86emui.h
index f11dc102f..5e20d9705 100644
--- a/xorg-server/hw/xfree86/x86emu/x86emu/x86emui.h
+++ b/xorg-server/hw/xfree86/x86emu/x86emu/x86emui.h
@@ -73,7 +73,17 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#endif
+/* avoid conflicts with Solaris sys/regset.h */
+# if defined(__sun) && defined(CS)
+# undef CS
+# undef DS
+# undef SS
+# undef ES
+# undef FS
+# undef GS
+# endif
+#endif /* NO_SYS_HEADERS */
+
/*--------------------------- Inline Functions ----------------------------*/
#ifdef __cplusplus
diff --git a/xorg-server/hw/xquartz/X11Controller.m b/xorg-server/hw/xquartz/X11Controller.m
index 737db42e7..3d094bfc7 100644
--- a/xorg-server/hw/xquartz/X11Controller.m
+++ b/xorg-server/hw/xquartz/X11Controller.m
@@ -936,7 +936,7 @@ extern char *bundle_id_prefix;
- (void) applicationWillTerminate:(NSNotification *)aNotification
{
- unsigned remain;
+ int remain;
[X11App prefs_synchronize];
/* shutdown the X server, it will exit () for us. */
diff --git a/xorg-server/hw/xquartz/bundle/Info.plist.cpp b/xorg-server/hw/xquartz/bundle/Info.plist.cpp
index b99e417aa..5fbb0ad55 100644
--- a/xorg-server/hw/xquartz/bundle/Info.plist.cpp
+++ b/xorg-server/hw/xquartz/bundle/Info.plist.cpp
@@ -39,9 +39,9 @@
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>NSHumanReadableCopyright</key>
- <string>© 2003-2012 Apple Inc.
+ <string>© 2003-2013 Apple Inc.
© 2003 XFree86 Project, Inc.
-© 2003-2012 X.org Foundation, Inc.
+© 2003-2013 X.org Foundation, Inc.
</string>
<key>NSMainNibFile</key>
<string>main</string>
diff --git a/xorg-server/include/Makefile.am b/xorg-server/include/Makefile.am
index 5cdea1d15..13d91e22c 100644
--- a/xorg-server/include/Makefile.am
+++ b/xorg-server/include/Makefile.am
@@ -2,6 +2,7 @@ if XORG
sdk_HEADERS = \
XIstubs.h \
Xprintf.h \
+ busfault.h \
callback.h \
client.h \
closestr.h \
diff --git a/xorg-server/include/busfault.h b/xorg-server/include/busfault.h
new file mode 100644
index 000000000..3b668818d
--- /dev/null
+++ b/xorg-server/include/busfault.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2013 Keith Packard
+ *
+ * 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 name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The 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 COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE 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.
+ */
+
+#ifndef _BUSFAULT_H_
+#define _BUSFAULT_H_
+
+#include <dix-config.h>
+
+#ifdef BUSFAULT
+
+#include <sys/types.h>
+
+typedef void (*busfault_notify_ptr) (void *context);
+
+struct busfault *
+busfault_register_mmap(void *addr, size_t size, busfault_notify_ptr notify, void *context);
+
+void
+busfault_unregister(struct busfault *busfault);
+
+void
+busfault_check(void);
+
+Bool
+busfault_init(void);
+
+#endif
+
+#endif /* _BUSFAULT_H_ */
diff --git a/xorg-server/include/dix-config.h.in b/xorg-server/include/dix-config.h.in
index 156383bf8..d4fbe99fa 100644
--- a/xorg-server/include/dix-config.h.in
+++ b/xorg-server/include/dix-config.h.in
@@ -449,7 +449,21 @@
#include "dix-config-apple-verbatim.h"
#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+/* Defined if needed to expose struct msghdr.msg_control */
+#undef _XOPEN_SOURCE
+
/* Have support for X shared memory fence library (xshmfence) */
#undef HAVE_XSHMFENCE
+/* Use XTrans FD passing support */
+#undef XTRANS_SEND_FDS
+
+/* Wrap SIGBUS to catch MIT-SHM faults */
+#undef BUSFAULT
+
#endif /* _DIX_CONFIG_H_ */
diff --git a/xorg-server/include/dixstruct.h b/xorg-server/include/dixstruct.h
index 92d2b3882..440e5ccdd 100644
--- a/xorg-server/include/dixstruct.h
+++ b/xorg-server/include/dixstruct.h
@@ -110,15 +110,19 @@ typedef struct _Client {
DeviceIntPtr clientPtr;
ClientIdPtr clientIds;
+#if XTRANS_SEND_FDS
int req_fds;
+#endif
} ClientRec;
+#if XTRANS_SEND_FDS
static inline void
SetReqFds(ClientPtr client, int req_fds) {
if (client->req_fds != 0 && req_fds != client->req_fds)
LogMessage(X_ERROR, "Mismatching number of request fds %d != %d\n", req_fds, client->req_fds);
client->req_fds = req_fds;
}
+#endif
/*
* Scheduling interface
diff --git a/xorg-server/include/os.h b/xorg-server/include/os.h
index a04b4e47d..4689e573d 100644
--- a/xorg-server/include/os.h
+++ b/xorg-server/include/os.h
@@ -98,9 +98,11 @@ extern _X_EXPORT int WaitForSomething(int * /*pClientsReady */
extern _X_EXPORT int ReadRequestFromClient(ClientPtr /*client */ );
+#if XTRANS_SEND_FDS
extern _X_EXPORT int ReadFdFromClient(ClientPtr client);
extern _X_EXPORT int WriteFdToClient(ClientPtr client, int fd, Bool do_close);
+#endif
extern _X_EXPORT Bool InsertFakeRequest(ClientPtr /*client */ ,
char * /*data */ ,
diff --git a/xorg-server/include/protocol-versions.h b/xorg-server/include/protocol-versions.h
index 5ceaeb012..95df8ce1a 100644
--- a/xorg-server/include/protocol-versions.h
+++ b/xorg-server/include/protocol-versions.h
@@ -93,7 +93,11 @@
/* SHM */
#define SERVER_SHM_MAJOR_VERSION 1
+#if XTRANS_SEND_FDS
+#define SERVER_SHM_MINOR_VERSION 2
+#else
#define SERVER_SHM_MINOR_VERSION 1
+#endif
/* Sync */
#define SERVER_SYNC_MAJOR_VERSION 3
diff --git a/xorg-server/include/xorg-config.h.in b/xorg-server/include/xorg-config.h.in
index e3444da91..487d7addb 100644
--- a/xorg-server/include/xorg-config.h.in
+++ b/xorg-server/include/xorg-config.h.in
@@ -145,7 +145,4 @@
/* Support APM/ACPI power management in the server */
#undef XF86PM
-/* Have support for X shared memory fence library (xshmfence) */
-#undef HAVE_XSHMFENCE
-
#endif /* _XORG_CONFIG_H_ */
diff --git a/xorg-server/include/xorg-server.h.in b/xorg-server/include/xorg-server.h.in
index 960817e68..0c651bfab 100644
--- a/xorg-server/include/xorg-server.h.in
+++ b/xorg-server/include/xorg-server.h.in
@@ -221,4 +221,7 @@
/* Have support for X shared memory fence library (xshmfence) */
#undef HAVE_XSHMFENCE
+/* Use XTrans FD passing support */
+#undef XTRANS_SEND_FDS
+
#endif /* _XORG_SERVER_H_ */
diff --git a/xorg-server/mi/miinitext.c b/xorg-server/mi/miinitext.c
index 3c26effbe..e5648724c 100644
--- a/xorg-server/mi/miinitext.c
+++ b/xorg-server/mi/miinitext.c
@@ -287,7 +287,9 @@ static const ExtensionModule staticExtensions[] = {
#ifdef DPMSExtension
{DPMSExtensionInit, DPMSExtensionName, &noDPMSExtension},
#endif
+#ifdef PRESENT
{present_extension_init, PRESENT_NAME, NULL},
+#endif
#ifdef DRI3
{dri3_extension_init, DRI3_NAME, NULL},
#endif
diff --git a/xorg-server/os/Makefile.am b/xorg-server/os/Makefile.am
index 364b6da2d..a1bbb4d1e 100644
--- a/xorg-server/os/Makefile.am
+++ b/xorg-server/os/Makefile.am
@@ -5,6 +5,7 @@ AM_CFLAGS = $(DIX_CFLAGS) $(SHA1_CFLAGS)
SECURERPC_SRCS = rpcauth.c
XDMCP_SRCS = xdmcp.c
XORG_SRCS = log.c
+BUSFAULT_SRCS = busfault.c
libos_la_SOURCES = \
WaitFor.c \
@@ -39,6 +40,10 @@ AM_CFLAGS += $(LIBUNWIND_CFLAGS)
libos_la_LIBADD += $(LIBUNWIND_LIBS)
endif
+if BUSFAULT
+libos_la_SOURCES += $(BUSFAULT_SRCS)
+endif
+
EXTRA_DIST = $(SECURERPC_SRCS) $(XDMCP_SRCS)
if SPECIAL_DTRACE_OBJECTS
diff --git a/xorg-server/os/WaitFor.c b/xorg-server/os/WaitFor.c
index fc02b572f..ffa740fe4 100644
--- a/xorg-server/os/WaitFor.c
+++ b/xorg-server/os/WaitFor.c
@@ -72,6 +72,7 @@ SOFTWARE.
#ifdef DPMSExtension
#include "dpmsproc.h"
#endif
+#include "busfault.h"
#ifdef WIN32
/* Error codes from windows sockets differ from fileio error codes */
@@ -162,6 +163,10 @@ WaitForSomething(int *pClientsReady)
SmartScheduleStopTimer();
nready = 0;
+#ifdef BUSFAULT
+ busfault_check();
+#endif
+
/* We need a while loop here to handle
crashed connections and the screen saver timeout */
while (1) {
diff --git a/xorg-server/os/busfault.c b/xorg-server/os/busfault.c
new file mode 100644
index 000000000..43bb6ea8a
--- /dev/null
+++ b/xorg-server/os/busfault.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright © 2013 Keith Packard
+ *
+ * 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 name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The 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 COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE 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_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/Xos.h>
+#include <X11/Xdefs.h>
+#include "misc.h"
+#include <busfault.h>
+#include <list.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <sys/mman.h>
+#include <signal.h>
+
+struct busfault {
+ struct xorg_list list;
+
+ void *addr;
+ size_t size;
+
+ Bool valid;
+
+ busfault_notify_ptr notify;
+ void *context;
+};
+
+static Bool busfaulted;
+static struct xorg_list busfaults;
+
+struct busfault *
+busfault_register_mmap(void *addr, size_t size, busfault_notify_ptr notify, void *context)
+{
+ struct busfault *busfault;
+
+ busfault = calloc(1, sizeof (struct busfault));
+ if (!busfault)
+ return NULL;
+
+ busfault->addr = addr;
+ busfault->size = size;
+ busfault->notify = notify;
+ busfault->context = context;
+ busfault->valid = TRUE;
+
+ xorg_list_add(&busfault->list, &busfaults);
+ return busfault;
+}
+
+void
+busfault_unregister(struct busfault *busfault)
+{
+ xorg_list_del(&busfault->list);
+ free(busfault);
+}
+
+void
+busfault_check(void)
+{
+ struct busfault *busfault, *tmp;
+
+ if (!busfaulted)
+ return;
+
+ busfaulted = FALSE;
+
+ xorg_list_for_each_entry_safe(busfault, tmp, &busfaults, list) {
+ if (!busfault->valid)
+ (*busfault->notify)(busfault->context);
+ }
+}
+
+static void (*previous_busfault_sigaction)(int sig, siginfo_t *info, void *param);
+
+static void
+busfault_sigaction(int sig, siginfo_t *info, void *param)
+{
+ void *fault = info->si_addr;
+ struct busfault *busfault = NULL;
+ void *new_addr;
+
+ /* Locate the faulting address in our list of shared segments
+ */
+ xorg_list_for_each_entry(busfault, &busfaults, list) {
+ if ((char *) busfault->addr <= (char *) fault && (char *) fault < (char *) busfault->addr + busfault->size) {
+ break;
+ }
+ }
+ if (!busfault)
+ goto panic;
+
+ if (!busfault->valid)
+ goto panic;
+
+ busfault->valid = FALSE;
+ busfaulted = TRUE;
+
+ /* The client truncated the file; unmap the shared file, map
+ * /dev/zero over that area and keep going
+ */
+
+ new_addr = mmap(busfault->addr, busfault->size, PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
+
+ if (new_addr == MAP_FAILED)
+ goto panic;
+
+ return;
+panic:
+ if (previous_busfault_sigaction)
+ (*previous_busfault_sigaction)(sig, info, param);
+ else
+ FatalError("bus error");
+}
+
+Bool
+busfault_init(void)
+{
+ struct sigaction act, old_act;
+
+ act.sa_sigaction = busfault_sigaction;
+ act.sa_flags = SA_SIGINFO;
+ if (sigaction(SIGBUS, &act, &old_act) < 0)
+ return FALSE;
+ previous_busfault_sigaction = old_act.sa_sigaction;
+ xorg_list_init(&busfaults);
+ return TRUE;
+}
diff --git a/xorg-server/os/io.c b/xorg-server/os/io.c
index c0bd68d97..9f0842672 100644
--- a/xorg-server/os/io.c
+++ b/xorg-server/os/io.c
@@ -259,12 +259,14 @@ ReadRequestFromClient(ClientPtr client)
oc->input = oci;
}
+#if XTRANS_SEND_FDS
/* Discard any unused file descriptors */
while (client->req_fds > 0) {
int req_fd = ReadFdFromClient(client);
if (req_fd >= 0)
close(req_fd);
}
+#endif
/* advance to start of next request */
oci->bufptr += oci->lenLastReq;
@@ -491,6 +493,7 @@ ReadRequestFromClient(ClientPtr client)
return needed;
}
+#if XTRANS_SEND_FDS
int
ReadFdFromClient(ClientPtr client)
{
@@ -513,6 +516,7 @@ WriteFdToClient(ClientPtr client, int fd, Bool do_close)
return _XSERVTransSendFd(oc->trans_conn, fd, do_close);
}
+#endif
/*****************************************************************
* InsertFakeRequest
diff --git a/xorg-server/os/osinit.c b/xorg-server/os/osinit.c
index 6c66f9c12..60d10694b 100644
--- a/xorg-server/os/osinit.c
+++ b/xorg-server/os/osinit.c
@@ -149,6 +149,8 @@ OsSigHandler(int signo)
}
#endif /* !WIN32 || __CYGWIN__ */
+#include "busfault.h"
+
void
OsInit(void)
{
@@ -185,6 +187,9 @@ OsInit(void)
}
}
#endif /* !WIN32 || __CYGWIN__ */
+#ifdef BUSFAULT
+ busfault_init();
+#endif
#ifdef HAVE_BACKTRACE
/*
diff --git a/xorg-server/present/present.c b/xorg-server/present/present.c
index 46b884bb1..85cb90aaa 100644
--- a/xorg-server/present/present.c
+++ b/xorg-server/present/present.c
@@ -184,8 +184,10 @@ present_vblank_notify(present_vblank_ptr vblank, CARD8 kind, CARD8 mode, uint64_
static void
present_pixmap_idle(PixmapPtr pixmap, WindowPtr window, CARD32 serial, struct present_fence *present_fence)
{
- present_fence_set_triggered(present_fence);
- present_send_idle_notify(window, serial, pixmap, present_fence);
+ if (present_fence)
+ present_fence_set_triggered(present_fence);
+ if (window)
+ present_send_idle_notify(window, serial, pixmap, present_fence);
}
RRCrtcPtr
@@ -297,7 +299,8 @@ present_flip_idle(ScreenPtr screen)
if (screen_priv->flip_pixmap) {
present_pixmap_idle(screen_priv->flip_pixmap, screen_priv->flip_window,
screen_priv->flip_serial, screen_priv->flip_idle_fence);
- present_fence_destroy(screen_priv->flip_idle_fence);
+ if (screen_priv->flip_idle_fence)
+ present_fence_destroy(screen_priv->flip_idle_fence);
dixDestroyPixmap(screen_priv->flip_pixmap, screen_priv->flip_pixmap->drawable.id);
screen_priv->flip_crtc = NULL;
screen_priv->flip_window = NULL;
@@ -371,6 +374,7 @@ present_event_notify(uint64_t event_id, uint64_t ust, uint64_t msc)
present_vblank_ptr vblank, tmp;
int s;
+ DebugPresent(("\te %lld ust %lld msc %lld\n", event_id, ust, msc));
xorg_list_for_each_entry_safe(vblank, tmp, &present_exec_queue, event_queue) {
if (vblank->event_id == event_id) {
xorg_list_del(&vblank->event_queue);
@@ -655,8 +659,10 @@ present_pixmap(WindowPtr window,
}
if (pixmap)
- DebugPresent(("q %p %8lld: %08lx -> %08lx (crtc %d)\n",
- vblank, target_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id, target_crtc ? 1 : 0));
+ DebugPresent(("q %lld %p %8lld: %08lx -> %08lx (crtc %p)\n",
+ vblank->event_id, vblank, target_msc,
+ vblank->pixmap->drawable.id, vblank->window->drawable.id,
+ target_crtc));
xorg_list_add(&vblank->event_queue, &present_exec_queue);
if (target_msc >= crtc_msc) {
diff --git a/xorg-server/record/record.c b/xorg-server/record/record.c
index f728cc684..1b7eb8a43 100644
--- a/xorg-server/record/record.c
+++ b/xorg-server/record/record.c
@@ -1393,6 +1393,10 @@ typedef struct {
short first, last; /* if for extension, major opcode interval */
} SetInfoRec, *SetInfoPtr;
+#if defined(ERR) && defined(__sun)
+#undef ERR /* Avoid conflict with Solaris <sys/regset.h> */
+#endif
+
/* These constant are used to index into an array of SetInfoRec. */
enum { REQ, /* set info for requests */
REP, /* set info for replies */