precise self modifying code test
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 25 Apr 2004 17:54:32 +0000 (17:54 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 25 Apr 2004 17:54:32 +0000 (17:54 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@742 c046a42c-6fe2-441c-8c8c-71466251a162

tests/test-i386.c

index 3e10a99..27a8998 100644 (file)
@@ -1580,8 +1580,23 @@ uint8_t code[] = {
     0xc3, /* ret */
 };
 
-typedef int FuncType(void);
+asm("smc_code2:\n"
+    "movl 4(%esp), %eax\n"
+    "movl %eax, smc_patch_addr2 + 1\n"
+    "nop\n"
+    "nop\n"
+    "nop\n"
+    "nop\n"
+    "nop\n"
+    "nop\n"
+    "nop\n"
+    "nop\n"
+    "smc_patch_addr2:\n"
+    "movl $1, %eax\n"
+    "ret\n");
 
+typedef int FuncType(void);
+extern int smc_code2(int);
 void test_self_modifying_code(void)
 {
     int i;
@@ -1592,6 +1607,13 @@ void test_self_modifying_code(void)
         code[1] = i;
         printf("func%d = 0x%x\n", i, ((FuncType *)code)());
     }
+
+    /* more difficult test : the modified code is just after the
+       modifying instruction. It is forbidden in Intel specs, but it
+       is used by old DOS programs */
+    for(i = 2; i <= 4; i++) {
+        printf("smc_code2(%d) = %d\n", i, smc_code2(i));
+    }
 }
     
 static void *call_end __init_call = NULL;