aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2012-02-18 09:56:09 +0200
committerPekka Enberg <penberg@kernel.org>2012-02-18 09:56:47 +0200
commit9a061b4a7ed1e59374e4aa75f57d44073b1c9e29 (patch)
tree57071c9c8e805620b15b517c6010ab534a7ef727
parent2ee893f4c5f182d5b0538c3c6f6ca0af2e6f7950 (diff)
downloadjato-9a061b4a7ed1e59374e4aa75f57d44073b1c9e29.tar.gz
x86: Fix JNI function 64-bit return values on 32-bit
This patch fixes edx clobbering issue with 64-bit JNI function return values. Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--arch/x86/jni.S12
-rw-r--r--test/functional/java/lang/JNITest.java2
2 files changed, 11 insertions, 3 deletions
diff --git a/arch/x86/jni.S b/arch/x86/jni.S
index a630f155..5634db21 100644
--- a/arch/x86/jni.S
+++ b/arch/x86/jni.S
@@ -22,10 +22,16 @@ jni_trampoline:
addl $0x4, %esp
subl $0x4, %esp # new return address
- pushl %eax # save return value
+ # save return value
+ pushl %eax
+ pushl %edx
+
call vm_leave_jni
- movl %eax, 0x4(%esp) # override return address
- popl %eax # restore return value
+ movl %eax, 0x8(%esp) # override return address
+
+ # restore return value
+ popl %edx
+ popl %eax
ret
error:
diff --git a/test/functional/java/lang/JNITest.java b/test/functional/java/lang/JNITest.java
index 319fb2c4..11aa33d8 100644
--- a/test/functional/java/lang/JNITest.java
+++ b/test/functional/java/lang/JNITest.java
@@ -120,7 +120,9 @@ public class JNITest extends TestCase {
public static void testReturnPassedLong() {
assertEquals(42l, staticReturnPassedLong(42l));
+ assertEquals(0xdeadbeefcafebabeL, staticReturnPassedLong(0xdeadbeefcafebabeL));
assertEquals(42l, jniTest.returnPassedLong(42l));
+ assertEquals(0xdeadbeefcafebabeL, jniTest.returnPassedLong(0xdeadbeefcafebabeL));
assertEquals(42l, staticReturnPassedLongArray(new long[]{42l})[0]);
assertEquals(42l, jniTest.returnPassedLongArray(new long[]{42l})[0]);
}