Revision 61a8c4ec tests/test-i386.c
b/tests/test-i386.c | ||
---|---|---|
1625 | 1625 |
printf("smc_code2(%d) = %d\n", i, smc_code2(i)); |
1626 | 1626 |
} |
1627 | 1627 |
} |
1628 |
|
|
1628 |
|
|
1629 |
int enter_stack[4096]; |
|
1630 |
|
|
1631 |
#define TEST_ENTER(size, stack_type, level)\ |
|
1632 |
{\ |
|
1633 |
int esp_save, esp_val, ebp_val, ebp_save, i;\ |
|
1634 |
stack_type *ptr, *stack_end, *stack_ptr;\ |
|
1635 |
memset(enter_stack, 0, sizeof(enter_stack));\ |
|
1636 |
stack_end = stack_ptr = (stack_type *)(enter_stack + 4096);\ |
|
1637 |
ebp_val = (long)stack_ptr;\ |
|
1638 |
for(i=1;i<=32;i++)\ |
|
1639 |
*--stack_ptr = i;\ |
|
1640 |
esp_val = (long)stack_ptr;\ |
|
1641 |
asm("movl %%esp, %[esp_save]\n"\ |
|
1642 |
"movl %%ebp, %[ebp_save]\n"\ |
|
1643 |
"movl %[esp_val], %%esp\n"\ |
|
1644 |
"movl %[ebp_val], %%ebp\n"\ |
|
1645 |
"enter" size " $12, $" #level "\n"\ |
|
1646 |
"movl %%esp, %[esp_val]\n"\ |
|
1647 |
"movl %%ebp, %[ebp_val]\n"\ |
|
1648 |
"movl %[esp_save], %%esp\n"\ |
|
1649 |
"movl %[ebp_save], %%ebp\n"\ |
|
1650 |
: [esp_save] "=r" (esp_save),\ |
|
1651 |
[ebp_save] "=r" (ebp_save),\ |
|
1652 |
[esp_val] "=r" (esp_val),\ |
|
1653 |
[ebp_val] "=r" (ebp_val)\ |
|
1654 |
: "[esp_val]" (esp_val),\ |
|
1655 |
"[ebp_val]" (ebp_val));\ |
|
1656 |
printf("level=%d:\n", level);\ |
|
1657 |
printf("esp_val=0x%08lx\n", esp_val - (long)stack_end);\ |
|
1658 |
printf("ebp_val=0x%08lx\n", ebp_val - (long)stack_end);\ |
|
1659 |
for(ptr = (stack_type *)esp_val; ptr < stack_end; ptr++)\ |
|
1660 |
printf("%08x\n", ptr[0]);\ |
|
1661 |
} |
|
1662 |
|
|
1663 |
static void test_enter(void) |
|
1664 |
{ |
|
1665 |
TEST_ENTER("l", uint32_t, 0); |
|
1666 |
TEST_ENTER("l", uint32_t, 1); |
|
1667 |
TEST_ENTER("l", uint32_t, 2); |
|
1668 |
TEST_ENTER("l", uint32_t, 31); |
|
1669 |
|
|
1670 |
TEST_ENTER("w", uint16_t, 0); |
|
1671 |
TEST_ENTER("w", uint16_t, 1); |
|
1672 |
TEST_ENTER("w", uint16_t, 2); |
|
1673 |
TEST_ENTER("w", uint16_t, 31); |
|
1674 |
} |
|
1675 |
|
|
1676 |
|
|
1629 | 1677 |
static void *call_end __init_call = NULL; |
1630 | 1678 |
|
1631 | 1679 |
int main(int argc, char **argv) |
... | ... | |
1653 | 1701 |
test_exceptions(); |
1654 | 1702 |
test_self_modifying_code(); |
1655 | 1703 |
test_single_step(); |
1704 |
test_enter(); |
|
1656 | 1705 |
return 0; |
1657 | 1706 |
} |
Also available in: Unified diff