Hi ... here's another one: As I wrote a few hours ago, the command
$ strace XFree86 :0  yields:

>    write(2, "TDFX(0): ", 9TDFX(0): )                = 9
>    write(0, "TDFX(0): ", 9)                = 9
>    write(2, "Primary V_BIOS segment is: 0xc00"..., 34Primary V_BIOS segment is: 
>0xc000) = 34
>    write(0, "Primary V_BIOS segment is: 0xc00"..., 34) = 34
>    rt_sigprocmask(SIG_BLOCK, [IO], [], 8)  = 0
>    vm86old(0x82cd9d8 <unfinished ...>
>    +++ killed by SIGSEGV +++


I have now installed the XFree86 sources and found the function that actually
kills the X-server in xc/programs/Xserver/hw/kdrive/vesa/vm86.c, lines 646ff
(Xfree86 4.0.3):


  static int
  vm86old(struct vm86_struct *vm)
  {
      int res;
   
      asm volatile (
          "pushl %%ebx\n\t"
          "movl %2, %%ebx\n\t"
          "movl %1,%%eax\n\t"
          "int $0x80\n\t"
          "popl %%ebx"
          : "=a" (res)  : "n" (113), "r" (vm));
      if(res < 0) {
          errno = -res;
          res = -1;
      } else
          errno = 0;
      return res;
  }


btw: vm86_struct is defined in /usr/src/linux-2.4.5/include/asm-i386/vm86.h:

  struct vm86_struct {
          struct vm86_regs regs;
          unsigned long flags;
          unsigned long screen_bitmap;
          unsigned long cpu_type;
          struct revectored_struct int_revectored;
          struct revectored_struct int21_revectored;
  };


I' not familiar with 386 assembler, but some expert from this list might
have a clue. Does plex86 change an interrupt vector and not restore it properly?

I'm not keen to compile the X-server, but maybe I'll have no other choice ...

m.   :-)

Reply via email to