The macro expanding to quite a few insns, replace its use by simply clearing the status flags when the to be executed insn doesn't depend on their initial state, in cases where this is easily possible. (There are more cases where the uses are hidden inside macros, and where some of the users of the macros want guest flags put in place before running the insn, i.e. the macros can't be updated as easily.)
Signed-off-by: Jan Beulich <[email protected]> --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -6863,7 +6863,8 @@ x86_emulate( } opc[2] = 0xc3; - invoke_stub(_PRE_EFLAGS("[eflags]", "[mask]", "[tmp]"), + _regs.eflags &= ~EFLAGS_MASK; + invoke_stub("", _POST_EFLAGS("[eflags]", "[mask]", "[tmp]"), [eflags] "+g" (_regs.eflags), [tmp] "=&r" (dummy), "+m" (*mmvalp) @@ -8111,7 +8112,8 @@ x86_emulate( opc[2] = 0xc3; copy_VEX(opc, vex); - invoke_stub(_PRE_EFLAGS("[eflags]", "[mask]", "[tmp]"), + _regs.eflags &= ~EFLAGS_MASK; + invoke_stub("", _POST_EFLAGS("[eflags]", "[mask]", "[tmp]"), [eflags] "+g" (_regs.eflags), "=a" (dst.val), [tmp] "=&r" (dummy) @@ -11698,13 +11700,14 @@ int x86_emul_rmw( break; case rmw_xadd: + *eflags &= ~EFLAGS_MASK; switch ( state->op_bytes ) { unsigned long dummy; #define XADD(sz, cst, mod) \ case sz: \ - asm ( _PRE_EFLAGS("[efl]", "[msk]", "[tmp]") \ + asm ( "" \ COND_LOCK(xadd) " %"#mod"[reg], %[mem]; " \ _POST_EFLAGS("[efl]", "[msk]", "[tmp]") \ : [reg] "+" #cst (state->ea.val), \
