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@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2021-06-29 12:33:37 +02:00
1 parent f8582da041
commit f004fd7cbb
1 file changed
+6 -3
+6 -3
View File
@@ -6864,7 +6864,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)
@@ -8112,7 +8113,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)
@@ -11699,13 +11701,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), \
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.