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 $
 |