ntdll/signal_i386.c: __wine_enter_vm86 issue

Christoph Bumiller e0425955 at stud3.tuwien.ac.at
Tue Dec 12 10:40:21 CST 2006


I tried to run some DOS games with wine recently and since most of them
crashed with a page fault I tried to find out why and so, examining the 
last function calls before faulting revealed that when
__wine_enter_vm86 in signal_i386.c returns from
	res = vm86_enter(...)
and encounters a VM86TYPE(res) == VM86_UNKNOWN it calls the
raise_segv_exception, which in turn calls NtSetContextThread.
This one calls set_cpu_context which tries to reload the context
of the VM86 thread an, of course, crashes since it can't load
the segment registers with invalid (non GDT) values.

Backtrace:
=>1 0x7efe2a57 in ntdll (+0x52a57) (0x7d55e348)
  2 0x7efd9a8d NtSetContextThread+0x77() in ntdll (0x7d55e478)
  3 0x7efd412e in ntdll (+0x4412e) (0x7d55e498)
  4 0x7efd5032 __wine_enter_vm86+0x1d6() in ntdll (0x7d55e608)
  5 0x7eeb9b15 K32WOWCallback16Ex+0x417() in kernel32 (0x7d55e668)
fixme:dbghelp_dwarf:dwarf2_parse_variable Unsupported constant 
max_clusters in function
fixme:dbghelp_dwarf:dwarf2_parse_variable Unsupported constant 
max_sectors_per_cluster in function
fixme:dbghelp_dwarf:dwarf2_parse_variable Unsupported constant 
max_bytes_per_sector in function
  6 0x7d6f50bb DOSVM_Enter+0xab(context=0x7d55e760) 
[/home/chr/WINE/CVS_BUILD/dlls/winedos/dosvm.c:586] in winedos 
(0x7d55e748)
  7 0x7d71254b MZ_DOSVM+0xbb(lpExtra=0x0) 
[/home/chr/WINE/CVS_BUILD/dlls/winedos/module.c:638] in winedos 
(0x7d55ea48)
  8 0x7eeacdf6 in kernel32 (+0x6cdf6) (0x7d55eb28)
  9 0x7efd9939 in ntdll (+0x49939) (0x7d55f448)
  10 0xb7de1512 start_thread+0x84() in libpthread.so.0 (0x7d55f4d8)
  11 0xb7d7afde __clone+0x5e() in libc.so.6 (0x00000000)
0x7efe2a57: pop %es

My question, is this a bug, and, if so, what should be done
to correct it? Is it sufficient to just make raise_segv_exception
return if context->Eflags indicate VM86 instead of calling 
NtSetContextThread ?

In my example (Realms of Arkania: Blade of Destiny) this lets the app 
continue and I get the initial text box to select difficulty level. But 
... the process doesn't handle any input - events are queued but never 
handled p.e. by DOSVM_Wait or similar ...

Unfortunately I don't know much about this stuff ... what procedure is 
responsible to handle these asynchronous events and when ?





More information about the wine-devel mailing list