diff options
author | Pekka Enberg <penberg@kernel.org> | 2013-03-25 10:47:21 +0200 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2013-03-25 10:51:55 +0200 |
commit | d5091e7481d4c633d30c4e059efb31dd80ec7660 (patch) | |
tree | 529554cbb4d478c5acb75ae57ddd6b2dde29afc9 | |
parent | ce7442daf8b6003d4567871231714aae40d475a1 (diff) | |
download | jato-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.brg | 38 |
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); } |