Skip to contentSkip to conversation

fix realmode.c emulator test

PATCH Applied Gleb Natapov 2 participants 2 messages Mar 1, 2010 – Mar 2, 2010 KVM

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix realmode.c emulator test

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.

kvm/user/test/x86/realmode.c +18 -12
index 9bf6cb0..bc6b27f 100644
@@ -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.

#1 lore raw
Quoted 10 lines · Gleb Natapov

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.

Applied both, thanks.