Commit 1190935d98ec8a8e2e2438858bee8bd5e49ee324

Authored by bellard
1 parent bfbc9133

precise self modifying code test


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@742 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 23 additions and 1 deletions
tests/test-i386.c
@@ -1580,8 +1580,23 @@ uint8_t code[] = { @@ -1580,8 +1580,23 @@ uint8_t code[] = {
1580 0xc3, /* ret */ 1580 0xc3, /* ret */
1581 }; 1581 };
1582 1582
1583 -typedef int FuncType(void); 1583 +asm("smc_code2:\n"
  1584 + "movl 4(%esp), %eax\n"
  1585 + "movl %eax, smc_patch_addr2 + 1\n"
  1586 + "nop\n"
  1587 + "nop\n"
  1588 + "nop\n"
  1589 + "nop\n"
  1590 + "nop\n"
  1591 + "nop\n"
  1592 + "nop\n"
  1593 + "nop\n"
  1594 + "smc_patch_addr2:\n"
  1595 + "movl $1, %eax\n"
  1596 + "ret\n");
1584 1597
  1598 +typedef int FuncType(void);
  1599 +extern int smc_code2(int);
1585 void test_self_modifying_code(void) 1600 void test_self_modifying_code(void)
1586 { 1601 {
1587 int i; 1602 int i;
@@ -1592,6 +1607,13 @@ void test_self_modifying_code(void) @@ -1592,6 +1607,13 @@ void test_self_modifying_code(void)
1592 code[1] = i; 1607 code[1] = i;
1593 printf("func%d = 0x%x\n", i, ((FuncType *)code)()); 1608 printf("func%d = 0x%x\n", i, ((FuncType *)code)());
1594 } 1609 }
  1610 +
  1611 + /* more difficult test : the modified code is just after the
  1612 + modifying instruction. It is forbidden in Intel specs, but it
  1613 + is used by old DOS programs */
  1614 + for(i = 2; i <= 4; i++) {
  1615 + printf("smc_code2(%d) = %d\n", i, smc_code2(i));
  1616 + }
1595 } 1617 }
1596 1618
1597 static void *call_end __init_call = NULL; 1619 static void *call_end __init_call = NULL;