Message ID | 5bf829b6-c60d-7849-e2a5-f84485849197@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | x86emul: extend x86_insn_is_mem_write() coverage | expand |
On 04/05/2020 16:06, Jan Beulich wrote: > [CAUTION - EXTERNAL EMAIL] DO NOT reply, click links, or open attachments unless you have verified the sender and know the content is safe. > > 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>
--- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -11551,13 +11551,39 @@ x86_insn_is_mem_write(const struct x86_e 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;
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>