[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86emul: avoid using _PRE_EFLAGS() in a few cases
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 <jbeulich@xxxxxxxx> --- 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), \
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |