Add test case of accessing spl/bpl/sil/dil via modrm in emulator.
Signed-off-by: Arthur Chunqi Li <[email protected]>
---
x86/emulator.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/x86/emulator.c b/x86/emulator.c
index bd02d5c..bea9513 100755
--- a/x86/emulator.c
+++ b/x86/emulator.c
@@ -840,6 +840,31 @@ static void test_nopl(uint64_t *mem, void *alt_insn_page)
report("nopl", 1);
}
+static void test_modrm(uint64_t *mem, void *alt_insn_page)
+{
+
+ MK_INSN(modrm_spl,"mov %al, %spl\n\t");
+ MK_INSN(modrm_bpl,"mov %cl, %bpl\n\t");
+ MK_INSN(modrm_sil,"mov %dl, %sil\n\t");
+ MK_INSN(modrm_dil,"mov %bl, %dil\n\t");
+
+ inregs = (struct regs){ .rax = 0x1234 };
+ trap_emulator(mem, alt_insn_page, &insn_modrm_spl);
+ report("access spl via modr/m", outregs.rax == 0x1234);
+
+ inregs = (struct regs){ .rcx = 0x1234 };
+ trap_emulator(mem, alt_insn_page, &insn_modrm_bpl);
+ report("access bpl via modr/m", outregs.rcx == 0x1234);
+
+ inregs = (struct regs){ .rdx = 0x1234 };
+ trap_emulator(mem, alt_insn_page, &insn_modrm_sil);
+ report("access sil via modr/m", outregs.rdx == 0x1234);
+
+ inregs = (struct regs){ .rbx = 0x1234 };
+ trap_emulator(mem, alt_insn_page, &insn_modrm_dil);
+ report("access dil via modr/m", outregs.rbx == 0x1234);
+}
+
static void test_crosspage_mmio(volatile uint8_t *mem)
{
volatile uint16_t w, *pw;
@@ -1037,6 +1062,7 @@ int main()
test_mmx_movq_mf(mem, alt_insn_page);
test_movabs(mem, alt_insn_page);
test_nopl(mem, alt_insn_page);
+ test_modrm(mem, alt_insn_page);
test_crosspage_mmio(mem);
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html