summaryrefslogtreecommitdiff
path: root/x11/libxcb/files/patch-64bit-packed
diff options
context:
space:
mode:
authorNiclas Zeising <zeising@FreeBSD.org>2014-04-16 18:28:47 +0000
committerNiclas Zeising <zeising@FreeBSD.org>2014-04-16 18:28:47 +0000
commit39fc32e82863cce17f070122d498ce82cf7ea7af (patch)
treefc8323f5d400038235fda42a6096107239789049 /x11/libxcb/files/patch-64bit-packed
parentAdd USE_GNOME+= gnomedocutils to 5 ports (diff)
The FreeBSD x11@ and graphics team proudly presents
a zeising, kwm production, with help from dumbbell, bdrewery: NEW XORG ON FREEBSD 9-STABLE AND 10-STABLE This update switches over to use the new xorg stack by default on FreeBSD 9 and 10 stable, on osversions where vt(9) is available. It is still possible to use the old stack by specifying WITHOUT_NEW_XORG in /etc/make.conf . FreeBSD 8-STABLE and released versions of FreeBSD still use the old version. A package repository with binary packages for new xorg will be available soon. This patch also contains updates of libxcb and related ports, pixman, as well as some drivers and utilities. Bump portrevisions for xf86-* ports, as well as virtualbox-ose-additions due to xserver version change. Apart from these updates, the way shared libraries are handled has been changed for all xorg ports, as well as libxml2 and freetype, which means ltverhack is gone and as a consequence shared libraries have been bumped. The plan is that this change will make library bumps less likely in the future. All affected ports have had their portrevisions bumped as a consequence of this. Fix some issues where WITH_NEW_XORG weren't detected properly on CURRENT. Update instructions, hardware support, and more notes can be found on https://wiki.freebsd.org/Graphics Thanks to: all testers, bdrewery and the FreeBSD x11@ team exp-run by: bdrewery [1] PR: ports/187602 [1] Approved by: portmgr (bdrewery), core (jhb)
Notes
Notes: svn path=/head/; revision=351411
Diffstat (limited to '')
-rw-r--r--x11/libxcb/files/patch-64bit-packed102
1 files changed, 102 insertions, 0 deletions
diff --git a/x11/libxcb/files/patch-64bit-packed b/x11/libxcb/files/patch-64bit-packed
new file mode 100644
index 000000000000..467c9d95fa04
--- /dev/null
+++ b/x11/libxcb/files/patch-64bit-packed
@@ -0,0 +1,102 @@
+From 3b72a2c9d1d656c74c691a45689e1d637f669e3a Mon Sep 17 00:00:00 2001
+From: Kenneth Graunke <kenneth@whitecape.org>
+Date: Fri, 03 Jan 2014 23:08:33 +0000
+Subject: Force XCB event structures with 64-bit extended fields to be packed.
+
+With the advent of the Present extension, some events (such as
+PresentCompleteNotify) now use native 64-bit types on the wire.
+
+For XGE events, we insert an extra "uint32_t full_sequence" field
+immediately after the first 32 bytes of data. Normally, this causes
+the subsequent fields to be shifted over by 4 bytes, and the structure
+to grow in size by 4 bytes. Everything works fine.
+
+However, if event contains 64-bit extended fields, this may result in
+the compiler adding an extra 4 bytes of padding so that those fields
+remain aligned on 64-bit boundaries. This causes the structure to grow
+by 8 bytes, not 4. Unfortunately, XCB doesn't realize this, and
+always believes that the length only increased by 4. read_packet()
+then fails to malloc enough memory to hold the event, and the event
+processing code uses the wrong offsets.
+
+To fix this, mark any event structures containing 64-bit extended
+fields with __attribute__((__packed__)).
+
+v2: Use any(...) instead of True in (...), as suggested by
+ Daniel Martin.
+
+v3 (Alan Coopersmith): Fix build with Solaris Studio 12.3 by moving the
+attribute to after the structure definition.
+
+Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
+Reviewed-by: Keith Packard <keithp@keithp.com> [v1]
+Reviewed-by: Josh Triplett <josh@joshtriplett.org> [v1]
+Reviewed-by: Daniel Martin <consume.noise@gmail.com>
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+diff --git a/src/c_client.py b/src/c_client.py
+index 99fd307..45de544 100644
+--- src/c_client.py
++++ src/c_client.py
+@@ -1762,7 +1762,7 @@ def c_simple(self, name):
+ # Iterator
+ _c_iterator(self, name)
+
+-def _c_complex(self):
++def _c_complex(self, force_packed = False):
+ '''
+ Helper function for handling all structure types.
+ Called for all structs, requests, replies, events, errors.
+@@ -1817,7 +1817,7 @@ def _c_complex(self):
+ if b.type.has_name:
+ _h(' } %s;', b.c_field_name)
+
+- _h('} %s;', self.c_type)
++ _h('} %s%s;', 'XCB_PACKED ' if force_packed else '', self.c_type)
+
+ def c_struct(self, name):
+ '''
+@@ -2902,6 +2902,7 @@ def c_event(self, name):
+ # events while generating the structure for them. Otherwise we would read
+ # garbage (the internal full_sequence) when accessing normal event fields
+ # there.
++ force_packed = False
+ if hasattr(self, 'is_ge_event') and self.is_ge_event and self.name == name:
+ event_size = 0
+ for field in self.fields:
+@@ -2911,6 +2912,11 @@ def c_event(self, name):
+ full_sequence = Field(tcard32, tcard32.name, 'full_sequence', False, True, True)
+ idx = self.fields.index(field)
+ self.fields.insert(idx + 1, full_sequence)
++
++ # If the event contains any 64-bit extended fields, they need
++ # to remain aligned on a 64-bit boundary. Adding full_sequence
++ # would normally break that; force the struct to be packed.
++ force_packed = any(f.type.size == 8 and f.type.is_simple for f in self.fields[(idx+1):])
+ break
+
+ _c_type_setup(self, name, ('event',))
+@@ -2920,7 +2926,7 @@ def c_event(self, name):
+
+ if self.name == name:
+ # Structure definition
+- _c_complex(self)
++ _c_complex(self, force_packed)
+ else:
+ # Typedef
+ _h('')
+diff --git a/src/xcb.h b/src/xcb.h
+index e62c985..73c77a3 100644
+--- src/xcb.h
++++ src/xcb.h
+@@ -51,6 +51,8 @@ extern "C" {
+ * @file xcb.h
+ */
+
++#define XCB_PACKED __attribute__((__packed__))
++
+ /**
+ * @defgroup XCB_Core_API XCB Core API
+ * @brief Core API of the XCB library.
+--
+cgit v0.9.0.2-2-gbebe