aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2013-03-25 10:47:21 +0200
committerPekka Enberg <penberg@kernel.org>2013-03-25 10:51:55 +0200
commitd5091e7481d4c633d30c4e059efb31dd80ec7660 (patch)
tree529554cbb4d478c5acb75ae57ddd6b2dde29afc9
parentce7442daf8b6003d4567871231714aae40d475a1 (diff)
downloadjato-d5091e7481d4c633d30c4e059efb31dd80ec7660.tar.gz
x86-64: Don't use fixups for GETSTATIC
Fixups are not known to work properly on 64-bit so don't use them. This fixes this: [penberg@golgotha jato]$ ./jato -Xtrace:exceptions -cp test/functional jvm/EntryTest [main] SIGSEGV at RIP 051e9aa8 while accessing memory address 00000000. [main] Registers: [main] rsp: 00007fffde9193d0 [main] rax: 0000000041fb9d20 rbx: 0000000000008000 rcx: 0000000000008000 [main] rdx: 0000000000000000 rsi: 0000000004921000 rdi: 0000000001a5fd20 [main] rbp: 00007fffde9195b0 r8: 0000000000008000 r9: 0000000004921000 [main] r10: 0000003ba1fb0778 r11: 0000000003de7b40 r12: 0000000000008000 [main] r13: 000000000525cc80 r14: 0000000000000002 r15: 0000000001a5fd20 [main] Stack: [main] 0000000001a5fd20 0000000001a5fd20 0000000004921000 0000000000000000 [main] 0000000000008000 0000000000008000 00007fffde919440 0000000005239800 [main] 0000000005296080 0000000000000000 00000000de919460 0000000003de7088 [main] Code: 00 00 00 20 a4 7c 04 00 00 00 00 80 99 1e 05 00 00 00 00 2f 00 00 00 00 00 00 00 e1 00 00 00 00 00 00 00 10 4b 1f 05 00 00 00 00 <30> 12 19 05 00 00 00 00 28 4b 1f 05 00 00 00 00 02 00 00 00 00 [main] Native and Java stack trace: [main] [<051e9aa8>] native : signal_bh_trampoline+4dbbef4 (arch/x86/signal-bh.S:124) [main] [<41fb9140>] jit : java/util/zip/Inflater.inflate(Inflater.java:322) [main] [<41fb77f4>] jit : java/util/zip/InflaterInputStream.read(InflaterInputStream.java:196) [main] [<41f7b710>] jit : java/io/InputStreamReader.read(InputStreamReader.java:393) [main] [<41f79a75>] jit : java/io/BufferedReader.fill(BufferedReader.java:370) [main] [<41f7780b>] jit : java/io/BufferedReader.readLine(BufferedReader.java:469) [main] [<41fb6c03>] jit : gnu/java/util/jar/JarUtils.read_attributes(JarUtils.java:194) [main] [<41fb67a5>] jit : gnu/java/util/jar/JarUtils.readMainSection(JarUtils.java:140) [main] [<41fb4456>] jit : gnu/java/util/jar/JarUtils.readMFManifest(JarUtils.java:101) [main] [<41f38b51>] jit : java/util/jar/Manifest.read(Manifest.java:162) [main] [<41f35b1d>] jit : java/util/jar/Manifest.<init>(Manifest.java:89) [main] [<41f1ebdf>] jit : java/util/jar/JarFile.readManifest(JarFile.java:303) [main] [<41f1d019>] jit : java/util/jar/JarFile.<init>(JarFile.java:268) [main] [<41ecda04>] jit : gnu/java/net/protocol/jar/Connection$JarFileCache.get(Connection.java:99) [main] [<41ecac72>] jit : gnu/java/net/protocol/jar/Connection.connect(Connection.java:141) [main] [<41ec9cb2>] jit : gnu/java/net/protocol/jar/Connection.getInputStream(Connection.java:159) [main] [<41ebfbbd>] jit : java/net/URL.openStream(URL.java:737) [main] [<41bdc459>] jit : java/lang/VMClassLoader.getBootPackages(VMClassLoader.java:262) [main] [<41bcb2ab>] jit : java/lang/VMClassLoader.<clinit>(VMClassLoader.java:88) [main] [<004101b0>] native : vm_class_init+175 (/home/penberg/jato/vm/class.c:748) [main] [<004254c2>] native : vm_class_ensure_init+ffffffffffff2f64 (/home/penberg/jato/include/vm/class.h:126) [main] [<41bc5b22>] jit : java/lang/VMClassLoader.getSystemClassLoader(VMClassLoader.java) [main] [<41bc7c43>] jit : java/lang/ClassLoader$StaticData.<clinit>(ClassLoader.java:154) [main] [<004101b0>] native : vm_class_init+175 (/home/penberg/jato/vm/class.c:748) [main] [<0041e47a>] native : vm_class_ensure_init+fffffffffffebf1c (/home/penberg/jato/include/vm/class.h:126) [main] [<00419e0c>] native : static_field_signal_bh+e (/home/penberg/jato/vm/static.c:66) [main] [<0042dc3b>] native : signal_bh_trampoline+87 (arch/x86/signal-bh.S:124) [main] [<41bc4f20>] jit : java/lang/ClassLoader.getSystemClassLoader(ClassLoader.java:796) [main] [<0041b4ea>] native : native_call_gp+c6 (/home/penberg/jato/arch/x86/call.c:203) [main] [<0041b54f>] native : native_call+42 (/home/penberg/jato/arch/x86/call.c:270) [main] [<0040f877>] native : call_method_a+41 (/home/penberg/jato/vm/call.c:54) [main] [<0040f941>] native : vm_call_method_v+99 (/home/penberg/jato/vm/call.c:71) [main] [<004119f2>] native : vm_call_method_object+48e6 (/home/penberg/jato/include/vm/call.h:81) [main] [<00405e6f>] native : do_main_class+18 (/home/penberg/jato/jato.c:1004) [main] [<00405775>] native : ./jato() [0x405775] [main] [<3ba1c21734>] native : signal_bh_trampoline+3ba17f3b80 (arch/x86/signal-bh.S:124) Aborted (core dumped) and makes it visible what's really happening: [penberg@golgotha jato]$ ./jato -Xtrace:exceptions -cp test/functional jvm/EntryTest [main] trace exception: exception object 0x459a240 (java/lang/IllegalArgumentException) thrown [main] message : 0x45b1e38 = "Non-positive averageCharsPerByte" (java/lang/String) [main] from : 0x40f86260: java/nio/charset/CharsetDecoder.<init>(Ljava/nio/charset/Charset;FFLjava/lang/String;)V [main] (CharsetDecoder.java:72) [main] action : unwind to 0x40f85a71: java/nio/charset/CharsetDecoder.<init>(Ljava/nio/charset/Charset;FF)V [main] (CharsetDecoder.java:89) Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--arch/x86/insn-selector_64.brg38
1 files changed, 9 insertions, 29 deletions
diff --git a/arch/x86/insn-selector_64.brg b/arch/x86/insn-selector_64.brg
index 40a43401..04d7b4f0 100644
--- a/arch/x86/insn-selector_64.brg
+++ b/arch/x86/insn-selector_64.brg
@@ -758,12 +758,12 @@ reg: OP_LE(reg, reg) 2
reg: EXPR_CLASS_FIELD 1
{
struct expression *expr;
- struct var_info *out;
struct insn *mov_insn;
+ struct var_info *out;
+ struct var_info *rdi;
struct vm_field *vmf;
struct vm_class *vmc;
- enum vm_class_state vmc_state;
expr = to_expr(tree);
@@ -773,36 +773,16 @@ reg: EXPR_CLASS_FIELD 1
vmf = expr->class_field;
vmc = vmf->class;
- vm_object_lock(vmc->object);
- vmc_state = vmc->state;
- vm_object_unlock(vmc->object);
-
- if (running_on_valgrind) {
- struct var_info *rdi;
-
- rdi = get_fixed_var(s->b_parent, MACH_REG_RDI);
- select_insn(s, tree, insn(INSN_SAVE_CALLER_REGS));
- select_insn(s, tree, imm_reg_insn(INSN_MOV_IMM_REG, (unsigned long) vmc, rdi));
- select_safepoint_insn(s, tree, rel_insn(INSN_CALL_REL, (unsigned long)vm_class_ensure_init));
+ rdi = get_fixed_var(s->b_parent, MACH_REG_RDI);
+ select_insn(s, tree, insn(INSN_SAVE_CALLER_REGS));
+ select_insn(s, tree, imm_reg_insn(INSN_MOV_IMM_REG, (unsigned long) vmc, rdi));
+ select_safepoint_insn(s, tree, rel_insn(INSN_CALL_REL, (unsigned long)vm_class_ensure_init));
- select_insn(s, tree, insn(INSN_RESTORE_CALLER_REGS));
+ /* FIXME: Use guard pages to fixup static accesses like on 32-bit. */
- mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_REG, (unsigned long) vmc->static_values + vmf->offset, out);
- } else {
- if (vmc_state >= VM_CLASS_INITIALIZING) {
- /* Class is already initialized; no need for fix-up. We also
- * don't want the fixup if we're already inside the
- * initializer. */
- mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_REG,
- (unsigned long) vmc->static_values + vmf->offset, out);
- } else {
- mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_REG,
- (unsigned long) static_guard_page, out);
+ select_insn(s, tree, insn(INSN_RESTORE_CALLER_REGS));
- /* XXX: Check return value */
- add_getstatic_fixup_site(mov_insn, vmf, s->b_parent);
- }
- }
+ mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_REG, (unsigned long) vmc->static_values + vmf->offset, out);
select_insn(s, tree, mov_insn);
}