From: Gleb Natapov <[email protected]>

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 <[email protected]>
Signed-off-by: Marcelo Tosatti <[email protected]>

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,
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to