aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-06-24 13:29:40 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-06-24 13:29:40 +0000
commitdd3587f38e5c0745896da6b7b058d0f88fff86a0 (patch)
treed3ff432dc866945804a323d67c334d6f32dafb7f /tests
parent7d83131cc5ea95d7bb98658ac958a901ba4269de (diff)
iret and popl (%esp) tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@264 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'tests')
-rw-r--r--tests/test-i386-code16.S17
-rw-r--r--tests/test-i386.c18
2 files changed, 35 insertions, 0 deletions
diff --git a/tests/test-i386-code16.S b/tests/test-i386-code16.S
index 446f0d7bf1..78ecc1f77e 100644
--- a/tests/test-i386-code16.S
+++ b/tests/test-i386-code16.S
@@ -77,4 +77,21 @@ myfunc2:
code16_end:
+
+
+/* other 32 bits tests */
+ .code32
+
+ .globl func_lret32
+func_lret32:
+ movl $0x87654321, %eax
+ lret
+
+ .globl func_iret32
+func_iret32:
+ movl $0xabcd4321, %eax
+ iret
+
+
+
\ No newline at end of file
diff --git a/tests/test-i386.c b/tests/test-i386.c
index c2c3323948..d5fe1c402c 100644
--- a/tests/test-i386.c
+++ b/tests/test-i386.c
@@ -937,6 +937,9 @@ void test_code16(void)
printf("func3() = 0x%08x\n", res);
}
+extern char func_lret32;
+extern char func_iret32;
+
void test_misc(void)
{
char table[256];
@@ -946,6 +949,21 @@ void test_misc(void)
res = 0x12345678;
asm ("xlat" : "=a" (res) : "b" (table), "0" (res));
printf("xlat: EAX=%08x\n", res);
+
+ asm volatile ("pushl %%cs ; call %1"
+ : "=a" (res)
+ : "m" (func_lret32): "memory", "cc");
+ printf("func_lret32=%x\n", res);
+
+ asm volatile ("pushfl ; pushl %%cs ; call %1"
+ : "=a" (res)
+ : "m" (func_iret32): "memory", "cc");
+ printf("func_iret32=%x\n", res);
+
+ /* specific popl test */
+ asm volatile ("pushl $12345432 ; pushl $0x9abcdef ; popl (%%esp) ; popl %0"
+ : "=g" (res));
+ printf("popl esp=%x\n", res);
}
uint8_t str_buffer[4096];