507 lines
13 KiB
Plaintext
507 lines
13 KiB
Plaintext
|
|
||
|
README for XFree86 OS-support Layer
|
||
|
-----------------------------------
|
||
|
|
||
|
Contents
|
||
|
--------
|
||
|
1) Overview
|
||
|
2) Directory Layout
|
||
|
3) Adding a new OS
|
||
|
4) OS Support API
|
||
|
|
||
|
1 - Overview
|
||
|
------------
|
||
|
This directory contains the OS support layer functions for the XFree86
|
||
|
servers. In addition, some miscellaneous server support functions (not
|
||
|
OS-dependent) are included here, to take advantage of the fact that this
|
||
|
library comes last in the linking order.
|
||
|
|
||
|
Most of the functionality required to support a new OS is encapsulated in
|
||
|
this library. It is hoped that all OS-specific details can be encapsulated,
|
||
|
but that is not likely ever to be completely possible. Hence some minor
|
||
|
changes will wind up being made in other parts of the server. The major
|
||
|
design principles for this library are maintainability, readability, and
|
||
|
portability. Sometimes these goals conflict; some somewhat arbitrary choices
|
||
|
have been made in implementation.
|
||
|
|
||
|
2 - Directory Layout
|
||
|
--------------------
|
||
|
os-support/ Contains headers and documentation; no code
|
||
|
misc/ Non-OS-specific miscellaneous functions that
|
||
|
fit best into the link architecture this way.
|
||
|
shared/ Contains files with functions used by more than one
|
||
|
OS. These are symlinked into the OS subdirectories
|
||
|
at build time via Imakefile rules. This is alway
|
||
|
preferable to reproducing functions in more than one
|
||
|
OS library.
|
||
|
bsd/ OS support for the 386BSD/NetBSD/FreeBSD operating
|
||
|
systems.
|
||
|
bsdi/ OS support for the BSD/386 operating system.
|
||
|
linux/ OS support for the Linux operating system.
|
||
|
os2/ OS support for OS/2 2.11 and OS/2 Warp
|
||
|
sco/ OS support for the SCO SVR3.x operating system.
|
||
|
solx86/ OS support for the Solaris x86 operating system.
|
||
|
sysv/ OS support for all SVR4.0 and SVR4.2, and for
|
||
|
ISC and AT&T SVR3.2 operating systems.
|
||
|
|
||
|
3 - Adding A New OS
|
||
|
-------------------
|
||
|
Adding a support for a new operating system entails implementing all of
|
||
|
the functions described in the API below. Many of these functions are no-ops
|
||
|
for many operating systems, and appropriate files with dummy declarations are
|
||
|
available in the 'shared' subdirectory.
|
||
|
|
||
|
If your OS is sufficiently similar to an existing OS, you can make use of
|
||
|
the existing subdirectory. One of the reasons for implementing this OS
|
||
|
library was the unmaintainability of the spagetti-#ifdef code that existed
|
||
|
before. You should try to avoid cluttering the code with #ifdef's. If
|
||
|
you find that the subdirectory is getting cluttered, split off into a
|
||
|
seperate subdirectory (e.g. as was done for SCO, rather than cluttering
|
||
|
the 'sysv' subdirectory). You can split functions out of an existing
|
||
|
subdirectory into the 'shared' subdirectory, if that is appropriate. Just
|
||
|
remember to update the Imakefile for the old subdirectory.
|
||
|
|
||
|
You will still likely have to make some small changes to other parts of
|
||
|
the server. You should not put OS-specific #define's or #include's anywhere
|
||
|
else in the server. These should all go in the "xf86_OSlib.h" header file
|
||
|
in this directory.
|
||
|
|
||
|
4 - OS Support API
|
||
|
-----------------
|
||
|
void xf86OpenConsole(void)
|
||
|
{
|
||
|
/*
|
||
|
* Open console device, activate VTs, etc, etc. Fill in requisite
|
||
|
* pieces of xf86Info. Most of this code comes from xf86Init.c
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86CloseConsole(void)
|
||
|
{
|
||
|
/*
|
||
|
* Close console at server exit.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
Bool xf86VTSwitchPending(void)
|
||
|
{
|
||
|
/*
|
||
|
* Returns TRUE iff there is a VT switch operation pending for
|
||
|
* the server. In the USL VT model, this is indicated via a
|
||
|
* signal handler. Should return FALSE always for OSs without
|
||
|
* VTs.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
Bool xf86VTSwitchAway(void)
|
||
|
{
|
||
|
/*
|
||
|
* Handles the OS-specific action for switching away from the active
|
||
|
* VT. Returns FALSE if the switch away fails. Should return
|
||
|
* FALSE always for OSs without VTs (then again, this function
|
||
|
* should never be called in that case).
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
Bool xf86VTSwitchTo(void)
|
||
|
{
|
||
|
/*
|
||
|
* Handles the OS-specific action for switching to the active VT.
|
||
|
* Returns FALSE if the switch to fails. Should return TRUE
|
||
|
* always for OSs without VTs (then again, this function should
|
||
|
* never be called in that case).
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
Bool xf86LinearVidMem(void)
|
||
|
{
|
||
|
/*
|
||
|
* Returns TRUE if the OS supports mapping linear frame buffers
|
||
|
* (ie memory at addresses above physical memory).
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
pointer xf86MapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||
|
{
|
||
|
/*
|
||
|
* Handle mapping the video memory. Returns (pointer *)0 for
|
||
|
* failure; causes server exit. It is allowable to call FatalError()
|
||
|
* from inside this function and exit directly.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86UnMapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||
|
{
|
||
|
/*
|
||
|
* Handle unmapping the video memory. This should undo what
|
||
|
* xf86MapVidMem() does. Base is a pointer obtained from
|
||
|
* a previous call to xf86MapVidMem().
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86MapDisplay(int ScreenNum, int Region)
|
||
|
{
|
||
|
/*
|
||
|
* For OSs that require the screen be mapped when entering a VT.
|
||
|
* A dummy function will be defined for OSs that don't require
|
||
|
* this (or don't have VTs at all).
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86UnMapDisplay(int ScreenNum, int Region)
|
||
|
{
|
||
|
/*
|
||
|
* For Os that require that the screen be unmapped when leaving a
|
||
|
* VT. A dummy function will be defined for OSs that don't require
|
||
|
* this (or don't have VTs at all).
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86ReadBIOS(unsigned long Base, unsigned long Offset,
|
||
|
unsigned char *Buf, int Len)
|
||
|
{
|
||
|
/*
|
||
|
* Read Len bytes from the BIOS at address Base, offset Offset,
|
||
|
* into buffer Buf. Returns -1 for failure or if the OS does
|
||
|
* not support reading the BIOS. This causes a driver probe
|
||
|
* to fail, but does not cause the server to abort.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
|
||
|
void xf86EnableIOPorts(int ScreenNum)
|
||
|
{
|
||
|
/*
|
||
|
* Enables I/O permissions. The OS layer should
|
||
|
* enable all I/O port access.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86DisableIOPorts(int ScreenNum)
|
||
|
{
|
||
|
/*
|
||
|
* Disables I/O permissions.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
Bool xf86DisableInterrupts(void)
|
||
|
{
|
||
|
/*
|
||
|
* Disable interrupts if allowed for this OS. Returns FALSE if
|
||
|
* this is not allowed or if the attempt fails for some reason.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86EnableInterrupts(void)
|
||
|
{
|
||
|
/*
|
||
|
* Reenable interrupts
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86ProcessArgument(int argc, char *argv[], int i)
|
||
|
{
|
||
|
/*
|
||
|
* Process OS-specific command-line arguments. See
|
||
|
* ddxProcessArgument() for more info.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86UseMsg(void)
|
||
|
{
|
||
|
/*
|
||
|
* Print list of OS-specific command-line arguments. See
|
||
|
* ddxUseMsg() for more info.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||
|
{
|
||
|
/*
|
||
|
* Sound the keyboard bell. pitch is in Hz, duration in ms,
|
||
|
* loudness is in the range 0-100 (0 -> off). For systems
|
||
|
* where the loudness can't be controlled, scale the duration
|
||
|
* by loudness/50.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86SetKbdLeds(int leds)
|
||
|
{
|
||
|
/*
|
||
|
* Set the keyboard LEDs to the state indicated in leds
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86GetKbdLeds(void)
|
||
|
{
|
||
|
/*
|
||
|
* Return the state of the keyboard LEDs. If the OS doesn't
|
||
|
* support this, return 0.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86SetKbdRepeat(char rad)
|
||
|
{
|
||
|
/*
|
||
|
* Set the keyboard repeat rate and delay according the
|
||
|
* the rad value. The lower 5 bits determine the repeat
|
||
|
* rate (lower value -> higher rate). The next 2 bits
|
||
|
* determine the delay.
|
||
|
* This should possibly be changed to take separate rate and
|
||
|
* delay parameters.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86KbdInit(void)
|
||
|
{
|
||
|
/*
|
||
|
* Save initial keyboard state. This is called at the start of
|
||
|
* each server generation.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86KbdOn(void)
|
||
|
{
|
||
|
/*
|
||
|
* Set the keyboard up for use with X. This is called whenever
|
||
|
* the server becomes active (ie at the start of each generation and
|
||
|
* whenever its VT becomes active). Return the file descriptor
|
||
|
* for keyboard input. Return -1 if there is no file descriptor
|
||
|
* to add as an input device. If there are errors encountered,
|
||
|
* call FatalError(). A return value of -1 is not considered an
|
||
|
* error condition.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86KbdOff(void)
|
||
|
{
|
||
|
/*
|
||
|
* Return the keyboard to the state saved by xf86KbdInit(). This is
|
||
|
* called at the end of a server generation, and also when the
|
||
|
* server's VT ceases being active. Returns the keyboard file
|
||
|
* descriptor. Returns -1 if there is no file descriptor to be
|
||
|
* removed as an input device. Errors should be handled the same
|
||
|
* way as in xf86KbdOn().
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86KbdEvents(void)
|
||
|
{
|
||
|
/*
|
||
|
* Read characters from the keyboard device, and post the events
|
||
|
* by calling xf86PostKbdEvent(). Read as much as is available
|
||
|
* without waiting.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86SetMouseSpeed(int old, int new, unsigned cflag)
|
||
|
{
|
||
|
/*
|
||
|
* Set the speed of the mouse port. old is the previous speed,
|
||
|
* new is the new speed, and cflag is the value of the termio[s]
|
||
|
* c_cflag field. For mice that have programmable speed operation,
|
||
|
* this should send the appropriate commands to the mouse.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86MouseInit(void)
|
||
|
{
|
||
|
/*
|
||
|
* This is called at the start of each server generation. In most
|
||
|
* cases this is a noop. If the mouse must not be opened/closed
|
||
|
* when VT switching, the open should be done here.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86MousedOn(void)
|
||
|
{
|
||
|
/*
|
||
|
* Set the mouse up for use with X. This is called whenever
|
||
|
* the server becomes active (ie at the start of each generation and
|
||
|
* whenever its VT becomes active). This function normally opens
|
||
|
* the mouse device, and may call xf86SetupMouse() to initialise
|
||
|
* the mouse parameters. Return the file descriptor for mouse input.
|
||
|
* Return -1 if there is no file descriptor to add as an input
|
||
|
* device. If there are errors encountered, call FatalError().
|
||
|
* A return value of -1 is not considered an error condition.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86MouseOff(Bool doclose)
|
||
|
{
|
||
|
/*
|
||
|
* Release the mouse from use with X. This is called at the end
|
||
|
* of a server generation (with doclose==TRUE), and also when the
|
||
|
* server's VT ceases being active (with doclose==FALSE). If the
|
||
|
* mouse should not be opened/closed when VT switching, the close
|
||
|
* should be done here when doclose==TRUE. For other systems, the
|
||
|
* mouse device should be closed regardless of the doclose value.
|
||
|
* Returns the mouse file descriptor. Returns -1 if there is no
|
||
|
* file descriptor to be removed as an input device. Errors
|
||
|
* should be handled the same way as in xf86MouseOn().
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86MouseEvents(void)
|
||
|
{
|
||
|
/*
|
||
|
* Read characters from the mouse device, and post the events
|
||
|
* by calling xf86PostMseEvent(). Read as much as is available
|
||
|
* without waiting. If the OS doesn't handle the mouse protocol
|
||
|
* translation, xf86MouseProtocol() may be called to do the
|
||
|
* translation and event posting. If the OS does handle the protocol
|
||
|
* translation, MOUSE_PROTOCOL_IN_KERNEL should be #define'd in
|
||
|
* xf86_OSlib.h.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86OsMouseProc(DevicePtr pPointer, int what)
|
||
|
{
|
||
|
/*
|
||
|
* Implements the device-proc for the pointer device when an
|
||
|
* OS-based mouse driver is being used (as opposed to the
|
||
|
* server's internal mouse driver). Implemented as any other
|
||
|
* device-proc in the server.
|
||
|
*
|
||
|
* This function only needs to be implemented if USE_OSMOUSE is
|
||
|
* defined for the OS.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
int xf86OsMouseEvents(void)
|
||
|
{
|
||
|
/*
|
||
|
* When supporting an OS-based mouse driver (as opposed to the
|
||
|
* server's internal mouse driver), read some events from the device
|
||
|
* and post them to the DIX layer through xf86PostMseEvent().
|
||
|
*
|
||
|
* This function only needs to be implemented if USE_OSMOUSE is
|
||
|
* defined for the OS.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
void xf86OsMouseOption(int token, pointer lex_ptr)
|
||
|
{
|
||
|
/*
|
||
|
* Used in parsing an OsMouse keyword from the Xconfig file.
|
||
|
* Passed the token type and a pointer to the token value.
|
||
|
* The function should do whatever is appropriate for the OS's
|
||
|
* mouse driver.
|
||
|
*
|
||
|
* This function only needs to be implemented if USE_OSMOUSE is
|
||
|
* defined for the OS.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* The following functions are simply wrappers around the OS specific
|
||
|
* libc functions
|
||
|
*/
|
||
|
|
||
|
void *
|
||
|
xf86memmove(void * dest, const void * src, INT32 n)
|
||
|
{
|
||
|
return(memmove(dest,src,n));
|
||
|
}
|
||
|
|
||
|
void *
|
||
|
xf86memset(void * s, int c, INT32 n)
|
||
|
{
|
||
|
return(memset(s,c,n));
|
||
|
}
|
||
|
|
||
|
void *
|
||
|
xf86memcpy(void * dest, const void * src, INT32 n)
|
||
|
{
|
||
|
return(memcpy(dest,src,n));
|
||
|
}
|
||
|
|
||
|
int
|
||
|
xf86memcmp(const void * s1, const void * s2, INT32 n)
|
||
|
{
|
||
|
return(memcmp(s1,s2,n));
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
xf86strcat(char * dest, const char * src)
|
||
|
{
|
||
|
return(strcat(dest,src));
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
xf86strcpy(char * dest, const char * src)
|
||
|
{
|
||
|
return(strcpy(dest,src));
|
||
|
}
|
||
|
|
||
|
int
|
||
|
xf86strcmp(const char * s1, const char * s2)
|
||
|
{
|
||
|
return(strcmp(s1,s2));
|
||
|
}
|
||
|
|
||
|
int
|
||
|
xf86strncmp(const char * s1, const char * s2, INT32 n)
|
||
|
{
|
||
|
return(strncmp(s1,s2,n));
|
||
|
}
|
||
|
|
||
|
size_t
|
||
|
xf86strlen(const char * s)
|
||
|
{
|
||
|
return(strlen(s));
|
||
|
}
|
||
|
|
||
|
void
|
||
|
xf86getsecs(INT32 * secs, INT32 * usecs)
|
||
|
{
|
||
|
struct timeval tv;
|
||
|
|
||
|
gettimeofday(&tv, NULL);
|
||
|
*secs = tv.tv_sec;
|
||
|
*usecs= tv.tv_usec;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
double
|
||
|
xf86exp(double x)
|
||
|
{
|
||
|
return(exp(x));
|
||
|
}
|
||
|
|
||
|
double
|
||
|
xf86log(double x)
|
||
|
{
|
||
|
return(log(x));
|
||
|
}
|
||
|
|
||
|
double
|
||
|
xf86pow(double x, double y)
|
||
|
{
|
||
|
return(pow(x,y));
|
||
|
}
|
||
|
|
||
|
double
|
||
|
xf86sqrt(double x)
|
||
|
{
|
||
|
return(sqrt(x));
|
||
|
}
|
||
|
|
||
|
double
|
||
|
xf86cos(double x)
|
||
|
{
|
||
|
return(cos(x));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
$XFree86: xc/programs/Xserver/hw/xfree86/os-support/README.OS-lib,v 3.10 2001/12/17 20:00:45 dawes Exp $
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
$XConsortium: README.OS-lib /main/5 1996/02/21 17:50:28 kaleb $
|