diff --git a/tools/tests/x86_emulator/test_x86_emulator.c b/tools/tests/x86_emulator/test_x86_emulator.c index 31666747e3..906fc6f398 100644 --- a/tools/tests/x86_emulator/test_x86_emulator.c +++ b/tools/tests/x86_emulator/test_x86_emulator.c @@ -286,7 +286,7 @@ int main(int argc, char **argv) rc = x86_emulate(&ctxt, &emulops); if ( (rc != X86EMUL_OKAY) || (*res != 0x923456AA) || - ((regs.eflags&0x240) != 0x200) || + ((regs.eflags&0xad5) != 0xa91) || (regs.eax != 0xAABBCCAA) || (regs.ecx != 0xFF) || (regs.eip != (unsigned long)&instr[4]) ) diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 219e14376f..4c90101f9c 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -4257,7 +4257,8 @@ x86_emulate( /* Save real source value, then compare EAX against destination. */ src.orig_val = src.val; src.val = _regs.eax; - emulate_2op_SrcV("cmp", src, dst, _regs.eflags); + /* cmp: %%eax - dst ==> dst and src swapped for macro invocation */ + emulate_2op_SrcV("cmp", dst, src, _regs.eflags); if ( _regs.eflags & EFLG_ZF ) { /* Success: write back to memory. */