Make failure to iopl non-fatal
This commit is contained in:
parent
1b5034bf0e
commit
a33d443916
136
0001-linux-Refactor-xf86-En-Dis-ableIO.patch
Normal file
136
0001-linux-Refactor-xf86-En-Dis-ableIO.patch
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
From c02d0e62ca9d073ddd13b4b7493ade16fbc15ade Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Tue, 26 Jun 2012 13:12:45 -0400
|
||||||
|
Subject: [PATCH 1/3] linux: Refactor xf86{En,Dis}ableIO
|
||||||
|
|
||||||
|
Pull platform methods into their own sections for legibility, and
|
||||||
|
rewrite the ifdefs to be more concise.
|
||||||
|
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
---
|
||||||
|
hw/xfree86/os-support/linux/lnx_video.c | 82 ++++++++++++++++++-------------
|
||||||
|
1 files changed, 48 insertions(+), 34 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c
|
||||||
|
index 3526a21..895a79b 100644
|
||||||
|
--- a/hw/xfree86/os-support/linux/lnx_video.c
|
||||||
|
+++ b/hw/xfree86/os-support/linux/lnx_video.c
|
||||||
|
@@ -479,39 +479,36 @@ volatile unsigned char *ioBase = NULL;
|
||||||
|
#define __NR_pciconfig_iobase 200
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
-Bool
|
||||||
|
-xf86EnableIO(void)
|
||||||
|
+static Bool
|
||||||
|
+hwEnableIO(void)
|
||||||
|
{
|
||||||
|
-#if defined(__powerpc__)
|
||||||
|
int fd;
|
||||||
|
- unsigned int ioBase_phys;
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
- if (ExtendedEnabled)
|
||||||
|
- return TRUE;
|
||||||
|
-
|
||||||
|
-#if defined(__powerpc__)
|
||||||
|
- ioBase_phys = syscall(__NR_pciconfig_iobase, 2, 0, 0);
|
||||||
|
+ unsigned int ioBase_phys = syscall(__NR_pciconfig_iobase, 2, 0, 0);
|
||||||
|
|
||||||
|
fd = open("/dev/mem", O_RDWR);
|
||||||
|
if (ioBase == NULL) {
|
||||||
|
ioBase = (volatile unsigned char *) mmap(0, 0x20000,
|
||||||
|
PROT_READ | PROT_WRITE,
|
||||||
|
MAP_SHARED, fd, ioBase_phys);
|
||||||
|
-/* Should this be fatal or just a warning? */
|
||||||
|
-#if 0
|
||||||
|
- if (ioBase == MAP_FAILED) {
|
||||||
|
- xf86Msg(X_WARNING,
|
||||||
|
- "xf86EnableIOPorts: Failed to map iobase (%s)\n",
|
||||||
|
- strerror(errno));
|
||||||
|
- return FALSE;
|
||||||
|
- }
|
||||||
|
-#endif
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
-#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && !defined(__arm__) && !defined(__m32r__) && !defined(__nds32__)
|
||||||
|
+
|
||||||
|
+ return ioBase != MAP_FAILED;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+hwDisableIO(void)
|
||||||
|
+{
|
||||||
|
+ munmap(ioBase, 0x20000);
|
||||||
|
+ ioBase = NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#elif defined(__i386__) || defined(__x86_64__) || defined(__ia64__) || \
|
||||||
|
+ defined(__alpha__)
|
||||||
|
+
|
||||||
|
+static Bool
|
||||||
|
+hwEnableIO(void)
|
||||||
|
+{
|
||||||
|
if (ioperm(0, 1024, 1) || iopl(3)) {
|
||||||
|
if (errno == ENODEV)
|
||||||
|
ErrorF("xf86EnableIOPorts: no I/O ports found\n");
|
||||||
|
@@ -526,27 +523,44 @@ xf86EnableIO(void)
|
||||||
|
ioperm(0x40, 4, 0); /* trap access to the timer chip */
|
||||||
|
ioperm(0x60, 4, 0); /* trap access to the keyboard controller */
|
||||||
|
#endif
|
||||||
|
-#endif
|
||||||
|
- ExtendedEnabled = TRUE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+hwDisableIO(void)
|
||||||
|
+{
|
||||||
|
+ iopl(0);
|
||||||
|
+ ioperm(0, 1024, 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#else /* non-IO architectures */
|
||||||
|
+
|
||||||
|
+#define hwEnableIO() TRUE
|
||||||
|
+#define hwDisableIO() do {} while (0)
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+Bool
|
||||||
|
+xf86EnableIO(void)
|
||||||
|
+{
|
||||||
|
+ if (ExtendedEnabled)
|
||||||
|
+ return TRUE;
|
||||||
|
+
|
||||||
|
+ ExtendedEnabled = hwEnableIO();
|
||||||
|
+
|
||||||
|
+ return ExtendedEnabled;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void
|
||||||
|
xf86DisableIO(void)
|
||||||
|
{
|
||||||
|
if (!ExtendedEnabled)
|
||||||
|
return;
|
||||||
|
-#if defined(__powerpc__)
|
||||||
|
- munmap(ioBase, 0x20000);
|
||||||
|
- ioBase = NULL;
|
||||||
|
-#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__arm__) && !defined(__s390__) && !defined(__m32r__) && !defined(__nds32__)
|
||||||
|
- iopl(0);
|
||||||
|
- ioperm(0, 1024, 0);
|
||||||
|
-#endif
|
||||||
|
- ExtendedEnabled = FALSE;
|
||||||
|
|
||||||
|
- return;
|
||||||
|
+ hwDisableIO();
|
||||||
|
+
|
||||||
|
+ ExtendedEnabled = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined (__alpha__)
|
||||||
|
--
|
||||||
|
1.7.7.6
|
||||||
|
|
40
0002-linux-Make-failure-to-iopl-non-fatal.patch
Normal file
40
0002-linux-Make-failure-to-iopl-non-fatal.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From e47530e266b8e7f84004978e9fd247b5e6df0fb7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Tue, 26 Jun 2012 13:15:45 -0400
|
||||||
|
Subject: [PATCH 2/3] linux: Make failure to iopl non-fatal
|
||||||
|
|
||||||
|
We load the driver list, then enable I/O, then call driver probe based
|
||||||
|
on whether I/O enable succeeded. That's bad, because the loaded
|
||||||
|
security policy might forbid port access. We happen to treat that as
|
||||||
|
fatal for some reason, which means even drivers that don't need I/O
|
||||||
|
access (like kms and fbdev) don't get the chance to run. Facepalm.
|
||||||
|
|
||||||
|
How about we just make that non-fatal instead, that sounds like a much
|
||||||
|
better plan.
|
||||||
|
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
---
|
||||||
|
hw/xfree86/os-support/linux/lnx_video.c | 7 ++-----
|
||||||
|
1 files changed, 2 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c
|
||||||
|
index 895a79b..d9a5da1 100644
|
||||||
|
--- a/hw/xfree86/os-support/linux/lnx_video.c
|
||||||
|
+++ b/hw/xfree86/os-support/linux/lnx_video.c
|
||||||
|
@@ -510,11 +510,8 @@ static Bool
|
||||||
|
hwEnableIO(void)
|
||||||
|
{
|
||||||
|
if (ioperm(0, 1024, 1) || iopl(3)) {
|
||||||
|
- if (errno == ENODEV)
|
||||||
|
- ErrorF("xf86EnableIOPorts: no I/O ports found\n");
|
||||||
|
- else
|
||||||
|
- FatalError("xf86EnableIOPorts: failed to set IOPL"
|
||||||
|
- " for I/O (%s)\n", strerror(errno));
|
||||||
|
+ ErrorF("xf86EnableIOPorts: failed to set IOPL for I/O (%s)\n",
|
||||||
|
+ strerror(errno));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#if !defined(__alpha__)
|
||||||
|
--
|
||||||
|
1.7.7.6
|
||||||
|
|
163
0003-xfree86-Change-the-semantics-of-driverFunc-GET_REQUI.patch
Normal file
163
0003-xfree86-Change-the-semantics-of-driverFunc-GET_REQUI.patch
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
From d9ea0f90f87c3cf2d8382a1e8a6ae30e58a419b3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Tue, 26 Jun 2012 14:32:31 -0400
|
||||||
|
Subject: [PATCH 3/3] xfree86: Change the semantics of
|
||||||
|
driverFunc(GET_REQUIRED_HW_INTERFACES)
|
||||||
|
|
||||||
|
This is a really awkward interface, since we're calling it well before
|
||||||
|
the driver knows what device it's going to drive. Drivers with both KMS
|
||||||
|
and UMS support therefore don't know whether to say they need I/O port
|
||||||
|
access or not, and have to assume they do.
|
||||||
|
|
||||||
|
With this change we now call it only to query whether port access might
|
||||||
|
be needed; we don't use that to determine whether to call a driver's
|
||||||
|
probe function or not, instead we call them unconditionally. If the
|
||||||
|
driver doesn't check whether port access was enabled, they might crash
|
||||||
|
ungracefully. To accomodate this, we move xorgHWAccess to be explicitly
|
||||||
|
intentionally exported (sigh xf86Priv.h) so that drivers can check that
|
||||||
|
before they attempt port access.
|
||||||
|
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
---
|
||||||
|
hw/xfree86/common/xf86.h | 1 +
|
||||||
|
hw/xfree86/common/xf86Bus.c | 11 -----------
|
||||||
|
hw/xfree86/common/xf86Configure.c | 27 +--------------------------
|
||||||
|
hw/xfree86/common/xf86Init.c | 23 +++++++++++------------
|
||||||
|
hw/xfree86/common/xf86Priv.h | 1 -
|
||||||
|
5 files changed, 13 insertions(+), 50 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
|
||||||
|
index 129660d..913f206 100644
|
||||||
|
--- a/hw/xfree86/common/xf86.h
|
||||||
|
+++ b/hw/xfree86/common/xf86.h
|
||||||
|
@@ -55,6 +55,7 @@
|
||||||
|
extern _X_EXPORT int xf86DoConfigure;
|
||||||
|
extern _X_EXPORT int xf86DoShowOptions;
|
||||||
|
extern _X_EXPORT Bool xf86DoConfigurePass1;
|
||||||
|
+extern _X_EXPORT Bool xorgHWAccess;
|
||||||
|
|
||||||
|
extern _X_EXPORT DevPrivateKeyRec xf86ScreenKeyRec;
|
||||||
|
|
||||||
|
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
|
||||||
|
index 6c86f5e..4ea88aa 100644
|
||||||
|
--- a/hw/xfree86/common/xf86Bus.c
|
||||||
|
+++ b/hw/xfree86/common/xf86Bus.c
|
||||||
|
@@ -119,17 +119,6 @@ xf86BusConfig(void)
|
||||||
|
* instance of the hardware found.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < xf86NumDrivers; i++) {
|
||||||
|
- xorgHWFlags flags;
|
||||||
|
-
|
||||||
|
- if (!xorgHWAccess) {
|
||||||
|
- if (!xf86DriverList[i]->driverFunc
|
||||||
|
- || !xf86DriverList[i]->driverFunc(NULL,
|
||||||
|
- GET_REQUIRED_HW_INTERFACES,
|
||||||
|
- &flags)
|
||||||
|
- || NEED_IO_ENABLED(flags))
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
xf86CallDriverProbe(xf86DriverList[i], FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c
|
||||||
|
index 6f69117..6c5e359 100644
|
||||||
|
--- a/hw/xfree86/common/xf86Configure.c
|
||||||
|
+++ b/hw/xfree86/common/xf86Configure.c
|
||||||
|
@@ -545,41 +545,16 @@ DoConfigure(void)
|
||||||
|
|
||||||
|
free(vlist);
|
||||||
|
|
||||||
|
- for (i = 0; i < xf86NumDrivers; i++) {
|
||||||
|
- xorgHWFlags flags;
|
||||||
|
-
|
||||||
|
- if (!xf86DriverList[i]->driverFunc
|
||||||
|
- || !xf86DriverList[i]->driverFunc(NULL,
|
||||||
|
- GET_REQUIRED_HW_INTERFACES,
|
||||||
|
- &flags)
|
||||||
|
- || NEED_IO_ENABLED(flags)) {
|
||||||
|
- xorgHWAccess = TRUE;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- /* Enable full I/O access */
|
||||||
|
- if (xorgHWAccess) {
|
||||||
|
- if (!xf86EnableIO())
|
||||||
|
- /* oops, we have failed */
|
||||||
|
- xorgHWAccess = FALSE;
|
||||||
|
- }
|
||||||
|
+ xorgHWAccess = xf86EnableIO();
|
||||||
|
|
||||||
|
/* Create XF86Config file structure */
|
||||||
|
xf86config = calloc(1, sizeof(XF86ConfigRec));
|
||||||
|
|
||||||
|
/* Call all of the probe functions, reporting the results. */
|
||||||
|
for (CurrentDriver = 0; CurrentDriver < xf86NumDrivers; CurrentDriver++) {
|
||||||
|
- xorgHWFlags flags;
|
||||||
|
Bool found_screen;
|
||||||
|
DriverRec *const drv = xf86DriverList[CurrentDriver];
|
||||||
|
|
||||||
|
- if (!xorgHWAccess) {
|
||||||
|
- if (!drv->driverFunc
|
||||||
|
- || !drv->driverFunc(NULL, GET_REQUIRED_HW_INTERFACES, &flags)
|
||||||
|
- || NEED_IO_ENABLED(flags))
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
found_screen = xf86CallDriverProbe(drv, TRUE);
|
||||||
|
if (found_screen && drv->Identify) {
|
||||||
|
(*drv->Identify) (0);
|
||||||
|
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
|
||||||
|
index ca6efd4..581579e 100644
|
||||||
|
--- a/hw/xfree86/common/xf86Init.c
|
||||||
|
+++ b/hw/xfree86/common/xf86Init.c
|
||||||
|
@@ -527,23 +527,22 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (i = 0; i < xf86NumDrivers; i++) {
|
||||||
|
+ xorgHWFlags flags = HW_IO;
|
||||||
|
+
|
||||||
|
if (xf86DriverList[i]->Identify != NULL)
|
||||||
|
xf86DriverList[i]->Identify(0);
|
||||||
|
|
||||||
|
- if (!xorgHWAccess || !xorgHWOpenConsole) {
|
||||||
|
- xorgHWFlags flags;
|
||||||
|
+ if (xf86DriverList[i]->driverFunc)
|
||||||
|
+ xf86DriverList[i]->driverFunc(NULL,
|
||||||
|
+ GET_REQUIRED_HW_INTERFACES,
|
||||||
|
+ &flags);
|
||||||
|
|
||||||
|
- if (!xf86DriverList[i]->driverFunc
|
||||||
|
- || !xf86DriverList[i]->driverFunc(NULL,
|
||||||
|
- GET_REQUIRED_HW_INTERFACES,
|
||||||
|
- &flags))
|
||||||
|
- flags = HW_IO;
|
||||||
|
+ /* this is "do we want it" at this point */
|
||||||
|
+ if (NEED_IO_ENABLED(flags))
|
||||||
|
+ xorgHWAccess = TRUE;
|
||||||
|
|
||||||
|
- if (NEED_IO_ENABLED(flags))
|
||||||
|
- xorgHWAccess = TRUE;
|
||||||
|
- if (!(flags & HW_SKIP_CONSOLE))
|
||||||
|
- xorgHWOpenConsole = TRUE;
|
||||||
|
- }
|
||||||
|
+ if (!(flags & HW_SKIP_CONSOLE))
|
||||||
|
+ xorgHWOpenConsole = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xorgHWOpenConsole)
|
||||||
|
diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h
|
||||||
|
index 42a3b30..aeca2a9 100644
|
||||||
|
--- a/hw/xfree86/common/xf86Priv.h
|
||||||
|
+++ b/hw/xfree86/common/xf86Priv.h
|
||||||
|
@@ -91,7 +91,6 @@ extern _X_EXPORT int xf86NumScreens;
|
||||||
|
extern _X_EXPORT const char *xf86VisualNames[];
|
||||||
|
extern _X_EXPORT int xf86Verbose; /* verbosity level */
|
||||||
|
extern _X_EXPORT int xf86LogVerbose; /* log file verbosity level */
|
||||||
|
-extern _X_EXPORT Bool xorgHWAccess;
|
||||||
|
|
||||||
|
extern _X_EXPORT RootWinPropPtr *xf86RegisteredPropertiesTable;
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.7.6
|
||||||
|
|
@ -43,7 +43,7 @@
|
|||||||
Summary: X.Org X11 X server
|
Summary: X.Org X11 X server
|
||||||
Name: xorg-x11-server
|
Name: xorg-x11-server
|
||||||
Version: 1.12.99.903
|
Version: 1.12.99.903
|
||||||
Release: 5%{?gitdate:.%{gitdate}}%{dist}
|
Release: 6%{?gitdate:.%{gitdate}}%{dist}
|
||||||
URL: http://www.x.org
|
URL: http://www.x.org
|
||||||
License: MIT
|
License: MIT
|
||||||
Group: User Interface/X
|
Group: User Interface/X
|
||||||
@ -97,6 +97,10 @@ Patch7020: xserver-1.12-xkb-fill-in-keycode-and-event-type-for-slow-keys-ena.pat
|
|||||||
|
|
||||||
Patch7021: xserver-1.12.99-glx-fix.patch
|
Patch7021: xserver-1.12.99-glx-fix.patch
|
||||||
|
|
||||||
|
Patch7022: 0001-linux-Refactor-xf86-En-Dis-ableIO.patch
|
||||||
|
Patch7023: 0002-linux-Make-failure-to-iopl-non-fatal.patch
|
||||||
|
Patch7024: 0003-xfree86-Change-the-semantics-of-driverFunc-GET_REQUI.patch
|
||||||
|
|
||||||
%define moduledir %{_libdir}/xorg/modules
|
%define moduledir %{_libdir}/xorg/modules
|
||||||
%define drimoduledir %{_libdir}/dri
|
%define drimoduledir %{_libdir}/dri
|
||||||
%define sdkdir %{_includedir}/xorg
|
%define sdkdir %{_includedir}/xorg
|
||||||
@ -569,6 +573,9 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
%{xserver_source_dir}
|
%{xserver_source_dir}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Aug 03 2012 Adam Jackson <ajax@redhat.com> 1.12.99.903-6
|
||||||
|
- Make failure to iopl non-fatal
|
||||||
|
|
||||||
* Mon Jul 30 2012 Adam Jackson <ajax@redhat.com> 1.12.99.903-5
|
* Mon Jul 30 2012 Adam Jackson <ajax@redhat.com> 1.12.99.903-5
|
||||||
- No need to --disable-xaa explicitly anymore.
|
- No need to --disable-xaa explicitly anymore.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user