Bugzilla #884: OpenBSD/amd64 support.

This commit is contained in:
Matthieu Herrb 2004-07-24 16:32:39 +00:00
parent cc3e0173d9
commit 5fdff8b95e
2 changed files with 137 additions and 20 deletions

View File

@ -1,4 +1,4 @@
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/i386_video.c,v 1.3 2003/03/14 13:46:03 tsi Exp $ */
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/i386_video.c,v 1.4 2003/09/24 02:43:34 dawes Exp $ */
/*
* Copyright 1992 by Rich Murphey <Rich@Rice.edu>
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
@ -46,6 +46,11 @@
#include <sys/queue.h>
#endif
#if defined(__OpenBSD__) && defined(__amd64__)
#include <machine/mtrr.h>
#include <machine/sysarch.h>
#endif
#include "xf86_OSlib.h"
#include "xf86OSpriv.h"
@ -62,11 +67,11 @@
#ifdef __OpenBSD__
#define SYSCTL_MSG "\tCheck that you have set 'machdep.allowaperture=1'\n"\
"\tin /etc/sysctl.conf and reboot your machine\n" \
"\trefer to xf86(4) for details\n"
"\trefer to xf86(4) for details"
#define SYSCTL_MSG2 \
"Check that you have set 'machdep.allowaperture=2'\n" \
"\tin /etc/sysctl.conf and reboot your machine\n" \
"\trefer to xf86(4) for details\n"
"\trefer to xf86(4) for details"
#endif
/***************************************************************************/
@ -94,7 +99,11 @@ static pointer NetBSDsetWC(int, unsigned long, unsigned long, Bool,
MessageType);
static void NetBSDundoWC(int, pointer);
#endif
#if defined(__amd64__) && defined(__OpenBSD__)
static pointer amd64setWC(int, unsigned long, unsigned long, Bool,
MessageType);
static void amd64undoWC(int, pointer);
#endif
/*
* Check if /dev/mem can be mmap'd. If it can't print a warning when
@ -205,6 +214,10 @@ xf86OSInitVidMem(VidMemInfoPtr pVidMem)
#if defined(HAS_MTRR_BUILTIN) && defined(__NetBSD__)
pVidMem->setWC = NetBSDsetWC;
pVidMem->undoWC = NetBSDundoWC;
#endif
#if defined(__amd64__) && defined(__OpenBSD__)
pVidMem->setWC = amd64setWC;
pVidMem->undoWC = amd64undoWC;
#endif
pVidMem->initialised = TRUE;
}
@ -220,7 +233,7 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
{
if (devMemFd < 0)
{
FatalError("xf86MapVidMem: failed to open %s (%s)\n",
FatalError("xf86MapVidMem: failed to open %s (%s)",
DEV_MEM, strerror(errno));
}
base = mmap((caddr_t)0, Size,
@ -229,7 +242,7 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
MAP_FLAGS, devMemFd, (off_t)Base);
if (base == MAP_FAILED)
{
FatalError("%s: could not mmap %s [s=%x,a=%x] (%s)\n",
FatalError("%s: could not mmap %s [s=%lx,a=%lx] (%s)",
"xf86MapVidMem", DEV_MEM, Size, Base,
strerror(errno));
}
@ -239,7 +252,7 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
/* else, mmap /dev/vga */
if ((unsigned long)Base < 0xA0000 || (unsigned long)Base >= 0xC0000)
{
FatalError("%s: Address 0x%x outside allowable range\n",
FatalError("%s: Address 0x%lx outside allowable range",
"xf86MapVidMem", Base);
}
base = mmap(0, Size,
@ -250,7 +263,7 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
);
if (base == MAP_FAILED)
{
FatalError("xf86MapVidMem: Could not mmap /dev/vga (%s)\n",
FatalError("xf86MapVidMem: Could not mmap /dev/vga (%s)",
strerror(errno));
}
return(base);
@ -288,7 +301,7 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
if ((long)ptr == -1)
{
xf86Msg(X_WARNING,
"xf86ReadBIOS: %s mmap[s=%x,a=%x,o=%x] failed (%s)\n",
"xf86ReadBIOS: %s mmap[s=%x,a=%lx,o=%lx] failed (%s)\n",
DEV_MEM, Len, Base, Offset, strerror(errno));
#ifdef __OpenBSD__
if (Base < 0xa0000) {
@ -311,7 +324,6 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
return(Len);
}
#ifdef USE_I386_IOPL
/***************************************************************************/
/* I/O Permissions section */
@ -328,7 +340,7 @@ xf86EnableIO()
if (i386_iopl(TRUE) < 0)
{
#ifndef __OpenBSD__
FatalError("%s: Failed to set IOPL for extended I/O\n",
FatalError("%s: Failed to set IOPL for extended I/O",
"xf86EnableIO");
#else
FatalError("%s: Failed to set IOPL for extended I/O\n%s",
@ -354,6 +366,51 @@ xf86DisableIO()
#endif /* USE_I386_IOPL */
#ifdef USE_AMD64_IOPL
/***************************************************************************/
/* I/O Permissions section */
/***************************************************************************/
static Bool ExtendedEnabled = FALSE;
void
xf86EnableIO()
{
if (ExtendedEnabled)
return;
if (amd64_iopl(TRUE) < 0)
{
#ifndef __OpenBSD__
FatalError("%s: Failed to set IOPL for extended I/O",
"xf86EnableIO");
#else
FatalError("%s: Failed to set IOPL for extended I/O\n%s",
"xf86EnableIO", SYSCTL_MSG);
#endif
}
ExtendedEnabled = TRUE;
return;
}
void
xf86DisableIO()
{
if (!ExtendedEnabled)
return;
if (amd64_iopl(FALSE) == 0) {
ExtendedEnabled = FALSE;
}
/* Otherwise, the X server has revoqued its root uid,
and thus cannot give up IO privileges any more */
return;
}
#endif /* USE_AMD64_IOPL */
#ifdef USE_DEV_IO
static int IoFd = -1;
@ -366,7 +423,7 @@ xf86EnableIO()
if ((IoFd = open("/dev/io", O_RDWR)) == -1)
{
FatalError("xf86EnableIO: "
"Failed to open /dev/io for extended I/O\n");
"Failed to open /dev/io for extended I/O");
}
return;
}
@ -439,7 +496,7 @@ xf86SetTVOut(int mode)
#endif /* PCCONS_SUPPORT */
default:
FatalError("Xf86SetTVOut: Unsupported console\n");
FatalError("Xf86SetTVOut: Unsupported console");
break;
}
return;
@ -464,14 +521,13 @@ xf86SetRGBOut()
#endif /* PCCONS_SUPPORT */
default:
FatalError("Xf86SetTVOut: Unsupported console\n");
FatalError("Xf86SetTVOut: Unsupported console");
break;
}
return;
}
#endif
#ifdef HAS_MTRR_SUPPORT
/* memory range (MTRR) support for FreeBSD */
@ -879,3 +935,55 @@ NetBSDundoWC(int screenNum, pointer list)
xfree(mtrrp);
}
#endif
#if defined(__OpenBSD__) && defined(__amd64__)
static pointer
amd64setWC(int screenNum, unsigned long base, unsigned long size, Bool enable,
MessageType from)
{
struct mtrr *mtrrp;
int n;
xf86DrvMsg(screenNum, X_WARNING,
"%s MTRR %lx - %lx\n", enable ? "set" : "remove",
base, (base + size));
mtrrp = xnfalloc(sizeof (struct mtrr));
mtrrp->base = base;
mtrrp->len = size;
mtrrp->type = MTRR_TYPE_WC;
/*
* MTRR_PRIVATE will make this MTRR get reset automatically
* if this process exits, so we have no need for an explicit
* cleanup operation when starting a new server.
*/
if (enable)
mtrrp->flags = MTRR_VALID | MTRR_PRIVATE;
else
mtrrp->flags = 0;
n = 1;
if (amd64_set_mtrr(mtrrp, &n) < 0) {
xfree(mtrrp);
return NULL;
}
return mtrrp;
}
static void
amd64undoWC(int screenNum, pointer list)
{
struct mtrr *mtrrp = (struct mtrr *)list;
int n;
if (mtrrp == NULL)
return;
n = 1;
mtrrp->flags &= ~MTRR_VALID;
amd64_set_mtrr(mtrrp, &n);
xfree(mtrrp);
}
#endif /* OpenBSD/amd64 */

View File

@ -1,4 +1,4 @@
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSlib.h,v 3.93 2003/09/09 03:20:38 dawes Exp $ */
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSlib.h,v 3.94 2003/11/03 05:11:51 tsi Exp $ */
/*
* Copyright 1990, 1991 by Thomas Roell, Dinkelscherben, Germany
* Copyright 1992 by David Dawes <dawes@XFree86.org>
@ -102,7 +102,7 @@ typedef signed long xf86ssize_t;
/* SYSV386 (SVR3, SVR4) - But not Solaris8 */
/**************************************************************************/
#if (defined(SYSV) || defined(SVR4)) && \
!defined(DGUX) && \
!defined(DGUX) && !defined(sgi) && \
!defined(__SOL8__) && \
(!defined(sun) || defined(i386))
# ifdef SCO325
@ -532,7 +532,7 @@ extern int errno;
# endif
# endif /* __bsdi__ */
#ifdef USE_I386_IOPL
#if defined(USE_I386_IOPL) || defined(USE_AMD64_IOPL)
#include <machine/sysarch.h>
#endif
@ -670,6 +670,17 @@ extern char* __XOS2RedirRoot(char*);
#endif /* __GNU__ */
/**************************************************************************/
/* IRIX */
/**************************************************************************/
#if defined(sgi)
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#endif
/**************************************************************************/
/* Generic */
/**************************************************************************/
@ -717,9 +728,7 @@ extern int sys_nerr;
#if defined(ISC) || defined(Lynx)
#define rint(x) RInt(x)
double RInt(
#if NeedFunctionPrototypes
double x
#endif
);
#endif