aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2004-11-14 15:39:16 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2004-11-14 15:39:16 +0000
commit61a8c4ec3a39cf8547aba056f03574a5fac31fdd (patch)
tree103d0fe806e291f8ca8477a8c7346cc8fc28a546 /tests
parent9746b15b4ecd4702410a2769f6d18a67dbd0872d (diff)
enter insn fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1135 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'tests')
-rw-r--r--tests/test-i386.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/tests/test-i386.c b/tests/test-i386.c
index 29f0dfa1f..a4bfa34de 100644
--- a/tests/test-i386.c
+++ b/tests/test-i386.c
@@ -1625,7 +1625,55 @@ void test_self_modifying_code(void)
printf("smc_code2(%d) = %d\n", i, smc_code2(i));
}
}
-
+
+int enter_stack[4096];
+
+#define TEST_ENTER(size, stack_type, level)\
+{\
+ int esp_save, esp_val, ebp_val, ebp_save, i;\
+ stack_type *ptr, *stack_end, *stack_ptr;\
+ memset(enter_stack, 0, sizeof(enter_stack));\
+ stack_end = stack_ptr = (stack_type *)(enter_stack + 4096);\
+ ebp_val = (long)stack_ptr;\
+ for(i=1;i<=32;i++)\
+ *--stack_ptr = i;\
+ esp_val = (long)stack_ptr;\
+ asm("movl %%esp, %[esp_save]\n"\
+ "movl %%ebp, %[ebp_save]\n"\
+ "movl %[esp_val], %%esp\n"\
+ "movl %[ebp_val], %%ebp\n"\
+ "enter" size " $12, $" #level "\n"\
+ "movl %%esp, %[esp_val]\n"\
+ "movl %%ebp, %[ebp_val]\n"\
+ "movl %[esp_save], %%esp\n"\
+ "movl %[ebp_save], %%ebp\n"\
+ : [esp_save] "=r" (esp_save),\
+ [ebp_save] "=r" (ebp_save),\
+ [esp_val] "=r" (esp_val),\
+ [ebp_val] "=r" (ebp_val)\
+ : "[esp_val]" (esp_val),\
+ "[ebp_val]" (ebp_val));\
+ printf("level=%d:\n", level);\
+ printf("esp_val=0x%08lx\n", esp_val - (long)stack_end);\
+ printf("ebp_val=0x%08lx\n", ebp_val - (long)stack_end);\
+ for(ptr = (stack_type *)esp_val; ptr < stack_end; ptr++)\
+ printf("%08x\n", ptr[0]);\
+}
+
+static void test_enter(void)
+{
+ TEST_ENTER("l", uint32_t, 0);
+ TEST_ENTER("l", uint32_t, 1);
+ TEST_ENTER("l", uint32_t, 2);
+ TEST_ENTER("l", uint32_t, 31);
+
+ TEST_ENTER("w", uint16_t, 0);
+ TEST_ENTER("w", uint16_t, 1);
+ TEST_ENTER("w", uint16_t, 2);
+ TEST_ENTER("w", uint16_t, 31);
+}
+
+
static void *call_end __init_call = NULL;
int main(int argc, char **argv)
@@ -1653,5 +1701,6 @@ int main(int argc, char **argv)
test_exceptions();
test_self_modifying_code();
test_single_step();
+ test_enter();
return 0;
}