2006-11-26 11:13:41 -07:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* CONECTIVA LINUX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
|
|
|
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
* SOFTWARE.
|
|
|
|
*
|
|
|
|
* Except as contained in this notice, the name of Conectiva Linux shall
|
|
|
|
* not be used in advertising or otherwise to promote the sale, use or other
|
|
|
|
* dealings in this Software without prior written authorization from
|
|
|
|
* Conectiva Linux.
|
|
|
|
*
|
|
|
|
* Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef USE_MODULES
|
|
|
|
#include <setjmp.h>
|
|
|
|
|
|
|
|
#ifndef HAS_GLIBC_SIGSETJMP
|
|
|
|
#if defined(setjmp) && defined(__GNU_LIBRARY__) && \
|
|
|
|
(!defined(__GLIBC__) || (__GLIBC__ < 2) || \
|
|
|
|
((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 3)))
|
|
|
|
#define HAS_GLIBC_SIGSETJMP 1
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define LOADER_PRIVATE
|
|
|
|
#include "loader.h"
|
|
|
|
|
|
|
|
#define True 1
|
|
|
|
#define False 0
|
|
|
|
#define XtPointer char*
|
|
|
|
#define XtMalloc malloc
|
|
|
|
#define XtCalloc calloc
|
|
|
|
#define XtRealloc realloc
|
|
|
|
#define XtFree free
|
|
|
|
#define XtNew(t) malloc(sizeof(t))
|
|
|
|
#define XtNewString(s) ((s) ? strdup(s) : NULL)
|
|
|
|
|
|
|
|
#define pointer void*
|
|
|
|
|
|
|
|
/* XXX beware (or fix it) libc functions called here are the xf86 ones */
|
|
|
|
|
|
|
|
static void AddModuleOptions(char*, const OptionInfoRec*);
|
|
|
|
#if 0
|
|
|
|
void xf86AddDriver(DriverPtr, void*, int);
|
|
|
|
Bool xf86ServerIsOnlyDetecting(void);
|
|
|
|
void xf86AddInputDriver(InputDriverPtr, pointer, int);
|
|
|
|
void xf86AddModuleInfo(ModuleInfoPtr, void*);
|
|
|
|
Bool xf86LoaderCheckSymbol(const char*);
|
|
|
|
void xf86LoaderRefSymLists(const char **, ...);
|
|
|
|
void xf86LoaderReqSymLists(const char **, ...);
|
|
|
|
void xf86Msg(int, const char*, ...);
|
|
|
|
void xf86MsgVerb(int, int, const char*, ...);
|
|
|
|
void xf86PrintChipsets(const char*, const char*, SymTabPtr);
|
|
|
|
void xf86ErrorFVerb(int verb, const char *format, ...);
|
|
|
|
pciVideoPtr *xf86GetPciVideoInfo(void);
|
|
|
|
int xf86MatchDevice(const char*, GDevPtr**);
|
|
|
|
int xf86MatchPciInstances(const char*, int, SymTabPtr, PciChipsets*, GDevPtr*, int, DriverPtr,int**);
|
|
|
|
int xf86MatchIsaInstances(const char*, SymTabPtr, pointer*, DriverPtr, pointer, GDevPtr*, int, int**);
|
|
|
|
void *xf86LoadDrvSubModule(DriverPtr drv, const char*);
|
|
|
|
void xf86DrvMsg(int, int, const char*, ...);
|
|
|
|
pciConfigPtr *xf86GetPciConfigInfo(void);
|
|
|
|
Bool xf86IsPrimaryPci(pcVideoPtr*);
|
|
|
|
Bool xf86CheckPciSlot(int bus, int device, int func);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern char *loaderPath, **loaderList, **ploaderList;
|
|
|
|
xf86cfgModuleOptions *module_options;
|
|
|
|
FontModule *font_module;
|
|
|
|
int numFontModules;
|
|
|
|
|
|
|
|
extern int noverify, error_level;
|
|
|
|
|
|
|
|
int xf86ShowUnresolved = 1;
|
|
|
|
|
|
|
|
LOOKUP miLookupTab[] = {{0,0}};
|
|
|
|
LOOKUP dixLookupTab[] = {{0,0}};
|
|
|
|
LOOKUP fontLookupTab[] = {{0,0}};
|
|
|
|
LOOKUP extLookupTab[] = {{0,0}};
|
|
|
|
LOOKUP xfree86LookupTab[] = {
|
|
|
|
/* Loader functions */
|
|
|
|
SYMFUNC(LoaderDefaultFunc)
|
|
|
|
SYMFUNC(LoadSubModule)
|
|
|
|
SYMFUNC(DuplicateModule)
|
|
|
|
SYMFUNC(LoaderErrorMsg)
|
|
|
|
SYMFUNC(LoaderCheckUnresolved)
|
|
|
|
SYMFUNC(LoadExtension)
|
|
|
|
SYMFUNC(LoadFont)
|
|
|
|
SYMFUNC(LoaderReqSymbols)
|
|
|
|
SYMFUNC(LoaderReqSymLists)
|
|
|
|
SYMFUNC(LoaderRefSymbols)
|
|
|
|
SYMFUNC(LoaderRefSymLists)
|
|
|
|
SYMFUNC(UnloadSubModule)
|
|
|
|
SYMFUNC(LoaderSymbol)
|
|
|
|
SYMFUNC(LoaderListDirs)
|
|
|
|
SYMFUNC(LoaderFreeDirList)
|
|
|
|
SYMFUNC(LoaderGetOS)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* these here are our own interfaces to libc functions
|
|
|
|
*/
|
|
|
|
SYMFUNC(xf86abort)
|
|
|
|
SYMFUNC(xf86abs)
|
|
|
|
SYMFUNC(xf86acos)
|
|
|
|
SYMFUNC(xf86asin)
|
|
|
|
SYMFUNC(xf86atan)
|
|
|
|
SYMFUNC(xf86atan2)
|
|
|
|
SYMFUNC(xf86atof)
|
|
|
|
SYMFUNC(xf86atoi)
|
|
|
|
SYMFUNC(xf86atol)
|
|
|
|
SYMFUNC(xf86bsearch)
|
|
|
|
SYMFUNC(xf86ceil)
|
|
|
|
SYMFUNC(xf86calloc)
|
|
|
|
SYMFUNC(xf86clearerr)
|
|
|
|
SYMFUNC(xf86close)
|
|
|
|
SYMFUNC(xf86cos)
|
|
|
|
SYMFUNC(xf86exit)
|
|
|
|
SYMFUNC(xf86exp)
|
|
|
|
SYMFUNC(xf86fabs)
|
|
|
|
SYMFUNC(xf86fclose)
|
|
|
|
SYMFUNC(xf86feof)
|
|
|
|
SYMFUNC(xf86ferror)
|
|
|
|
SYMFUNC(xf86fflush)
|
|
|
|
SYMFUNC(xf86fgetc)
|
|
|
|
SYMFUNC(xf86fgetpos)
|
|
|
|
SYMFUNC(xf86fgets)
|
|
|
|
SYMFUNC(xf86finite)
|
|
|
|
SYMFUNC(xf86floor)
|
|
|
|
SYMFUNC(xf86fmod)
|
|
|
|
SYMFUNC(xf86fopen)
|
|
|
|
SYMFUNC(xf86fprintf)
|
|
|
|
SYMFUNC(xf86fputc)
|
|
|
|
SYMFUNC(xf86fputs)
|
|
|
|
SYMFUNC(xf86fread)
|
|
|
|
SYMFUNC(xf86free)
|
|
|
|
SYMFUNC(xf86freopen)
|
|
|
|
SYMFUNC(xf86frexp)
|
|
|
|
SYMFUNC(xf86fscanf)
|
|
|
|
SYMFUNC(xf86fseek)
|
|
|
|
SYMFUNC(xf86fsetpos)
|
|
|
|
SYMFUNC(xf86ftell)
|
|
|
|
SYMFUNC(xf86fwrite)
|
|
|
|
SYMFUNC(xf86getc)
|
|
|
|
SYMFUNC(xf86getenv)
|
|
|
|
SYMFUNC(xf86getpagesize)
|
|
|
|
SYMFUNC(xf86hypot)
|
|
|
|
SYMFUNC(xf86ioctl)
|
|
|
|
SYMFUNC(xf86isalnum)
|
|
|
|
SYMFUNC(xf86isalpha)
|
|
|
|
SYMFUNC(xf86iscntrl)
|
|
|
|
SYMFUNC(xf86isdigit)
|
|
|
|
SYMFUNC(xf86isgraph)
|
|
|
|
SYMFUNC(xf86islower)
|
|
|
|
SYMFUNC(xf86isprint)
|
|
|
|
SYMFUNC(xf86ispunct)
|
|
|
|
SYMFUNC(xf86isspace)
|
|
|
|
SYMFUNC(xf86isupper)
|
|
|
|
SYMFUNC(xf86isxdigit)
|
|
|
|
SYMFUNC(xf86labs)
|
|
|
|
SYMFUNC(xf86ldexp)
|
|
|
|
SYMFUNC(xf86log)
|
|
|
|
SYMFUNC(xf86log10)
|
|
|
|
SYMFUNC(xf86lseek)
|
|
|
|
SYMFUNC(xf86malloc)
|
|
|
|
SYMFUNC(xf86memchr)
|
|
|
|
SYMFUNC(xf86memcmp)
|
|
|
|
SYMFUNC(xf86memcpy)
|
2007-11-24 10:55:21 -07:00
|
|
|
#if (defined(__powerpc__) && (defined(Lynx) || defined(linux))) || defined(__sparc__) || defined(__sparc) || defined(__ia64__) || defined (__amd64__)
|
2006-11-26 11:13:41 -07:00
|
|
|
/*
|
|
|
|
* Some PPC, SPARC, and IA64 compilers generate calls to memcpy to handle
|
|
|
|
* structure copies. This causes a problem both here and in shared
|
|
|
|
* libraries as there is no way to map the name of the call to the
|
|
|
|
* correct function.
|
|
|
|
*/
|
|
|
|
SYMFUNC(memcpy)
|
|
|
|
/*
|
|
|
|
* Some PPC, SPARC, and IA64 compilers generate calls to memset to handle
|
|
|
|
* aggregate initializations.
|
|
|
|
*/
|
|
|
|
SYMFUNC(memset)
|
|
|
|
#endif
|
|
|
|
SYMFUNC(xf86memmove)
|
|
|
|
SYMFUNC(xf86memset)
|
|
|
|
SYMFUNC(xf86mmap)
|
|
|
|
SYMFUNC(xf86modf)
|
|
|
|
SYMFUNC(xf86munmap)
|
|
|
|
SYMFUNC(xf86open)
|
|
|
|
SYMFUNC(xf86perror)
|
|
|
|
SYMFUNC(xf86pow)
|
|
|
|
SYMFUNC(xf86printf)
|
|
|
|
SYMFUNC(xf86qsort)
|
|
|
|
SYMFUNC(xf86read)
|
|
|
|
SYMFUNC(xf86realloc)
|
|
|
|
SYMFUNC(xf86remove)
|
|
|
|
SYMFUNC(xf86rename)
|
|
|
|
SYMFUNC(xf86rewind)
|
|
|
|
SYMFUNC(xf86setbuf)
|
|
|
|
SYMFUNC(xf86setvbuf)
|
|
|
|
SYMFUNC(xf86sin)
|
|
|
|
SYMFUNC(xf86snprintf)
|
|
|
|
SYMFUNC(xf86sprintf)
|
|
|
|
SYMFUNC(xf86sqrt)
|
|
|
|
SYMFUNC(xf86sscanf)
|
|
|
|
SYMFUNC(xf86strcat)
|
|
|
|
SYMFUNC(xf86strcmp)
|
|
|
|
SYMFUNC(xf86strcasecmp)
|
|
|
|
SYMFUNC(xf86strcpy)
|
|
|
|
SYMFUNC(xf86strcspn)
|
|
|
|
SYMFUNC(xf86strerror)
|
|
|
|
SYMFUNC(xf86strlen)
|
|
|
|
SYMFUNC(xf86strncmp)
|
|
|
|
SYMFUNC(xf86strncasecmp)
|
|
|
|
SYMFUNC(xf86strncpy)
|
|
|
|
SYMFUNC(xf86strpbrk)
|
|
|
|
SYMFUNC(xf86strchr)
|
|
|
|
SYMFUNC(xf86strrchr)
|
|
|
|
SYMFUNC(xf86strspn)
|
|
|
|
SYMFUNC(xf86strstr)
|
|
|
|
SYMFUNC(xf86strtod)
|
|
|
|
SYMFUNC(xf86strtok)
|
|
|
|
SYMFUNC(xf86strtol)
|
|
|
|
SYMFUNC(xf86strtoul)
|
|
|
|
SYMFUNC(xf86tan)
|
|
|
|
SYMFUNC(xf86tmpfile)
|
|
|
|
SYMFUNC(xf86tolower)
|
|
|
|
SYMFUNC(xf86toupper)
|
|
|
|
SYMFUNC(xf86ungetc)
|
|
|
|
SYMFUNC(xf86vfprintf)
|
|
|
|
SYMFUNC(xf86vsnprintf)
|
|
|
|
SYMFUNC(xf86vsprintf)
|
|
|
|
SYMFUNC(xf86write)
|
|
|
|
|
|
|
|
/* non-ANSI C functions */
|
|
|
|
SYMFUNC(xf86opendir)
|
|
|
|
SYMFUNC(xf86closedir)
|
|
|
|
SYMFUNC(xf86readdir)
|
|
|
|
SYMFUNC(xf86rewinddir)
|
|
|
|
SYMFUNC(xf86ffs)
|
|
|
|
SYMFUNC(xf86strdup)
|
|
|
|
SYMFUNC(xf86bzero)
|
|
|
|
SYMFUNC(xf86usleep)
|
|
|
|
SYMFUNC(xf86execl)
|
|
|
|
|
|
|
|
SYMFUNC(xf86getsecs)
|
|
|
|
SYMFUNC(xf86fpossize) /* for returning sizeof(fpos_t) */
|
|
|
|
|
|
|
|
SYMFUNC(xf86stat)
|
|
|
|
SYMFUNC(xf86fstat)
|
|
|
|
SYMFUNC(xf86access)
|
|
|
|
SYMFUNC(xf86geteuid)
|
|
|
|
SYMFUNC(xf86getegid)
|
|
|
|
SYMFUNC(xf86getpid)
|
|
|
|
SYMFUNC(xf86mknod)
|
|
|
|
SYMFUNC(xf86chmod)
|
|
|
|
SYMFUNC(xf86chown)
|
|
|
|
SYMFUNC(xf86sleep)
|
|
|
|
SYMFUNC(xf86mkdir)
|
|
|
|
SYMFUNC(xf86shmget)
|
|
|
|
SYMFUNC(xf86shmat)
|
|
|
|
SYMFUNC(xf86shmdt)
|
|
|
|
SYMFUNC(xf86shmctl)
|
|
|
|
#ifdef HAS_GLIBC_SIGSETJMP
|
|
|
|
SYMFUNC(xf86setjmp)
|
|
|
|
SYMFUNC(xf86setjmp0)
|
|
|
|
#if defined(__GLIBC__) && (__GLIBC__ >= 2)
|
|
|
|
SYMFUNCALIAS("xf86setjmp1",__sigsetjmp)
|
|
|
|
#else
|
|
|
|
SYMFUNC(xf86setjmp1)
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
SYMFUNCALIAS("xf86setjmp",setjmp)
|
|
|
|
SYMFUNCALIAS("xf86setjmp0",setjmp)
|
|
|
|
SYMFUNC(xf86setjmp1)
|
|
|
|
#endif
|
|
|
|
SYMFUNCALIAS("xf86longjmp",longjmp)
|
|
|
|
SYMFUNC(xf86getjmptype)
|
|
|
|
SYMFUNC(xf86setjmp1_arg2)
|
|
|
|
SYMFUNC(xf86setjmperror)
|
|
|
|
|
|
|
|
SYMFUNC(xf86AddDriver)
|
|
|
|
SYMFUNC(xf86ServerIsOnlyDetecting)
|
|
|
|
SYMFUNC(xf86AddInputDriver)
|
|
|
|
SYMFUNC(xf86AddModuleInfo)
|
|
|
|
SYMFUNC(xf86LoaderCheckSymbol)
|
|
|
|
|
|
|
|
SYMFUNC(xf86LoaderRefSymLists)
|
|
|
|
SYMFUNC(xf86LoaderReqSymLists)
|
|
|
|
SYMFUNC(xf86Msg)
|
|
|
|
SYMFUNC(xf86MsgVerb)
|
|
|
|
SYMFUNC(ErrorF)
|
|
|
|
SYMFUNC(xf86PrintChipsets)
|
|
|
|
SYMFUNC(xf86ErrorFVerb)
|
|
|
|
SYMFUNC(xf86GetPciVideoInfo)
|
|
|
|
SYMFUNC(xf86MatchDevice)
|
|
|
|
SYMFUNC(xf86MatchPciInstances)
|
|
|
|
SYMFUNC(xf86MatchIsaInstances)
|
|
|
|
SYMFUNC(Xfree)
|
|
|
|
SYMFUNC(xf86LoadDrvSubModule)
|
|
|
|
SYMFUNC(xf86DrvMsg)
|
|
|
|
SYMFUNC(xf86GetPciConfigInfo)
|
|
|
|
SYMFUNC(xf86IsPrimaryPci)
|
|
|
|
SYMFUNC(xf86CheckPciSlot)
|
|
|
|
SYMFUNC(XNFalloc)
|
|
|
|
SYMFUNC(XNFrealloc)
|
|
|
|
SYMFUNC(XNFcalloc)
|
|
|
|
{0,0}
|
|
|
|
};
|
|
|
|
|
|
|
|
static DriverPtr driver;
|
|
|
|
static ModuleInfoPtr info;
|
|
|
|
static SymTabPtr chips;
|
|
|
|
static int vendor;
|
|
|
|
ModuleType module_type = GenericModule;
|
|
|
|
|
|
|
|
static void
|
|
|
|
AddModuleOptions(char *name, const OptionInfoRec *option)
|
|
|
|
{
|
|
|
|
xf86cfgModuleOptions *ptr;
|
|
|
|
const OptionInfoRec *tmp;
|
|
|
|
SymTabPtr ctmp;
|
|
|
|
int count;
|
|
|
|
|
|
|
|
/* XXX If the module is already in the list, then it means that
|
|
|
|
* it is now being properly loaded by xf86cfg and the "fake" entry
|
|
|
|
* added in xf86cfgLoaderInitList() isn't required anymore.
|
|
|
|
* Currently:
|
|
|
|
* ati and vmware are known to fail. */
|
|
|
|
for (ptr = module_options; ptr; ptr = ptr->next)
|
|
|
|
if (strcmp(name, ptr->name) == 0) {
|
|
|
|
fprintf(stderr, "Module %s already in list!\n", name);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ptr = XtNew(xf86cfgModuleOptions);
|
|
|
|
ptr->name = XtNewString(name);
|
|
|
|
ptr->type = module_type;
|
|
|
|
if (option) {
|
|
|
|
for (count = 0, tmp = option; tmp->name != NULL; tmp++, count++)
|
|
|
|
;
|
|
|
|
++count;
|
|
|
|
ptr->option = XtCalloc(1, count * sizeof(OptionInfoRec));
|
|
|
|
for (count = 0, tmp = option; tmp->name != NULL; count++, tmp++) {
|
|
|
|
memcpy(&ptr->option[count], tmp, sizeof(OptionInfoRec));
|
|
|
|
ptr->option[count].name = XtNewString(tmp->name);
|
|
|
|
if (tmp->type == OPTV_STRING || tmp->type == OPTV_ANYSTR)
|
|
|
|
ptr->option[count].value.str = XtNewString(tmp->value.str);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ptr->option = NULL;
|
|
|
|
if (vendor != -1 && chips) {
|
|
|
|
ptr->vendor = vendor;
|
|
|
|
for (count = 0, ctmp = chips; ctmp->name; ctmp++, count++)
|
|
|
|
;
|
|
|
|
++count;
|
|
|
|
ptr->chipsets = XtCalloc(1, count * sizeof(SymTabRec));
|
|
|
|
for (count = 0, ctmp = chips; ctmp->name != NULL; count++, ctmp++) {
|
|
|
|
memcpy(&ptr->chipsets[count], ctmp, sizeof(SymTabRec));
|
|
|
|
ptr->chipsets[count].name = XtNewString(ctmp->name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ptr->chipsets = NULL;
|
|
|
|
|
|
|
|
ptr->next = module_options;
|
|
|
|
module_options = ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern void xf86WrapperInit(void);
|
|
|
|
|
|
|
|
void
|
|
|
|
xf86cfgLoaderInit(void)
|
|
|
|
{
|
|
|
|
LoaderInit();
|
|
|
|
xf86WrapperInit();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
xf86cfgLoaderInitList(int type)
|
|
|
|
{
|
|
|
|
static const char *generic[] = {
|
|
|
|
".",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
static const char *video[] = {
|
|
|
|
"drivers",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
static const char *input[] = {
|
|
|
|
"input",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
static const char *font[] = {
|
|
|
|
"fonts",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
const char **subdirs;
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case GenericModule:
|
|
|
|
subdirs = generic;
|
|
|
|
break;
|
|
|
|
case VideoModule:
|
|
|
|
subdirs = video;
|
|
|
|
break;
|
|
|
|
case InputModule:
|
|
|
|
subdirs = input;
|
|
|
|
break;
|
|
|
|
case FontRendererModule:
|
|
|
|
subdirs = font;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "Invalid value passed to xf86cfgLoaderInitList.\n");
|
|
|
|
subdirs = generic;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
LoaderSetPath(loaderPath);
|
|
|
|
loaderList = LoaderListDirs(subdirs, NULL);
|
|
|
|
|
|
|
|
/* XXX Xf86cfg isn't able to provide enough wrapper functions
|
|
|
|
* to these drivers. Maybe the drivers could also be changed
|
|
|
|
* to work better when being loaded "just for testing" */
|
|
|
|
if (type == VideoModule) {
|
|
|
|
module_type = VideoModule;
|
|
|
|
AddModuleOptions("vmware", NULL);
|
|
|
|
AddModuleOptions("ati", NULL);
|
|
|
|
module_type = NullModule;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
xf86cfgLoaderFreeList(void)
|
|
|
|
{
|
|
|
|
LoaderFreeDirList(loaderList);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
xf86cfgCheckModule(void)
|
|
|
|
{
|
|
|
|
int errmaj, errmin;
|
|
|
|
ModuleDescPtr module;
|
|
|
|
int nfonts;
|
|
|
|
FontModule *fonts, *pfont_module;
|
|
|
|
|
|
|
|
driver = NULL;
|
|
|
|
chips = NULL;
|
|
|
|
info = NULL;
|
|
|
|
pfont_module = NULL;
|
|
|
|
vendor = -1;
|
|
|
|
module_type = GenericModule;
|
|
|
|
|
|
|
|
if ((module = LoadModule(*ploaderList, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, &errmaj, &errmin)) == NULL) {
|
|
|
|
LoaderErrorMsg(NULL, *ploaderList, errmaj, errmin);
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
else if (driver && driver->AvailableOptions) {
|
|
|
|
/* at least fbdev does not call xf86MatchPciInstances in Probe */
|
|
|
|
if (driver->Identify)
|
|
|
|
(*driver->Identify)(-1);
|
|
|
|
if (driver->Probe)
|
|
|
|
(*driver->Probe)(driver, PROBE_DETECT);
|
|
|
|
AddModuleOptions(*ploaderList, (*driver->AvailableOptions)(-1, -1));
|
|
|
|
}
|
|
|
|
else if (info && info->AvailableOptions)
|
|
|
|
AddModuleOptions(*ploaderList, (*info->AvailableOptions)(NULL));
|
|
|
|
|
|
|
|
if (!noverify) {
|
|
|
|
XF86ModuleData *initdata = NULL;
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
p = XtMalloc(strlen(*ploaderList) + strlen("ModuleData") + 1);
|
|
|
|
strcpy(p, *ploaderList);
|
|
|
|
strcat(p, "ModuleData");
|
|
|
|
initdata = LoaderSymbol(p);
|
|
|
|
if (initdata) {
|
|
|
|
XF86ModuleVersionInfo *vers;
|
|
|
|
|
|
|
|
vers = initdata->vers;
|
|
|
|
if (vers && strcmp(*ploaderList, vers->modname)) {
|
|
|
|
/* This was a problem at some time for some video drivers */
|
|
|
|
CheckMsg(CHECKER_FILE_MODULE_NAME_MISMATCH,
|
|
|
|
"WARNING file/module name mismatch: \"%s\" \"%s\"\n",
|
|
|
|
*ploaderList, vers->modname);
|
|
|
|
++error_level;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
XtFree(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
nfonts = numFontModules;
|
|
|
|
numFontModules = 0;
|
|
|
|
fonts = FontModuleList;
|
|
|
|
if (fonts) {
|
|
|
|
Bool dup = FALSE;
|
|
|
|
while (fonts->name) {
|
|
|
|
if (strcasecmp(fonts->name, *ploaderList) == 0) {
|
|
|
|
pfont_module = fonts;
|
|
|
|
/* HACK:
|
|
|
|
* fonts->names points into modules.
|
|
|
|
* Duplicate string of all remaining names to survive
|
|
|
|
* unloading. Since new fonts are appended to list
|
|
|
|
* this will only happen once per renderer.
|
|
|
|
*/
|
|
|
|
dup = TRUE;
|
|
|
|
}
|
|
|
|
if (dup)
|
|
|
|
fonts->name = strdup(fonts->name);
|
|
|
|
++numFontModules;
|
|
|
|
++fonts;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (pfont_module)
|
|
|
|
module_type = FontRendererModule;
|
|
|
|
else if (nfonts + 1 <= numFontModules) {
|
|
|
|
/* loader.c will flag a warning if -noverify is not set */
|
|
|
|
pfont_module = &FontModuleList[nfonts];
|
|
|
|
module_type = FontRendererModule;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (font_module) {
|
|
|
|
XtFree((XtPointer)font_module->name);
|
|
|
|
XtFree((XtPointer)font_module);
|
|
|
|
font_module = NULL;
|
|
|
|
}
|
|
|
|
if (pfont_module) {
|
|
|
|
font_module = XtNew(FontModule);
|
|
|
|
memcpy(font_module, pfont_module, sizeof(FontModule));
|
|
|
|
font_module->name = XtNewString(pfont_module->name);
|
|
|
|
}
|
|
|
|
|
|
|
|
UnloadModule(module);
|
|
|
|
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT void
|
|
|
|
xf86AddDriver(DriverPtr drv, void *module, int flags)
|
|
|
|
{
|
|
|
|
driver = drv;
|
|
|
|
if (driver)
|
|
|
|
driver->module = module;
|
|
|
|
module_type = VideoModule;
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT Bool
|
|
|
|
xf86ServerIsOnlyDetecting(void)
|
|
|
|
{
|
|
|
|
return (True);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT void
|
|
|
|
xf86AddInputDriver(InputDriverPtr inp, void *module, int flags)
|
|
|
|
{
|
|
|
|
module_type = InputModule;
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT void
|
|
|
|
xf86AddModuleInfo(ModuleInfoPtr inf, void *module)
|
|
|
|
{
|
|
|
|
info = inf;
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT Bool
|
|
|
|
xf86LoaderCheckSymbol(const char *symbol)
|
|
|
|
{
|
|
|
|
return LoaderSymbol(symbol) != NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT void
|
|
|
|
xf86LoaderRefSymLists(const char **list0, ...)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT void
|
|
|
|
xf86LoaderReqSymLists(const char **list0, ...)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
void xf86Msg(int type, const char *format, ...)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*ARGSUSED*/
|
|
|
|
_X_EXPORT void
|
|
|
|
xf86PrintChipsets(const char *name, const char *msg, SymTabPtr chipsets)
|
|
|
|
{
|
|
|
|
vendor = 0;
|
|
|
|
chips = chipsets;
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT pciVideoPtr *
|
|
|
|
xf86GetPciVideoInfo(void)
|
|
|
|
{
|
|
|
|
static pciVideoRec pci_video;
|
|
|
|
static pciVideoPtr pci_video_ptr[2] = { &pci_video };
|
|
|
|
|
|
|
|
memset(&pci_video, 0, sizeof(pciVideoRec));
|
|
|
|
|
|
|
|
return (pci_video_ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT int
|
|
|
|
xf86MatchDevice(const char *name, GDevPtr **gdev)
|
|
|
|
{
|
|
|
|
*gdev = NULL;
|
|
|
|
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT int
|
|
|
|
xf86MatchPciInstances(const char *name, int VendorID, SymTabPtr chipsets, PciChipsets *PCIchipsets,
|
|
|
|
GDevPtr *devList, int numDevs, DriverPtr drvp, int **foundEntities)
|
|
|
|
{
|
|
|
|
vendor = VendorID;
|
|
|
|
if (chips == NULL)
|
|
|
|
chips = chipsets;
|
|
|
|
*foundEntities = NULL;
|
|
|
|
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT int
|
|
|
|
xf86MatchIsaInstances(const char *name, SymTabPtr chipsets, IsaChipsets *ISAchipsets, DriverPtr drvp,
|
|
|
|
FindIsaDevProc FindIsaDevice, GDevPtr *devList, int numDevs, int **foundEntities)
|
|
|
|
{
|
|
|
|
*foundEntities = NULL;
|
|
|
|
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*ARGSUSED*/
|
|
|
|
_X_EXPORT void *
|
|
|
|
xf86LoadDrvSubModule(DriverPtr drv, const char *name)
|
|
|
|
{
|
|
|
|
pointer ret;
|
|
|
|
int errmaj = 0, errmin = 0;
|
|
|
|
|
|
|
|
ret = LoadSubModule(drv->module, name, NULL, NULL, NULL, NULL,
|
|
|
|
&errmaj, &errmin);
|
|
|
|
if (!ret)
|
|
|
|
LoaderErrorMsg(NULL, name, errmaj, errmin);
|
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT pciConfigPtr *
|
|
|
|
xf86GetPciConfigInfo(void)
|
|
|
|
{
|
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT Bool
|
|
|
|
xf86IsPrimaryPci(pciVideoPtr pPci)
|
|
|
|
{
|
|
|
|
return (True);
|
|
|
|
}
|
|
|
|
|
|
|
|
_X_EXPORT Bool
|
|
|
|
xf86CheckPciSlot(int bus, int device, int func)
|
|
|
|
{
|
|
|
|
return (False);
|
|
|
|
}
|
|
|
|
#endif
|