Luca Tettamanti wrote:When the old value and new one are the same the emulator skips the
write; this is undesiderable when the destination is a MMIO area and the
write shall be performed regardless of the previous value. This
optimization breaks e.g. a Linux guest APIC compiled without
X86_GOOD_APIC.
Remove the check and always perform the writeback stage in the
emulation.
Unfortunately, this kills Windows XP (first run with a guest crash, second with a host oops), so I reverted it. I'd guess some operation which doesn't need writeback ends up in the modified code. Previously, the check caused it to skip writeback, but now it writes back random memory, causing a crash.
/* Disable writeback. */
dst.orig_val = dst.val;