mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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:
1 parent
f8582da041
commit
f004fd7cbb
1 file changed
+6
-3
@@ -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), \
|
||||
|
||||