From: bellard Date: Sun, 25 Apr 2004 17:54:32 +0000 (+0000) Subject: precise self modifying code test X-Git-Tag: release_0_9_0-iwjtag~1653 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=1190935d98ec8a8e2e2438858bee8bd5e49ee324;p=qemu-xen-4.6-testing.git precise self modifying code test git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@742 c046a42c-6fe2-441c-8c8c-71466251a162 --- diff --git a/tests/test-i386.c b/tests/test-i386.c index 3e10a9931..27a899830 100644 --- a/tests/test-i386.c +++ b/tests/test-i386.c @@ -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;