[aarch64-port-dev ] Implement handler_for_unsafe_access()
Andrew Haley
aph at redhat.com
Thu Jan 16 06:44:46 PST 2014
Something we missed before now. It won't work with the built-in
simulator, but is fine with the model. Making it work with the built-
in simulator would be very fiddly, so I'm not going to attempt it.
Andrew.
# HG changeset patch
# User aph
# Date 1389882889 18000
# Thu Jan 16 09:34:49 2014 -0500
# Node ID f930dd00af0bd1592cccfd47b1f79b85b3e6d48a
# Parent c40a7ed7df16bf529d6cd1b281699c7c520eaea5
Implement handler_for_unsafe_access().
diff -r c40a7ed7df16 -r f930dd00af0b src/cpu/aarch64/vm/stubGenerator_aarch64.cpp
--- a/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp Fri Jan 10 11:31:09 2014 +0000
+++ b/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp Thu Jan 16 09:34:49 2014 -0500
@@ -67,9 +67,20 @@
// Stub Code definitions
-#if 0
-static address handle_unsafe_access() { Unimplemented(); return 0; }
-#endif
+static address handle_unsafe_access() {
+ JavaThread* thread = JavaThread::current();
+ address pc = thread->saved_exception_pc();
+ // pc is the instruction which we must emulate
+ // doing a no-op is fine: return garbage from the load
+ // therefore, compute npc
+ address npc = pc + NativeCall::instruction_size;
+
+ // request an async exception
+ thread->set_pending_unsafe_access_error();
+
+ // return address of next instruction to execute
+ return npc;
+}
class StubGenerator: public StubCodeGenerator {
private:
@@ -693,15 +704,19 @@
// asynchronous UnknownError when an unsafe access gets a fault that
// could not be reasonably prevented by the programmer. (Example:
// SIGBUS/OBJERR.)
+ address generate_handler_for_unsafe_access() {
+ StubCodeMark mark(this, "StubRoutines", "handler_for_unsafe_access");
+ address start = __ pc();
- // NOTE: this is used by the signal handler code as a return address
- // to re-enter Java execution so it needs an x86 prolog which will
- // reenter the simulator executing the generated handler code. so
- // the prolog needs to adjust the sim's restart pc to enter the
- // generated code at the start position then return from native to
- // simulated execution.
+ __ push(0x3fffffff, sp); // integer registers except lr & sp
+ BLOCK_COMMENT("call handle_unsafe_access");
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, handle_unsafe_access));
+ __ mov(lr, r0);
+ __ pop (0x3fffffff, sp); // integer registers except lr & sp
+ __ br(lr);
- address generate_handler_for_unsafe_access() { return 0; }
+ return start;
+ }
// Non-destructive plausibility checks for oops
//
@@ -893,7 +908,7 @@
__ mov(c_rarg0, start);
__ mov(c_rarg1, scratch);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post), 2);
- __ pop(0x3fffffff, sp); // integer registers except lr & sp }
+ __ pop(0x3fffffff, sp); // integer registers except lr & sp
}
break;
case BarrierSet::CardTableModRef:
More information about the aarch64-port-dev
mailing list