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. :-)