precise self modifying code test
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@742 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
bfbc9133eb
commit
1190935d98
|
@ -1580,8 +1580,23 @@ uint8_t code[] = {
|
||||||
0xc3, /* ret */
|
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)
|
void test_self_modifying_code(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1592,6 +1607,13 @@ void test_self_modifying_code(void)
|
||||||
code[1] = i;
|
code[1] = i;
|
||||||
printf("func%d = 0x%x\n", i, ((FuncType *)code)());
|
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;
|
static void *call_end __init_call = NULL;
|
||||||
|
|
Loading…
Reference in a new issue