Commit 6696dfe6 authored by Eric Vidal's avatar Eric Vidal 💬
Browse files

first commit : 1.19.4-1

From 215f894965df5fb0bb45b107d84524e700d2073c Mon Sep 17 00:00:00 2001
From: Michal Srb <>
Date: Wed, 24 May 2017 15:54:40 +0300
Subject: dix: Disallow GenericEvent in SendEvent request.
The SendEvent request holds xEvent which is exactly 32 bytes long, no more,
no less. Both ProcSendEvent and SProcSendEvent verify that the received data
exactly match the request size. However nothing stops the client from passing
in event with xEvent::type = GenericEvent and any value of
In the case of ProcSendEvent, the event will be eventually passed to
WriteEventsToClient which will see that it is Generic event and copy the
arbitrary length from the receive buffer (and possibly past it) and send it to
the other client. This allows clients to copy unitialized heap memory out of X
server or to crash it.
In case of SProcSendEvent, it will attempt to swap the incoming event by
calling a swapping function from the EventSwapVector array. The swapped event
is written to target buffer, which in this case is local xEvent variable. The
xEvent variable is 32 bytes long, but the swapping functions for GenericEvents
expect that the target buffer has size matching the size of the source
GenericEvent. This allows clients to cause stack buffer overflows.
Signed-off-by: Michal Srb <>
Reviewed-by: Peter Hutterer <>
Signed-off-by: Peter Hutterer <>
diff --git a/dix/events.c b/dix/events.c
index 3e3a01e..d3a33ea 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5366,6 +5366,12 @@ ProcSendEvent(ClientPtr client)
client->errorValue = stuff->event.u.u.type;
return BadValue;
+ /* Generic events can have variable size, but SendEvent request holds
+ exactly 32B of event data. */
+ if (stuff->event.u.u.type == GenericEvent) {
+ client->errorValue = stuff->event.u.u.type;
+ return BadValue;
+ }
if (stuff->event.u.u.type == ClientMessage &&
stuff->event.u.u.detail != 8 &&
stuff->event.u.u.detail != 16 && stuff->event.u.u.detail != 32) {
diff --git a/dix/swapreq.c b/dix/swapreq.c
index 719e9b8..6785059 100644
--- a/dix/swapreq.c
+++ b/dix/swapreq.c
@@ -292,6 +292,13 @@ SProcSendEvent(ClientPtr client)
+ /* Generic events can have variable size, but SendEvent request holds
+ exactly 32B of event data. */
+ if (stuff->event.u.u.type == GenericEvent) {
+ client->errorValue = stuff->event.u.u.type;
+ return BadValue;
+ }
/* Swap event */
proc = EventSwapVector[stuff->event.u.u.type & 0177];
if (!proc || proc == NotImplemented) /* no swapping proc; invalid event type? */
cgit v0.10.2
From 8caed4df36b1f802b4992edcfd282cbeeec35d9d Mon Sep 17 00:00:00 2001
From: Michal Srb <>
Date: Wed, 24 May 2017 15:54:41 +0300
Subject: Xi: Verify all events in ProcXSendExtensionEvent.
The requirement is that events have type in range
EXTENSION_EVENT_BASE..lastEvent, but it was tested
only for first event of all.
Signed-off-by: Michal Srb <>
Reviewed-by: Peter Hutterer <>
Signed-off-by: Peter Hutterer <>
diff --git a/Xi/sendexev.c b/Xi/sendexev.c
index 1cf118a..5e63bfc 100644
--- a/Xi/sendexev.c
+++ b/Xi/sendexev.c
@@ -117,7 +117,7 @@ SProcXSendExtensionEvent(ClientPtr client)
ProcXSendExtensionEvent(ClientPtr client)
- int ret;
+ int ret, i;
DeviceIntPtr dev;
xEvent *first;
XEventClass *list;
@@ -141,10 +141,12 @@ ProcXSendExtensionEvent(ClientPtr client)
/* The client's event type must be one defined by an extension. */
first = ((xEvent *) &stuff[1]);
- if (!((EXTENSION_EVENT_BASE <= first->u.u.type) &&
- (first->u.u.type < lastEvent))) {
- client->errorValue = first->u.u.type;
- return BadValue;
+ for (i = 0; i < stuff->num_events; i++) {
+ if (!((EXTENSION_EVENT_BASE <= first[i].u.u.type) &&
+ (first[i].u.u.type < lastEvent))) {
+ client->errorValue = first[i].u.u.type;
+ return BadValue;
+ }
list = (XEventClass *) (first + stuff->num_events);
cgit v0.10.2
From ba336b24052122b136486961c82deac76bbde455 Mon Sep 17 00:00:00 2001
From: Michal Srb <>
Date: Wed, 24 May 2017 15:54:42 +0300
Subject: Xi: Do not try to swap GenericEvent.
The SProcXSendExtensionEvent must not attempt to swap GenericEvent because
it is assuming that the event has fixed size and gives the swapping function
xEvent-sized buffer.
A GenericEvent would be later rejected by ProcXSendExtensionEvent anyway.
Signed-off-by: Michal Srb <>
Reviewed-by: Peter Hutterer <>
Signed-off-by: Peter Hutterer <>
diff --git a/Xi/sendexev.c b/Xi/sendexev.c
index 5e63bfc..5c2e0fc 100644
--- a/Xi/sendexev.c
+++ b/Xi/sendexev.c
@@ -95,9 +95,17 @@ SProcXSendExtensionEvent(ClientPtr client)
eventP = (xEvent *) &stuff[1];
for (i = 0; i < stuff->num_events; i++, eventP++) {
+ if (eventP->u.u.type == GenericEvent) {
+ client->errorValue = eventP->u.u.type;
+ return BadValue;
+ }
proc = EventSwapVector[eventP->u.u.type & 0177];
- if (proc == NotImplemented) /* no swapping proc; invalid event type? */
+ /* no swapping proc; invalid event type? */
+ if (proc == NotImplemented) {
+ client->errorValue = eventP->u.u.type;
return BadValue;
+ }
(*proc) (eventP, &eventT);
*eventP = eventT;
cgit v0.10.2
From 05442de962d3dc624f79fc1a00eca3ffc5489ced Mon Sep 17 00:00:00 2001
From: Michal Srb <>
Date: Wed, 24 May 2017 15:54:39 +0300
Subject: Xi: Zero target buffer in SProcXSendExtensionEvent.
Make sure that the xEvent eventT is initialized with zeros, the same way as
in SProcSendEvent.
Some event swapping functions do not overwrite all 32 bytes of xEvent
structure, for example XSecurityAuthorizationRevoked. Two cooperating
clients, one swapped and the other not, can send
XSecurityAuthorizationRevoked event to each other to retrieve old stack data
from X server. This can be potentialy misused to go around ASLR or
Signed-off-by: Michal Srb <>
Reviewed-by: Peter Hutterer <>
Signed-off-by: Peter Hutterer <>
diff --git a/Xi/sendexev.c b/Xi/sendexev.c
index 11d8202..1cf118a 100644
--- a/Xi/sendexev.c
+++ b/Xi/sendexev.c
@@ -78,7 +78,7 @@ SProcXSendExtensionEvent(ClientPtr client)
CARD32 *p;
int i;
- xEvent eventT;
+ xEvent eventT = { .u.u.type = 0 };
xEvent *eventP;
EventSwapPtr proc;
cgit v0.10.2
# Maintainer: Eric Vidal <>
# based on the original
# Maintainer: AndyRTR <>
# Maintainer: Jan de Groot <>
pkgname=('xorg-server-noroot' 'xorg-server-xephyr-noroot' 'xorg-server-xdmx-noroot' 'xorg-server-xvfb-noroot'
'xorg-server-xnest-noroot' 'xorg-server-xwayland-noroot' 'xorg-server-common-noroot' 'xorg-server-devel-noroot')
makedepends=('pixman' 'libx11' 'mesa' 'libgl' 'xf86driproto' 'xcmiscproto' 'xtrans' 'bigreqsproto' 'randrproto'
'inputproto' 'fontsproto' 'videoproto' 'presentproto' 'compositeproto' 'recordproto' 'scrnsaverproto'
'resourceproto' 'xineramaproto' 'libxkbfile' 'libxfont2' 'renderproto' 'libpciaccess' 'libxv'
'xf86dgaproto' 'libxmu' 'libxrender' 'libxi' 'dmxproto' 'libxaw' 'libdmx' 'libxtst' 'libxres'
'xorg-xkbcomp' 'xorg-util-macros' 'xorg-font-util' 'glproto' 'dri2proto' 'libgcrypt' 'libepoxy'
'xcb-util' 'xcb-util-image' 'xcb-util-renderutil' 'xcb-util-wm' 'xcb-util-keysyms' 'dri3proto'
'libxshmfence' 'libunwind' 'wayland-protocols')
validpgpkeys=('6DD4217456569BA711566AC7F06E8FDE7B45DAAC') # Eric Vidal
prepare() {
cd "${pkgbase}-${pkgver}"
# merged upstream in trunk
patch -Np1 -i ../nvidia-add-modulepath-support.patch
# patch from Fedora, not yet merged
patch -Np1 -i ../xserver-autobind-hotplug.patch
# merged in trunk
patch -Np1 -i ../modesetting-Set-correct-DRM-event-context-version.patch
patch -Np1 -i ../CVE-2017-10971.patch
patch -Np1 -i ../CVE-2017-10972.patch
patch -Np1 -i ../bug99708.patch
autoreconf -vfi
build() {
# Since pacman 5.0.2-2, hardened flags are now enabled in makepkg.conf
# With them, module fail to load with undefined symbol.
# See /
export CFLAGS=${CFLAGS/-fno-plt}
export CXXFLAGS=${CXXFLAGS/-fno-plt}
export LDFLAGS=${LDFLAGS/,-z,now}
cd "${pkgbase}-${pkgver}"
./configure --prefix=/usr \
--enable-ipv6 \
--enable-dri \
--enable-dmx \
--enable-xvfb \
--enable-xnest \
--enable-composite \
--enable-xcsecurity \
--enable-libunwind \
--enable-xorg \
--enable-xephyr \
--enable-glamor \
--enable-xwayland \
--enable-kdrive \
--enable-kdrive-kbd \
--enable-kdrive-mouse \
--enable-config-udev \
--enable-record \
--disable-xfbdev \
--disable-xfake \
--disable-static \
--libexecdir=/usr/lib/xorg-server \
--sysconfdir=/etc \
--localstatedir=/var \
--with-xkb-path=/usr/share/X11/xkb \
--with-xkb-output=/var/lib/xkb \
--with-fontrootdir=/usr/share/fonts \
--with-sha1=libgcrypt \
--disable-systemd \
--without-systemd-daemon \
--enable-systemd-logind=no \
--disable-install-setuid \
# Disable subdirs for make install rule to make splitting easier
sed -e 's/^DMX_SUBDIRS =.*/DMX_SUBDIRS =/' \
-i hw/Makefile
package_xorg-server-common-noroot() {
pkgdesc="Xorg server common files"
depends=('xkeyboard-config' 'xorg-xkbcomp' 'xorg-setxkbmap' 'xorg-fonts-misc' 'libunwind')
cd "${pkgbase}-${pkgver}"
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-common"
install -m644 COPYING "${pkgdir}/usr/share/licenses/xorg-server-common"
make -C xkb DESTDIR="${pkgdir}" install-data
install -m755 -d "${pkgdir}/usr/share/man/man1"
install -m644 man/Xserver.1 "${pkgdir}/usr/share/man/man1/"
install -m755 -d "${pkgdir}/usr/lib/xorg"
install -m644 dix/protocol.txt "${pkgdir}/usr/lib/xorg/"
package_xorg-server-noroot() {
pkgdesc="Xorg X server"
depends=('libepoxy' 'libxfont2' 'pixman' 'xorg-server-common' 'libunwind' 'libgl' 'xf86-input-libinput'
'libpciaccess' 'libdrm' 'libxshmfence')
# see xorg-server-*/hw/xfree86/common/xf86Module.h for ABI versions - we provide major numbers that drivers can depend on
# and /usr/lib/pkgconfig/xorg-server.pc in xorg-server-devel pkg
provides=('X-ABI-VIDEODRV_VERSION=23' 'X-ABI-XINPUT_VERSION=24.1' 'X-ABI-EXTENSION_VERSION=10.0' 'x-server' 'xorg-server')
conflicts=('nvidia-utils<=331.20' 'glamor-egl' 'xf86-video-modesetting' 'xorg-server')
replaces=('glamor-egl' 'xf86-video-modesetting' 'xorg-server')
optdepends=('xf86-video-nouveau: drivers for nvidia'
'xf86-video-intel: drivers for intel'
'xf86-video-ati: drivers for radeon'
'xf86-video-amdgpu: drivers for amdgpu'
'xf86-video-openchrome: drivers for openchrome'
'xf86-input-evdev: evdev input driver'
'xf86-input-keyboard: X.Org keyboard input driver'
'xf86-input-mouse: mouse input driver')
cd "${pkgbase}-${pkgver}"
make DESTDIR="${pkgdir}" install
# distro specific files must be installed in /usr/share/X11/xorg.conf.d
install -m755 -d "${pkgdir}/etc/X11/xorg.conf.d"
rm -rf "${pkgdir}/var"
rm -f "${pkgdir}/usr/share/man/man1/Xserver.1"
rm -f "${pkgdir}/usr/lib/xorg/protocol.txt"
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server"
ln -sf ../xorg-server-common/COPYING "${pkgdir}/usr/share/licenses/xorg-server/COPYING"
rm -rf "${pkgdir}/usr/lib/pkgconfig"
rm -rf "${pkgdir}/usr/include"
rm -rf "${pkgdir}/usr/share/aclocal"
package_xorg-server-xephyr-noroot() {
pkgdesc="A nested X server that runs as an X application"
depends=('libxfont2' 'libgl' 'libepoxy' 'libunwind' 'libxv' 'pixman' 'xorg-server-common' 'xcb-util-image'
'xcb-util-renderutil' 'xcb-util-wm' 'xcb-util-keysyms')
cd "${pkgbase}-${pkgver}/hw/kdrive"
make DESTDIR="${pkgdir}" install
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-xephyr"
ln -sf ../xorg-server-common/COPYING "${pkgdir}/usr/share/licenses/xorg-server-xephyr/COPYING"
package_xorg-server-xvfb-noroot() {
pkgdesc="Virtual framebuffer X server"
depends=('libxfont2' 'libunwind' 'pixman' 'xorg-server-common' 'xorg-xauth' 'libgl')
cd "${pkgbase}-${pkgver}/hw/vfb"
make DESTDIR="${pkgdir}" install
install -m755 "${srcdir}/xvfb-run" "${pkgdir}/usr/bin/"
install -m644 "${srcdir}/xvfb-run.1" "${pkgdir}/usr/share/man/man1/"
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-xvfb"
ln -sf ../xorg-server-common/COPYING "${pkgdir}/usr/share/licenses/xorg-server-xvfb/COPYING"
package_xorg-server-xnest-noroot() {
pkgdesc="A nested X server that runs as an X application"
depends=('libxfont2' 'libxext' 'libunwind' 'pixman' 'xorg-server-common')
cd "${pkgbase}-${pkgver}/hw/xnest"
make DESTDIR="${pkgdir}" install
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-xnest"
ln -sf ../xorg-server-common/COPYING "${pkgdir}/usr/share/licenses/xorg-server-xnest/COPYING"
package_xorg-server-xdmx-noroot() {
pkgdesc="Distributed Multihead X Server and utilities"
depends=('libxfont2' 'libxi' 'libxaw' 'libxrender' 'libdmx' 'libxfixes' 'libunwind' 'pixman' 'xorg-server-common')
cd "${pkgbase}-${pkgver}/hw/dmx"
make DESTDIR="${pkgdir}" install
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-xdmx"
ln -sf ../xorg-server-common/COPYING "${pkgdir}/usr/share/licenses/xorg-server-xdmx/COPYING"
package_xorg-server-xwayland-noroot() {
pkgdesc="run X clients under wayland"
depends=('libxfont2' 'libepoxy' 'libunwind' 'libgl' 'pixman' 'xorg-server-common')
cd "${pkgbase}-${pkgver}/hw/xwayland"
make DESTDIR="${pkgdir}" install
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-xwayland"
ln -sf ../xorg-server-common/COPYING "${pkgdir}/usr/share/licenses/xorg-server-xwayland/COPYING"
package_xorg-server-devel-noroot() {
pkgdesc="Development files for the X.Org X server"
depends=(# see pkgdir/usr/lib/pkgconfig/xorg-server.pc
'xproto' 'randrproto' 'renderproto' 'xextproto' 'inputproto' 'kbproto'
'fontsproto' 'pixman' 'videoproto' 'xf86driproto' 'glproto'
'mesa' 'dri2proto' 'dri3proto' 'xineramaproto' 'libpciaccess'
'resourceproto' 'scrnsaverproto' 'presentproto'
# not technically required but almost every Xorg pkg needs it to build
cd "${pkgbase}-${pkgver}"
make DESTDIR="${pkgdir}" install
rm -rf "${pkgdir}/usr/bin"
rm -rf "${pkgdir}/usr/share/man"
rm -rf "${pkgdir}/usr/share/doc"
rm -rf "${pkgdir}/usr/share/X11"
rm -rf "${pkgdir}/usr/lib/xorg"
rm -rf "${pkgdir}/usr/lib/xorg-server"
rm -rf "${pkgdir}/var"
install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-devel"
ln -sf ../xorg-server-common/COPYING "${pkgdir}/usr/share/licenses/xorg-server-devel/COPYING"
From fe0b297420fc1de8a7fab28457d0864b3182e967 Mon Sep 17 00:00:00 2001
From: Eric Anholt <>
Date: Wed, 15 Mar 2017 17:51:46 -0700
Subject: glamor: Fix dashed line rendering.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
We were binding the screen pixmap as the dash and sampling its alpha,
which is usually just 1.0 (no dashing at all).
Please cherry-pick this to active stable branches.
Signed-off-by: Eric Anholt <>
Reviewed-by: Keith Packard <>
Reviewed-by: Michel Dänzer <>
diff --git a/glamor/glamor_dash.c b/glamor/glamor_dash.c
index 78a4fa3..b53ce5c 100644
--- a/glamor/glamor_dash.c
+++ b/glamor/glamor_dash.c
@@ -147,7 +147,7 @@ glamor_dash_setup(DrawablePtr drawable, GCPtr gc)
goto bail;
dash_pixmap = glamor_get_dash_pixmap(gc);
- dash_priv = glamor_get_pixmap_private(pixmap);
+ dash_priv = glamor_get_pixmap_private(dash_pixmap);
goto bail;
cgit v0.10.2
From 0c8e6ed85810e96d84173a52d628863802a78d82 Mon Sep 17 00:00:00 2001
From: Daniel Stone <>
Date: Fri, 7 Apr 2017 14:27:58 +0100
Subject: [PATCH] modesetting: Set correct DRM event context version
DRM_EVENT_CONTEXT_VERSION is the latest context version supported by
whatever version of libdrm is present. modesetting was blindly asserting
it supported whatever version that may be, even if it actually didn't.
With libdrm 2.4.78, setting a higher context version than 2 will attempt
to call the page_flip_handler2 vfunc if it was non-NULL, which being a
random chunk of stack memory, it might well have been.
Set the version as 2, which should be bumped only with the appropriate
version checks.
Reviewed-by: Adam Jackson <>
Signed-off-by: Daniel Stone <>
hw/xfree86/drivers/modesetting/vblank.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c
index 04a8952..8682f4d 100644
--- a/hw/xfree86/drivers/modesetting/vblank.c
+++ b/hw/xfree86/drivers/modesetting/vblank.c
@@ -402,7 +402,7 @@ ms_vblank_screen_init(ScreenPtr screen)
modesettingEntPtr ms_ent = ms_ent_priv(scrn);
- ms->event_context.version = DRM_EVENT_CONTEXT_VERSION;
+ ms->event_context.version = 2;
ms->event_context.vblank_handler = ms_drm_handler;
ms->event_context.page_flip_handler = ms_drm_handler;
This diff is collapsed.
post_install() {
chown -v :input /usr/bin/Xorg
chmod -v g+s /usr/bin/Xorg
cat <<MSG
>>> Xserver will fail to run if not launched from the same virtual
terminal as was used to log in.
Without root rights, log files will be in ~/.local/share/xorg/ directory.
post_upgrade() {
post_install $1
From 4471df41ea6e94834a2b10643ca7fcd69682d276 Mon Sep 17 00:00:00 2001
From: Dave Airlie <>
Date: Fri, 17 Aug 2012 09:49:24 +1000
Subject: [PATCH xserver v3] autobind GPUs to the screen
This is a modified version of a patch we've been carry-ing in Fedora and
RHEL for years now. This patch automatically adds secondary GPUs to the
master as output sink / offload source making e.g. the use of
slave-outputs just work, with requiring the user to manually run
"xrandr --setprovideroutputsource" before he can hookup an external
monitor to his hybrid graphics laptop.
There is one problem with this patch, which is why it was not upstreamed
before. What to do when a secondary GPU gets detected really is a policy
decission (e.g. one may want to autobind PCI GPUs but not USB ones) and
as such should be under control of the Desktop Environment.
Unconditionally adding autobinding support to the xserver will result
in races between the DE dealing with the hotplug of a secondary GPU
and the server itself dealing with it.
However we've waited for years for any Desktop Environments to actually
start doing some sort of autoconfiguration of secondary GPUs and there
is still not a single DE dealing with this, so I believe that it is
time to upstream this now.
To avoid potential future problems if any DEs get support for doing
secondary GPU configuration themselves, the new autobind functionality
is made optional. Since no DEs currently support doing this themselves it
is enabled by default. When DEs grow support for doing this themselves
they can disable the servers autobinding through the servers cmdline or a
xorg.conf snippet.
Signed-off-by: Dave Airlie <>
[ Make configurable, fix with nvidia, submit upstream]
Signed-off-by: Hans de Goede <>
Changes in v2:
-Make the default enabled instead of installing a xorg.conf
snippet which enables it unconditionally
Changes in v3:
-Handle GPUScreen autoconfig in randr/rrprovider.c, looking at
rrScrPriv->provider, rather then in hw/xfree86/modes/xf86Crtc.c
looking at xf86CrtcConfig->provider. This fixes the autoconfig not
working with the nvidia binary driver
hw/xfree86/common/xf86Config.c | 19 +++++++++++++++++++
hw/xfree86/common/xf86Globals.c | 2 ++
hw/xfree86/common/xf86Init.c | 20 ++++++++++++++++++++
hw/xfree86/common/xf86Priv.h | 1 +
hw/xfree86/common/xf86Privstr.h | 1 +
hw/xfree86/common/xf86platformBus.c | 4 ++++
hw/xfree86/man/ | 7 +++++++
hw/xfree86/man/ | 6 ++++++
randr/randrstr.h | 3 +++
randr/rrprovider.c | 22 ++++++++++++++++++++++
10 files changed, 85 insertions(+)
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 21daf1a..df3ca50 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -719,6 +719,7 @@ typedef enum {
} FlagValues;
@@ -778,6 +779,8 @@ static OptionInfoRec FlagOptions[] = {
{0}, FALSE},
{0}, FALSE},
+ {0}, FALSE},
{0}, FALSE },
@@ -857,6 +860,22 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
xf86Msg(from, "%sutomatically adding GPU devices\n",
xf86Info.autoAddGPU ? "A" : "Not a");
+ if (xf86AutoBindGPUDisabled) {
+ xf86Info.autoBindGPU = FALSE;
+ from = X_CMDLINE;
+ }
+ else if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_BIND_GPU)) {