IO test doesn't clobber EAX register between out and in so if they do nothing test succeed where it should fail. Fix that. Enlarge space for tested code from 16 bytes to 32 bytes since now some tests are longer then 16 bytes. Change ".pushsection .text" (which does nothing since we are already in .text and thus test code is left in the middle of the main code) to use subsections. Signed-off-by: Gleb Natapov <gleb@xxxxxxxxxx> diff --git a/kvm/user/test/x86/realmode.c b/kvm/user/test/x86/realmode.c index 9bf6cb0..bc6b27f 100644 --- a/kvm/user/test/x86/realmode.c +++ b/kvm/user/test/x86/realmode.c @@ -87,7 +87,7 @@ static void exec_in_big_real_mode(const struct regs *inregs, "xchg %%esp, %[save]+24 \n\t" "xchg %%ebp, %[save]+28 \n\t" - "test_insn: . = . + 16\n\t" + "test_insn: . = . + 32\n\t" "test_insn_end: \n\t" "xchg %%eax, %[save]+0 \n\t" @@ -134,10 +134,10 @@ int regs_equal(const struct regs *r1, const struct regs *r2, int ignore) #define MK_INSN(name, str) \ asm ( \ - ".pushsection \".text\" \n\t" \ + ".text 1\n\t" \ "insn_" #name ": " str " \n\t" \ "insn_" #name "_end: \n\t" \ - ".popsection \n\t" \ + ".text\n\t" \ ); \ extern u8 insn_##name[], insn_##name##_end[] @@ -293,25 +293,31 @@ void test_io(void) { struct regs inregs = { 0 }, outregs; MK_INSN(io_test1, "mov $0xff, %al \n\t" - "out %al, $0x10 \n\t" - "in $0x10, %al \n\t"); + "out %al, $0xe0 \n\t" + "mov $0x00, %al \n\t" + "in $0xe0, %al \n\t"); MK_INSN(io_test2, "mov $0xffff, %ax \n\t" - "out %ax, $0x10 \n\t" - "in $0x10, %ax \n\t"); + "out %ax, $0xe0 \n\t" + "mov $0x0000, %ax \n\t" + "in $0xe0, %ax \n\t"); MK_INSN(io_test3, "mov $0xffffffff, %eax \n\t" - "out %eax, $0x10 \n\t" - "in $0x10, %eax \n\t"); - MK_INSN(io_test4, "mov $0x10, %dx \n\t" + "out %eax, $0xe0 \n\t" + "mov $0x000000, %eax \n\t" + "in $0xe0, %eax \n\t"); + MK_INSN(io_test4, "mov $0xe0, %dx \n\t" "mov $0xff, %al \n\t" "out %al, %dx \n\t" + "mov $0x00, %al \n\t" "in %dx, %al \n\t"); - MK_INSN(io_test5, "mov $0x10, %dx \n\t" + MK_INSN(io_test5, "mov $0xe0, %dx \n\t" "mov $0xffff, %ax \n\t" "out %ax, %dx \n\t" + "mov $0x0000, %ax \n\t" "in %dx, %ax \n\t"); - MK_INSN(io_test6, "mov $0x10, %dx \n\t" + MK_INSN(io_test6, "mov $0xe0, %dx \n\t" "mov $0xffffffff, %eax \n\t" "out %eax, %dx \n\t" + "mov $0x00000000, %eax \n\t" "in %dx, %eax \n\t"); exec_in_big_real_mode(&inregs, &outregs, -- Gleb. -- 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