https://bugs.winehq.org/show_bug.cgi?id=56912
--- Comment #12 from Zeb Figura z.figura12@gmail.com --- (In reply to stormtrackertony from comment #8)
Do you recall if you were able to see radar data on the map with the new version (instead of just a blank map?)
I think so? It's hard to tell, the map was mostly static. There was a timer ticking though.
One thing I noticed that may or may not be important. Though the error happens in the same manner, the backtrace is different between Wine version 8.0.1 and 9.0...When the program developer first said the problem was ldsl , it was because of the backtrace on 8.0.1 (just attached in the post above)...It includes:
0x0043a534 gr2analyst+0x3a534: ldsl %eax,%esi
and does not even mention vcmpps...The backtrace I originally posted here was after upgrading to Wine 9.0 which replaced that ldsl line with:
0x0043a534 gr2analyst+0x3a534: vcmpps $0x0e, %xmm0, %xmm1, %xmm2
Does seeing this old file with ldsl mention change your thoughts?
The faulting opcode sequence for the vcmpps instruction from the crash report is C5 F0 C2 D0 0E.
LDS is encoded as C5 plus a mod/r/m byte. A mod/r/m byte can encoded either a register or indirectly addressed memory. However, unlike most instructions that use a mod/r/m byte, due to its semantics the LDS instruction does not make sense with a register, only with memory (e.g. while "ldsl (%eax),%esi" makes sense; "ldsl %eax,%esi" does not.) Hence LDS with a register has always generated #UD (i.e. "invalid instruction" i.e. SIGILL).
When AVX was introduced it reused that part of the encoding space for other instructions, since it previously made no sense.
However, a naïve enough disassembler that (a) does not know about AVX, and (b) does not include enough validity checks to forbid LDS with a register, will try to interpret the bytes as C5 F0, and disassemble the instruction as "ldsl %eax,%esi".
Prior to Wine 8.3, winedbg had such a naïve disassembler with those flaws. In 8.3 we replaced it with an external library that knew about AVX. This is why there is a difference in how the instruction is decoded.