diff options
author | Pekka Enberg <penberg@kernel.org> | 2012-02-18 09:56:09 +0200 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-02-18 09:56:47 +0200 |
commit | 9a061b4a7ed1e59374e4aa75f57d44073b1c9e29 (patch) | |
tree | 57071c9c8e805620b15b517c6010ab534a7ef727 | |
parent | 2ee893f4c5f182d5b0538c3c6f6ca0af2e6f7950 (diff) | |
download | jato-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.S | 12 | ||||
-rw-r--r-- | test/functional/java/lang/JNITest.java | 2 |
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]); } |