<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.14.3">
</HEAD>
<BODY>
Hi all,<BR>
<BR>
  I  compiled Xorg server from source code. My linux distribution is Debians and CPU is mipsel. I have tried source packages from freedesktop and debians. But xorg crashed when I tried to make it work. I just found it happened while graphic chip driver call outb(), which is defined as below:<BR>
<BR>
static __inline__ void<BR>
outb(unsigned PORT_SIZE port, unsigned char val)<BR>
{<BR>
        *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;<BR>
}.<BR>
<BR>
IOPortBase is defined in the same head file "hw/xfree86/common/compiler.h"<BR>
I had grepped IOPortBase in the whole source code and I got below:<BR>
<BR>
hw/xfree86/os-support/bsd/arm_video.c:                  IOPortBase = base;<BR>
hw/xfree86/os-support/bsd/arm_video.c:                  IOPortBase = base;<BR>
hw/xfree86/os-support/bsd/arm_video.c:  IOPortBase = (unsigned int)-1;<BR>
hw/xfree86/os-support/bsd/arm_video.c:       * space (e.g. 0x3B0), but IOPortBase is expected to map to<BR>
hw/xfree86/os-support/bsd/arm_video.c:      IOPortBase = (unsigned int)xf86MapInfoMap(memInfoP,<BR>
hw/xfree86/os-support/bsd/arm_video.c:          IOPortBase = (unsigned int)base;<BR>
hw/xfree86/os-support/bsd/arm_video.c:        if (IOPortBase == (unsigned int)-1)<BR>
hw/xfree86/os-support/bsd/arm_video.c:  munmap((caddr_t)IOPortBase, 0x400);<BR>
hw/xfree86/os-support/bsd/arm_video.c:  IOPortBase = (unsigned int)-1;<BR>
<BR>
hw/xfree86/common/compiler.h:unsigned int IOPortBase;  /* Memory mapped I/O port area */<BR>
hw/xfree86/common/compiler.h:   *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;<BR>
hw/xfree86/common/compiler.h:   *(volatile unsigned short*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;<BR>
hw/xfree86/common/compiler.h:   *(volatile unsigned int*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;<BR>
hw/xfree86/common/compiler.h:   return *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+IOPortBase);<BR>
hw/xfree86/common/compiler.h:   return *(volatile unsigned short*)(((unsigned PORT_SIZE)(port))+IOPortBase);<BR>
hw/xfree86/common/compiler.h:   return *(volatile unsigned int*)(((unsigned PORT_SIZE)(port))+IOPortBase);<BR>
<BR>
To the file arm_video.c, only the first line worked others are remarked. The first line is in the function:<BR>
<BR>
#if defined(USE_ARC_MMAP) || defined(__arm32__)<BR>
<BR>
Bool<BR>
xf86EnableIO()<BR>
{<BR>
        int fd;<BR>
        pointer base;<BR>
<BR>
        if (ExtendedEnabled)<BR>
                return TRUE;<BR>
<BR>
        if ((fd = open("/dev/ttyC0", O_RDWR)) >= 0) {<BR>
                /* Try to map a page at the pccons I/O space */<BR>
                base = (pointer)mmap((caddr_t)0, 65536, PROT_READ | PROT_WRITE,<BR>
                                MAP_FLAGS, fd, (off_t)0x0000);<BR>
<BR>
                if (base != (pointer)-1) {<BR>
                        IOPortBase = base;<BR>
                }<BR>
                else {<BR>
                        xf86Msg(X_WARNING,"EnableIO: failed to mmap %s (%s)\n",<BR>
                                "/dev/ttyC0", strerror(errno));<BR>
                        return FALSE;<BR>
                }<BR>
        }<BR>
        else {<BR>
                xf86Msg("EnableIO: failed to open %s (%s)\n",<BR>
                        "/dev/ttyC0", strerror(errno));<BR>
                return FALSE;<BR>
        }<BR>
<BR>
        ExtendedEnabled = TRUE;<BR>
<BR>
        return TRUE;<BR>
}<BR>
<BR>
Since there is "#if defined(USE_ARC_MMAP) || defined(__arm32__)", I am not sure that this function had been compiled into Xorg. <BR>
I just test this <BR>
#include <stdio.h><BR>
int main(void)<BR>
{<BR>
#if defined(__mips__)<BR>
        printf("mips\n");<BR>
#elif defined(__arm32__)<BR>
        printf("arm32\n");<BR>
#else<BR>
        printf("hehe\n");<BR>
#endif<BR>
        return 0;<BR>
}<BR>
and it just show "mips". So I am afraid that the function xf86EnableIO() which assigned value to IOPortBase wouldn't been compiled into Xorg.<BR>
<BR>
IOPortBase is 0 if I use my own Xorg.<BR>
<BR>
I also tried the default Xorg which works fine. IOPortBase is not 0.<BR>
<BR>
I compiled Xorg with "--enable-debug --prefix=/root/belcon".<BR>
<BR>
Any one has any ideas? Maybe it is just something related to "./configure".<BR>
<BR>
Regards,<BR>
  Belcon<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
Below is gdb output:<BR>
<BR>
<BR>
gdb hw/xfree86/Xorg <BR>
GNU gdb 6.4.90-debian<BR>
Copyright (C) 2006 Free Software Foundation, Inc.<BR>
GDB is free software, covered by the GNU General Public License, and you are<BR>
welcome to change it and/or distribute copies of it under certain conditions.<BR>
Type "show copying" to see the conditions.<BR>
There is absolutely no warranty for GDB.  Type "show warranty" for details.<BR>
This GDB was configured as "mipsel-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".<BR>
<BR>
(gdb) run<BR>
Starting program: /root/belcon/xorg-server-1.1.1/hw/xfree86/Xorg <BR>
_XSERVTransSocketOpenCOTSServer: Unable to open socket for inet6<BR>
_XSERVTransOpen: transport open failed for inet6/debian:0<BR>
_XSERVTransMakeAllCOTSServerListeners: failed to open listener for inet6<BR>
<BR>
X Window System Version 7.1.1<BR>
Release Date: 12 May 2006<BR>
X Protocol Version 11, Revision 0, Release 7.1.1<BR>
Build Operating System: Linux 2.6.18.1 mips64 <BR>
Current Operating System: Linux debian 2.6.18.1 #3 Mon Sep 3 12:52:27 CST 2007 mips64<BR>
Build Date: 21 March 2008<BR>
        Before reporting problems, check <A HREF="http://wiki.x.org">http://wiki.x.org</A><BR>
        to make sure that you have the latest version.<BR>
Module Loader present<BR>
Markers: (--) probed, (**) from config file, (==) default setting,<BR>
        (++) from command line, (!!) notice, (II) informational,<BR>
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.<BR>
(==) Log file: "/root/belcon//var/log/Xorg.0.log", Time: Mon Mar 24 14:18:39 2008<BR>
(==) Using config file: "/etc/X11/xorg.conf"<BR>
[tcsetpgrp failed in terminal_inferior: 不允许的操作]<BR>
(EE) Silicon MotionlcdWidth = 1280<BR>
LCD Base =        0<BR>
FBOffset is 0x0<BR>
<BR>
Program received signal SIGSEGV, Segmentation fault.<BR>
SMI_SaveScreen (pScreen=<value optimized out>, mode=<value optimized out>)<BR>
    at /usr/include/xorg/compiler.h:916<BR>
916             *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;<BR>
(gdb) print IOPortBase<BR>
$1 = 0<BR>
(gdb) bt f<BR>
#0  SMI_SaveScreen (pScreen=<value optimized out>, mode=<value optimized out>)<BR>
    at /usr/include/xorg/compiler.h:916<BR>
        seq1 = <value optimized out><BR>
        pScrn = <value optimized out><BR>
        on = 1<BR>
        pSmi = (SMIPtr) 0x64a280<BR>
#1  0x0042ef10 in SaveScreens (on=2, mode=0) at window.c:3386<BR>
        i = 0<BR>
        what = 1<BR>
        type = 1<BR>
#2  0x00423d00 in main (argc=1, argv=0x7f80bab4, envp=<value optimized out>)<BR>
    at main.c:434<BR>
        pScreen = <value optimized out><BR>
        i = 1<BR>
        error = 6412720<BR>
        xauthfile = <value optimized out><BR>
        alwaysCheckForInput = {0, 1}<BR>
<BR>
</BODY>
</HTML>