Improved error messages.

build fixes for AMD64.
Made shm* functions in the libc_wrapper more standard conformant by setting
    errno correctly.
Use xf86ExendedInitInt10() in VBEExtendedInit() to be able to pass flags.
This commit is contained in:
Egbert Eich 2004-07-30 20:51:09 +00:00
parent 7643199de1
commit 40b975e3ac
3 changed files with 97 additions and 35 deletions

View File

@ -1,7 +1,7 @@
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c,v 1.30 2003/03/14 13:46:06 tsi Exp $ */ /* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c,v 1.32 2004/02/05 18:24:59 eich Exp $ */
/* /*
* linux specific part of the int10 module * linux specific part of the int10 module
* Copyright 1999 Egbert Eich * Copyright 1999, 2000, 2001, 2002, 2003, 2004 Egbert Eich
*/ */
#include "xf86.h" #include "xf86.h"
#include "xf86_OSproc.h" #include "xf86_OSproc.h"
@ -172,6 +172,9 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
if (errno == ENOSYS) if (errno == ENOSYS)
xf86DrvMsg(screen, X_ERROR, "shmget error\n Please reconfigure" xf86DrvMsg(screen, X_ERROR, "shmget error\n Please reconfigure"
" your kernel to include System V IPC support\n"); " your kernel to include System V IPC support\n");
else
xf86DrvMsg(screen, X_ERROR,
"shmget(highmem) error: %s\n",strerror(errno));
goto error1; goto error1;
} }
} else { } else {
@ -198,21 +201,34 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
ErrorF("Mapping 640kB area\n"); ErrorF("Mapping 640kB area\n");
#endif #endif
if ((low_mem = shmget(counter++, V_RAM, if ((low_mem = shmget(counter++, V_RAM,
IPC_CREAT | SHM_R | SHM_W)) == -1) IPC_CREAT | SHM_R | SHM_W)) == -1) {
xf86DrvMsg(screen, X_ERROR,
"shmget(lowmem) error: %s\n",strerror(errno));
goto error2; goto error2;
}
((linuxInt10Priv*)pInt->private)->lowMem = low_mem; ((linuxInt10Priv*)pInt->private)->lowMem = low_mem;
base = shmat(low_mem, 0, 0); base = shmat(low_mem, 0, 0);
if (base == SHMERRORPTR) goto error4; if (base == SHMERRORPTR) {
xf86DrvMsg(screen, X_ERROR,
"shmat(low_mem) error: %s\n",strerror(errno));
goto error3;
}
((linuxInt10Priv *)pInt->private)->base = base; ((linuxInt10Priv *)pInt->private)->base = base;
if (high_mem > -1) { if (high_mem > -1) {
base_high = shmat(high_mem, 0, 0); base_high = shmat(high_mem, 0, 0);
if (base_high == SHMERRORPTR) goto error4; if (base_high == SHMERRORPTR) {
xf86DrvMsg(screen, X_ERROR,
"shmat(high_mem) error: %s\n",strerror(errno));
goto error3;
}
((linuxInt10Priv*)pInt->private)->base_high = base_high; ((linuxInt10Priv*)pInt->private)->base_high = base_high;
} else } else
((linuxInt10Priv*)pInt->private)->base_high = NULL; ((linuxInt10Priv*)pInt->private)->base_high = NULL;
MapCurrentInt10(pInt); if (!MapCurrentInt10(pInt))
goto error3;
Int10Current = pInt; Int10Current = pInt;
#ifdef DEBUG #ifdef DEBUG
@ -238,7 +254,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
for (cs = V_BIOS; cs < SYS_BIOS; cs += V_BIOS_SIZE) for (cs = V_BIOS; cs < SYS_BIOS; cs += V_BIOS_SIZE)
if (xf86ReadBIOS(cs, 0, (pointer)cs, V_BIOS_SIZE) < V_BIOS_SIZE) if (xf86ReadBIOS(cs, 0, (pointer)cs, V_BIOS_SIZE) < V_BIOS_SIZE)
xf86DrvMsg(screen, X_WARNING, xf86DrvMsg(screen, X_WARNING,
"Unable to retrieve all of segment 0x%06X.\n", cs); "Unable to retrieve all of segment 0x%06lX.\n", cs);
#ifdef DEBUG #ifdef DEBUG
ErrorF("done\n"); ErrorF("done\n");
#endif #endif
@ -250,13 +266,13 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
&& !(initPrimary(options))) { && !(initPrimary(options))) {
if (bios.bus == BUS_ISA && bios.location.legacy) { if (bios.bus == BUS_ISA && bios.location.legacy) {
xf86DrvMsg(screen, X_CONFIG, xf86DrvMsg(screen, X_CONFIG,
"Overriding BIOS location: 0x%lx\n", "Overriding BIOS location: 0x%x\n",
bios.location.legacy); bios.location.legacy);
cs = bios.location.legacy >> 4; cs = bios.location.legacy >> 4;
bios_base = (unsigned char *)(cs << 4); bios_base = (unsigned char *)(cs << 4);
if (!int10_check_bios(screen, cs, bios_base)) { if (!int10_check_bios(screen, cs, bios_base)) {
xf86DrvMsg(screen, X_ERROR, xf86DrvMsg(screen, X_ERROR,
"No V_BIOS at specified address 0x%x\n",cs << 4); "No V_BIOS at specified address 0x%lx\n",cs << 4);
goto error3; goto error3;
} }
} else { } else {
@ -286,7 +302,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
} }
} }
xf86DrvMsg(screen, X_INFO, "Primary V_BIOS segment is: 0x%x\n", cs); xf86DrvMsg(screen, X_INFO, "Primary V_BIOS segment is: 0x%lx\n", cs);
pInt->BIOSseg = cs; pInt->BIOSseg = cs;
set_return_trap(pInt); set_return_trap(pInt);
@ -345,7 +361,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
bios_base = (unsigned char *)(cs << 4); bios_base = (unsigned char *)(cs << 4);
if (!int10_check_bios(screen, cs, bios_base)) { if (!int10_check_bios(screen, cs, bios_base)) {
xf86DrvMsg(screen,X_ERROR,"No V_BIOS found " xf86DrvMsg(screen,X_ERROR,"No V_BIOS found "
"on override address 0x%x\n",bios_base); "on override address %p\n",bios_base);
goto error3; goto error3;
} }
} else { } else {
@ -365,7 +381,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
} }
} }
} }
xf86DrvMsg(screen,X_INFO,"Primary V_BIOS segment is: 0x%x\n",cs); xf86DrvMsg(screen,X_INFO,"Primary V_BIOS segment is: 0x%lx\n",cs);
pInt->BIOSseg = cs; pInt->BIOSseg = cs;
break; break;
default: default:
@ -386,8 +402,6 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
xfree(options); xfree(options);
return pInt; return pInt;
error4:
xf86DrvMsg(screen, X_ERROR, "shmat() call retruned errno %d\n", errno);
error3: error3:
if (base_high) if (base_high)
shmdt(base_high); shmdt(base_high);
@ -427,6 +441,8 @@ MapCurrentInt10(xf86Int10InfoPtr pInt)
addr = shmat(((linuxInt10Priv*)pInt->private)->lowMem, (char*)1, SHM_RND); addr = shmat(((linuxInt10Priv*)pInt->private)->lowMem, (char*)1, SHM_RND);
if (addr == SHMERRORPTR) { if (addr == SHMERRORPTR) {
xf86DrvMsg(pInt->scrnIndex, X_ERROR, "Cannot shmat() low memory\n"); xf86DrvMsg(pInt->scrnIndex, X_ERROR, "Cannot shmat() low memory\n");
xf86DrvMsg(pInt->scrnIndex, X_ERROR,
"shmat(low_mem) error: %s\n",strerror(errno));
return FALSE; return FALSE;
} }
@ -436,6 +452,8 @@ MapCurrentInt10(xf86Int10InfoPtr pInt)
if (addr == SHMERRORPTR) { if (addr == SHMERRORPTR) {
xf86DrvMsg(pInt->scrnIndex, X_ERROR, xf86DrvMsg(pInt->scrnIndex, X_ERROR,
"Cannot shmat() high memory\n"); "Cannot shmat() high memory\n");
xf86DrvMsg(pInt->scrnIndex, X_ERROR,
"shmget error: %s\n",strerror(errno));
return FALSE; return FALSE;
} }
} else { } else {

View File

@ -1,4 +1,4 @@
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c,v 1.96 2003/09/09 03:20:41 dawes Exp $ */ /* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c,v 1.102 2003/11/19 03:52:58 dawes Exp $ */
/* /*
* Copyright 1997-2003 by The XFree86 Project, Inc. * Copyright 1997-2003 by The XFree86 Project, Inc.
* *
@ -254,6 +254,18 @@ xf86strlen(const char* s)
return (xf86size_t)strlen(s); return (xf86size_t)strlen(s);
} }
xf86size_t
xf86strlcat(char *dest, const char *src, xf86size_t size)
{
return(strlcat(dest, src, size));
}
xf86size_t
xf86strlcpy(char *dest, const char *src, xf86size_t size)
{
return strlcpy(dest, src, size);
}
char* char*
xf86strncat(char* dest, const char* src, xf86size_t n) xf86strncat(char* dest, const char* src, xf86size_t n)
{ {
@ -484,7 +496,7 @@ xf86mmap(void *start, xf86size_t length, int prot,
if (flags & XF86_MAP_FIXED) f |= MAP_FIXED; if (flags & XF86_MAP_FIXED) f |= MAP_FIXED;
if (flags & XF86_MAP_SHARED) f |= MAP_SHARED; if (flags & XF86_MAP_SHARED) f |= MAP_SHARED;
if (flags & XF86_MAP_PRIVATE) f |= MAP_PRIVATE; if (flags & XF86_MAP_PRIVATE) f |= MAP_PRIVATE;
#ifdef __AMD64__ #if defined(__amd64__) && defined(linux)
if (flags & XF86_MAP_32BIT) f |= MAP_32BIT; if (flags & XF86_MAP_32BIT) f |= MAP_32BIT;
#endif #endif
if (prot & XF86_PROT_EXEC) p |= PROT_EXEC; if (prot & XF86_PROT_EXEC) p |= PROT_EXEC;
@ -658,7 +670,7 @@ static void _xf86checkhndl(XF86FILE_priv* f,const char *func)
{ {
if (!f || f->magic != XF86FILE_magic || if (!f || f->magic != XF86FILE_magic ||
!f->filehnd || !f->fname) { !f->filehnd || !f->fname) {
FatalError("libc_wrapper error: passed invalid FILE handle to %s\n", FatalError("libc_wrapper error: passed invalid FILE handle to %s",
func); func);
exit(42); exit(42);
} }
@ -1091,7 +1103,7 @@ xf86setvbuf(XF86FILE* f, char *buf, int mode, xf86size_t size)
vbufmode = _IOLBF; vbufmode = _IOLBF;
break; break;
default: default:
FatalError("libc_wrapper error: mode in setvbuf incorrect\n"); FatalError("libc_wrapper error: mode in setvbuf incorrect");
exit(42); exit(42);
} }
@ -1301,7 +1313,7 @@ static void
_xf86checkdirhndl(XF86DIR_priv* f,const char *func) _xf86checkdirhndl(XF86DIR_priv* f,const char *func)
{ {
if (!f || f->magic != XF86DIR_magic || !f->dir || !f->dirent) { if (!f || f->magic != XF86DIR_magic || !f->dir || !f->dirent) {
FatalError("libc_wrapper error: passed invalid DIR handle to %s\n", FatalError("libc_wrapper error: passed invalid DIR handle to %s",
func); func);
exit(42); exit(42);
} }
@ -1817,7 +1829,7 @@ xf86getpagesize()
pagesize = PAGE_SIZE; pagesize = PAGE_SIZE;
#endif #endif
if (pagesize == -1) if (pagesize == -1)
FatalError("xf86getpagesize: Cannot determine page size\n"); FatalError("xf86getpagesize: Cannot determine page size");
return pagesize; return pagesize;
} }
@ -1871,24 +1883,31 @@ xf86GetErrno ()
int int
xf86shmget(xf86key_t key, int size, int xf86shmflg) xf86shmget(xf86key_t key, int size, int xf86shmflg)
{ {
int shmflg = xf86shmflg & 0777; int shmflg;
int ret;
/* This copies the permissions (SHM_R, SHM_W for u, g, o). */
shmflg = xf86shmflg & 0777;
if (key == XF86IPC_PRIVATE) key = IPC_PRIVATE; if (key == XF86IPC_PRIVATE) key = IPC_PRIVATE;
if (xf86shmflg & XF86SHM_R) shmflg |= SHM_R;
if (xf86shmflg & XF86SHM_W) shmflg |= SHM_W;
if (xf86shmflg & XF86IPC_CREAT) shmflg |= IPC_CREAT; if (xf86shmflg & XF86IPC_CREAT) shmflg |= IPC_CREAT;
if (xf86shmflg & XF86IPC_EXCL) shmflg |= IPC_EXCL; if (xf86shmflg & XF86IPC_EXCL) shmflg |= IPC_EXCL;
if (xf86shmflg & XF86IPC_NOWAIT) shmflg |= IPC_NOWAIT; if (xf86shmflg & XF86IPC_NOWAIT) shmflg |= IPC_NOWAIT;
return shmget((key_t) key, size, shmflg); ret = shmget((key_t) key, size, shmflg);
if (ret == -1)
xf86errno = xf86GetErrno();
return ret;
} }
char * char *
xf86shmat(int id, char *addr, int xf86shmflg) xf86shmat(int id, char *addr, int xf86shmflg)
{ {
int shmflg = 0; int shmflg = 0;
pointer ret;
#ifdef SHM_RDONLY #ifdef SHM_RDONLY
if (xf86shmflg & XF86SHM_RDONLY) shmflg |= SHM_RDONLY; if (xf86shmflg & XF86SHM_RDONLY) shmflg |= SHM_RDONLY;
#endif #endif
@ -1899,13 +1918,25 @@ xf86shmat(int id, char *addr, int xf86shmflg)
if (xf86shmflg & XF86SHM_REMAP) shmflg |= SHM_REMAP; if (xf86shmflg & XF86SHM_REMAP) shmflg |= SHM_REMAP;
#endif #endif
return shmat(id,addr,shmflg); ret = shmat(id,addr,shmflg);
if (ret == (pointer) -1)
xf86errno = xf86GetErrno();
return ret;
} }
int int
xf86shmdt(char *addr) xf86shmdt(char *addr)
{ {
return shmdt(addr); int ret;
ret = shmdt(addr);
if (ret == -1)
xf86errno = xf86GetErrno();
return ret;
} }
/* /*
@ -1915,7 +1946,8 @@ int
xf86shmctl(int id, int xf86cmd, pointer buf) xf86shmctl(int id, int xf86cmd, pointer buf)
{ {
int cmd; int cmd;
int ret;
switch (xf86cmd) { switch (xf86cmd) {
case XF86IPC_RMID: case XF86IPC_RMID:
cmd = IPC_RMID; cmd = IPC_RMID;
@ -1924,32 +1956,44 @@ xf86shmctl(int id, int xf86cmd, pointer buf)
return 0; return 0;
} }
return shmctl(id, cmd, buf); ret = shmctl(id, cmd, buf);
if (ret == -1)
xf86errno = xf86GetErrno();
return ret;
} }
#else #else
int int
xf86shmget(xf86key_t key, int size, int xf86shmflg) xf86shmget(xf86key_t key, int size, int xf86shmflg)
{ {
return -1; xf86errno = ENOSYS;
return -1;
} }
char * char *
xf86shmat(int id, char *addr, int xf86shmflg) xf86shmat(int id, char *addr, int xf86shmflg)
{ {
xf86errno = ENOSYS;
return (char *)-1; return (char *)-1;
} }
int int
xf86shmctl(int id, int xf86cmd, pointer buf) xf86shmctl(int id, int xf86cmd, pointer buf)
{ {
xf86errno = ENOSYS;
return -1; return -1;
} }
int int
xf86shmdt(char *addr) xf86shmdt(char *addr)
{ {
xf86errno = ENOSYS;
return -1; return -1;
} }
#endif /* HAVE_SYSV_IPC */ #endif /* HAVE_SYSV_IPC */
@ -1979,7 +2023,7 @@ xf86setjmp(xf86jmp_buf env)
int int
xf86setjmp0(xf86jmp_buf env) xf86setjmp0(xf86jmp_buf env)
{ {
FatalError("setjmp: type 0 called instead of type %d\n", xf86getjmptype()); FatalError("setjmp: type 0 called instead of type %d", xf86getjmptype());
} }
#if !defined(__GLIBC__) || (__GLIBC__ < 2) /* libc5 */ #if !defined(__GLIBC__) || (__GLIBC__ < 2) /* libc5 */
@ -1998,7 +2042,7 @@ xf86setjmp1(xf86jmp_buf env, int arg2)
int int
xf86setjmp1(xf86jmp_buf env, int arg2) xf86setjmp1(xf86jmp_buf env, int arg2)
{ {
FatalError("setjmp: type 1 called instead of type %d\n", xf86getjmptype()); FatalError("setjmp: type 1 called instead of type %d", xf86getjmptype());
} }
#endif /* HAS_GLIBC_SIGSETJMP */ #endif /* HAS_GLIBC_SIGSETJMP */
@ -2012,7 +2056,7 @@ xf86setjmp1_arg2()
int int
xf86setjmperror(xf86jmp_buf env) xf86setjmperror(xf86jmp_buf env)
{ {
FatalError("setjmp: don't know how to handle setjmp() type %d\n", FatalError("setjmp: don't know how to handle setjmp() type %d",
xf86getjmptype()); xf86getjmptype());
} }

View File

@ -67,7 +67,7 @@ VBEExtendedInit(xf86Int10InfoPtr pInt, int entityIndex, int Flags)
goto error; goto error;
xf86DrvMsg(screen,X_INFO,"initializing int10\n"); xf86DrvMsg(screen,X_INFO,"initializing int10\n");
pInt = xf86InitInt10(entityIndex); pInt = xf86ExtendedInitInt10(entityIndex,Flags);
if (!pInt) if (!pInt)
goto error; goto error;
init_int10 = TRUE; init_int10 = TRUE;