aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2012-01-16 18:31:45 +0200
committerPekka Enberg <penberg@kernel.org>2012-01-16 18:34:28 +0200
commitb8a88ddc24b32669544bee739192bbd0980ac6e7 (patch)
treeb0a672f98e42671d200079f86cabbb04770c8137
parent0f674ef730b40f5753597cf81de355958ca2ae8b (diff)
downloadjato-b8a88ddc24b32669544bee739192bbd0980ac6e7.tar.gz
vm: Fix args count for static JNI methods
We pass reference to method class automatically for static JNI methods. However, we also need to clean them up on architectures that pass arguments on the stack. Before: [main] 0xa72f7997: bf 30 ac 53 0a mov $0xa53ac30,%edi [main] 0xa72f799c: 57 push %edi [main] 0xa72f799d: f6 04 25 00 f0 9f 09 00 testb $0x0,0x99ff000(,%eiz,1) [main] 0xa72f79a5: e8 f6 e0 ff ff call 0x00000000a72f5aa0 # gnu/java/nio/VMChannel.initIDs()V [main] 0xa72f79aa: 65 8b 3d ec b7 ff ff mov %gs:0xffffb7ec,%edi [main] 0xa72f79b1: 85 3f test %edi,(%edi) [main] 0xa72f79b3: e9 01 00 00 00 jmp 0x00000000a72f79b9 After: [main] 0xa735b997: bf 30 6c 45 0a mov $0xa456c30,%edi [main] 0xa735b99c: 57 push %edi [main] 0xa735b99d: f6 04 25 00 b0 91 09 00 testb $0x0,0x991b000(,%eiz,1) [main] 0xa735b9a5: e8 f6 e0 ff ff call 0x00000000a7359aa0 # gnu/java/nio/VMChannel.initIDs()V [main] 0xa735b9aa: 81 c4 04 00 00 00 add $0x4,%esp [main] 0xa735b9b0: 65 8b 3d ec b7 ff ff mov %gs:0xffffb7ec,%edi [main] 0xa735b9b7: 85 3f test %edi,(%edi) [main] 0xa735b9b9: e9 01 00 00 00 jmp 0x00000000a735b9bf This patch fixes one stack smashing bug detected by -Xdebug:stack command line option on 32-bit x86. Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--include/jit/args.h6
-rw-r--r--vm/method.c4
2 files changed, 5 insertions, 5 deletions
diff --git a/include/jit/args.h b/include/jit/args.h
index ad554bf3..e22d1e02 100644
--- a/include/jit/args.h
+++ b/include/jit/args.h
@@ -30,12 +30,8 @@ static inline int get_stack_args_count(struct vm_method *method)
size = method->args_count;
- if (vm_method_is_jni(method)) {
- if (vm_method_is_static(method))
- size++;
-
+ if (vm_method_is_jni(method))
size++;
- }
return size - method->reg_args_count;
}
diff --git a/vm/method.c b/vm/method.c
index ce75a866..8bdbf74c 100644
--- a/vm/method.c
+++ b/vm/method.c
@@ -76,6 +76,10 @@ int vm_method_do_init(struct vm_method *vmm)
vmm->flags |= VM_METHOD_FLAG_VM_NATIVE;
}
+ /* We pass reference to method class for static JNI methods. */
+ if (vm_method_is_jni(vmm) && vm_method_is_static(vmm))
+ ++vmm->args_count;
+
if (args_map_init(vmm))
return -1;