[PATCH kvm-unit-tests 04/12] emulator: check for mov null, %ss

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



But check that rpl matches cpl.

Signed-off-by: Avi Kivity <avi@xxxxxxxxxx>
---
 x86/emulator.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/x86/emulator.c b/x86/emulator.c
index 337429c..a18ba27 100644
--- a/x86/emulator.c
+++ b/x86/emulator.c
@@ -747,6 +747,33 @@ static void test_lgdt_lidt(volatile uint8_t *mem)
     report("lidt (long address)", orig.limit == fresh.limit && orig.base == fresh.base);
 }
 
+static void ss_bad_rpl(struct ex_regs *regs)
+{
+    extern char ss_bad_rpl_cont;
+
+    ++exceptions;
+    regs->rip = (ulong)&ss_bad_rpl_cont;
+}
+
+static void test_sreg(volatile uint16_t *mem)
+{
+    u16 ss = read_ss();
+
+    // check for null segment load
+    *mem = 0;
+    asm volatile("mov %0, %%ss" : : "m"(*mem));
+    report("mov null, %ss", read_ss() == 0);
+
+    // check for exception when ss.rpl != cpl on null segment load
+    exceptions = 0;
+    handle_exception(GP_VECTOR, ss_bad_rpl);
+    *mem = 3;
+    asm volatile("mov %0, %%ss; ss_bad_rpl_cont:" : : "m"(*mem));
+    report("mov null, %ss (with ss.rpl != cpl)", exceptions == 1 && read_ss() == 0);
+    handle_exception(GP_VECTOR, 0);
+    write_ss(ss);
+}
+
 int main()
 {
 	void *mem;
@@ -798,6 +825,7 @@ int main()
 	test_rip_relative(mem, insn_ram);
 	test_shld_shrd(mem);
 	//test_lgdt_lidt(mem);
+	test_sreg(mem);
 
 	test_mmx_movq_mf(mem, insn_page, alt_insn_page, insn_ram);
 
-- 
1.7.11

--
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


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux