x86emul: extend x86_insn_is_mem_write() coverage

Several insns were missed when this function was first added. As far as
insns already supported by the emulator go - SMSW and {,V}STMXCSR were
wrongly considered r/o insns so far.

Insns like the VMX, SVM, or CET-SS ones, PTWRITE, or AMD's new SNP ones
are intentionally not covered just yet. VMPTRST is put there just to
complete the respective group.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2020-05-05 09:50:54 +02:00
1 parent fe36a173d1
commit fc6fa977be
1 file changed
+28 -2
+28 -2
View File
@@ -11551,13 +11551,39 @@ x86_insn_is_mem_write(const struct x86_emulate_state *state,
break;
case X86EMUL_OPC(0x0f, 0x01):
return !(state->modrm_reg & 6); /* SGDT / SIDT */
switch ( state->modrm_reg & 7 )
{
case 0: /* SGDT */
case 1: /* SIDT */
case 4: /* SMSW */
return true;
}
break;
case X86EMUL_OPC(0x0f, 0xae):
switch ( state->modrm_reg & 7 )
{
case 0: /* FXSAVE */
case 3: /* {,V}STMXCSR */
case 4: /* XSAVE */
case 6: /* XSAVEOPT */
return true;
}
break;
case X86EMUL_OPC(0x0f, 0xba):
return (state->modrm_reg & 7) > 4; /* BTS / BTR / BTC */
case X86EMUL_OPC(0x0f, 0xc7):
return (state->modrm_reg & 7) == 1; /* CMPXCHG{8,16}B */
switch ( state->modrm_reg & 7 )
{
case 1: /* CMPXCHG{8,16}B */
case 4: /* XSAVEC */
case 5: /* XSAVES */
case 7: /* VMPTRST */
return true;
}
break;
}
return false;
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.