Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 338352 Details for
Bug 456220
x11-base/xorg-server on hardened - X exits fatally upon failure to enable sys_iopl
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Permit Xorg to function without iopl system call
01-iopl-nonfatal.patch (text/plain), 8.00 KB, created by
Dave Armstrong
on 2013-02-08 20:29:10 UTC
(
hide
)
Description:
Permit Xorg to function without iopl system call
Filename:
MIME Type:
Creator:
Dave Armstrong
Created:
2013-02-08 20:29:10 UTC
Size:
8.00 KB
patch
obsolete
>diff -r -u a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h >--- a/hw/xfree86/common/xf86.h 2012-10-25 00:41:02.000000000 -0400 >+++ b/hw/xfree86/common/xf86.h 2013-02-06 09:54:06.560035830 -0500 >@@ -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 -r -u a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c >--- a/hw/xfree86/common/xf86Bus.c 2012-11-02 00:17:59.000000000 -0400 >+++ b/hw/xfree86/common/xf86Bus.c 2013-02-06 09:54:06.560035830 -0500 >@@ -127,17 +127,6 @@ > * 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 -r -u a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c >--- a/hw/xfree86/common/xf86Configure.c 2012-10-13 19:38:50.000000000 -0400 >+++ b/hw/xfree86/common/xf86Configure.c 2013-02-06 09:54:06.560035830 -0500 >@@ -545,41 +545,16 @@ > > 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 -r -u a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c >--- a/hw/xfree86/common/xf86Init.c 2012-10-13 19:38:50.000000000 -0400 >+++ b/hw/xfree86/common/xf86Init.c 2013-02-06 09:54:06.560035830 -0500 >@@ -530,23 +530,22 @@ > */ > > 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); >+ >+ /* this is "do we want it" at this point */ >+ if (NEED_IO_ENABLED(flags)) >+ xorgHWAccess = TRUE; > >- if (!xf86DriverList[i]->driverFunc >- || !xf86DriverList[i]->driverFunc(NULL, >- GET_REQUIRED_HW_INTERFACES, >- &flags)) >- flags = HW_IO; >- >- if (NEED_IO_ENABLED(flags)) >- xorgHWAccess = TRUE; >- if (!(flags & HW_SKIP_CONSOLE)) >- xorgHWOpenConsole = TRUE; >- } >+ if (!(flags & HW_SKIP_CONSOLE)) >+ xorgHWOpenConsole = TRUE; > } > > if (xorgHWOpenConsole) >diff -r -u a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h >--- a/hw/xfree86/common/xf86Priv.h 2012-10-13 19:38:50.000000000 -0400 >+++ b/hw/xfree86/common/xf86Priv.h 2013-02-06 09:54:06.560035830 -0500 >@@ -91,7 +91,6 @@ > 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; > >diff -r -u a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c >--- a/hw/xfree86/os-support/linux/lnx_video.c 2012-10-13 19:38:51.000000000 -0400 >+++ b/hw/xfree86/os-support/linux/lnx_video.c 2013-02-06 09:47:22.710032993 -0500 >@@ -479,45 +479,39 @@ > #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"); >- 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__) >@@ -526,27 +520,44 @@ > 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__)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 456220
: 338352