Merge remote-tracking branch 'ajax/ioperm'
This commit is contained in:
commit
d01921ec18
|
@ -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;
|
||||
|
||||
|
|
|
@ -117,27 +117,12 @@ xf86BusConfig(void)
|
|||
screenLayoutPtr layout;
|
||||
int i, j;
|
||||
|
||||
/* Enable full I/O access */
|
||||
if (xorgHWAccess)
|
||||
xorgHWAccess = xf86EnableIO();
|
||||
|
||||
/*
|
||||
* Now call each of the Probe functions. Each successful probe will
|
||||
* result in an extra entry added to the xf86Screens[] list for each
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -402,6 +402,7 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
|
|||
Bool pix24Fail = FALSE;
|
||||
Bool autoconfig = FALSE;
|
||||
Bool sigio_blocked = FALSE;
|
||||
Bool want_hw_access = FALSE;
|
||||
GDevPtr configured_device;
|
||||
|
||||
xf86Initialising = TRUE;
|
||||
|
@ -530,23 +531,21 @@ 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;
|
||||
if (NEED_IO_ENABLED(flags))
|
||||
want_hw_access = TRUE;
|
||||
|
||||
if (NEED_IO_ENABLED(flags))
|
||||
xorgHWAccess = TRUE;
|
||||
if (!(flags & HW_SKIP_CONSOLE))
|
||||
xorgHWOpenConsole = TRUE;
|
||||
}
|
||||
if (!(flags & HW_SKIP_CONSOLE))
|
||||
xorgHWOpenConsole = TRUE;
|
||||
}
|
||||
|
||||
if (xorgHWOpenConsole)
|
||||
|
@ -554,6 +553,10 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
|
|||
else
|
||||
xf86Info.dontVTSwitch = TRUE;
|
||||
|
||||
/* Enable full I/O access */
|
||||
if (want_hw_access)
|
||||
xorgHWAccess = xf86EnableIO();
|
||||
|
||||
if (xf86BusConfig() == FALSE)
|
||||
return;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -479,45 +479,39 @@ 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");
|
||||
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 @@ 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__)
|
||||
|
|
Loading…
Reference in New Issue
Block a user