When compiled with -fno-omit-frame-pointer, test_lldt causes a triple fault, which insta-reboots the guest. I couldn't figure out why the triple-fault was happening, so I disabled the test outright. Knowing that the other emulator.c tests pass is more useful than a VM stuck in a reboot loop. On x86-64, this test was adding little value since it was broken to begin with: an LDT descriptor is 16 bytes on x86-64. The GDT limit was also bogus. I've fixed these problems for posterity. N.B. I only tested this on Linux 4.3.5. Perhaps lldt emulation has been fixed since then. Signed-off-by: Peter Feiner <pfeiner@xxxxxxxxxx> --- x86/emulator.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/x86/emulator.c b/x86/emulator.c index d990961..3730721 100644 --- a/x86/emulator.c +++ b/x86/emulator.c @@ -1006,10 +1006,17 @@ static void test_sreg(volatile uint16_t *mem) write_ss(ss); } +/* Broken emulation causes triple fault, which skips the other tests. */ +#if 0 static void test_lldt(volatile uint16_t *mem) { - u64 gdt[] = { 0, 0x0000f82000000ffffull /* ldt descriptor */ }; - struct descriptor_table_ptr gdt_ptr = { .limit = 0xffff, .base = (ulong)&gdt }; + u64 gdt[] = { 0, /* null descriptor */ +#ifdef __X86_64__ + 0, /* ldt descriptor is 16 bytes in long mode */ +#endif + 0x0000f82000000ffffull /* ldt descriptor */ }; + struct descriptor_table_ptr gdt_ptr = { .limit = sizeof(gdt) - 1, + .base = (ulong)&gdt }; struct descriptor_table_ptr orig_gdt; cli(); @@ -1021,6 +1028,7 @@ static void test_lldt(volatile uint16_t *mem) sti(); report("lldt", sldt() == *mem); } +#endif static void test_ltr(volatile uint16_t *mem) { @@ -1139,7 +1147,7 @@ int main() test_shld_shrd(mem); //test_lgdt_lidt(mem); test_sreg(mem); - test_lldt(mem); + //test_lldt(mem); test_ltr(mem); test_cmov(mem); -- 2.7.0.rc3.207.g0ac5344 -- 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