--- a/src/hotspot/os_cpu/solaris_sparc/os_solaris_sparc.cpp Thu Jun 20 14:09:22 2019 +0100
+++ b/src/hotspot/os_cpu/solaris_sparc/os_solaris_sparc.cpp Mon Jun 24 11:37:56 2019 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -436,8 +436,12 @@
}
- if (thread->thread_state() == _thread_in_vm) {
+ if (thread->thread_state() == _thread_in_vm ||
+ thread->thread_state() == _thread_in_native) {
if (sig == SIGBUS && thread->doing_unsafe_access()) {
+ if (UnsafeCopyMemory::contains_pc(pc)) {
+ npc = UnsafeCopyMemory::page_error_continue_pc(pc);
+ }
stub = SharedRuntime::handle_unsafe_access(thread, npc);
}
}
@@ -476,7 +480,11 @@
// Do not crash the VM in such a case.
CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
CompiledMethod* nm = cb->as_compiled_method_or_null();
- if (nm != NULL && nm->has_unsafe_access()) {
+ bool is_unsafe_arraycopy = (thread->doing_unsafe_access() && UnsafeCopyMemory::contains_pc(pc));
+ if ((nm != NULL && nm->has_unsafe_access()) || is_unsafe_arraycopy) {
+ if (is_unsafe_arraycopy) {
+ npc = UnsafeCopyMemory::page_error_continue_pc(pc);
+ }
stub = SharedRuntime::handle_unsafe_access(thread, npc);
}
}