cmov instruction on 64-bit with dword destination register operand should clear bits [63:32]. This test checks this behavior due to previous KVM bug. Signed-off-by: Nadav Amit <namit@xxxxxxxxxxxxxxxxx> --- x86/emulator.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/x86/emulator.c b/x86/emulator.c index 460949f..1fd0ca6 100644 --- a/x86/emulator.c +++ b/x86/emulator.c @@ -710,6 +710,18 @@ static void test_shld_shrd(u32 *mem) report("shrd (cl)", *mem == ((0x12345678 >> 3) | (5u << 29))); } +static void test_cmov(u32 *mem) +{ + u64 val; + *mem = 0xabcdef12u; + asm ("movq $0x1234567812345678, %%rax\n\t" + "cmpl %%eax, %%eax\n\t" + "cmovnel (%[mem]), %%eax\n\t" + "movq %%rax, %[val]\n\t" + : [val]"=r"(val) : [mem]"r"(mem) : "%rax", "cc"); + report("cmovnel", val == 0x12345678ul); +} + #define INSN_XCHG_ALL \ "xchg %rax, 0+save \n\t" \ "xchg %rbx, 8+save \n\t" \ @@ -1054,12 +1066,12 @@ int main() test_sreg(mem); test_lldt(mem); test_ltr(mem); + test_cmov(mem); test_mmx_movq_mf(mem, insn_page, alt_insn_page, insn_ram); test_movabs(mem, insn_page, alt_insn_page, insn_ram); test_smsw_reg(mem, insn_page, alt_insn_page, insn_ram); test_nop(mem, insn_page, alt_insn_page, insn_ram); - test_crosspage_mmio(mem); test_string_io_mmio(mem); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html