8215879: AArch64: ReservedStackAccess may leave stack guard in inconsistent state
Reviewed-by: aph, dholmes
diff --git a/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp b/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp
index f5c0364..50d894b 100644
--- a/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp
+++ b/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp
@@ -316,7 +316,6 @@
if (thread->on_local_stack(addr)) {
// stack overflow
if (thread->in_stack_yellow_reserved_zone(addr)) {
- thread->disable_stack_yellow_reserved_zone();
if (thread->thread_state() == _thread_in_Java) {
if (thread->in_stack_reserved_zone(addr)) {
frame fr;
@@ -338,9 +337,11 @@
}
// Throw a stack overflow exception. Guard pages will be reenabled
// while unwinding the stack.
+ thread->disable_stack_yellow_reserved_zone();
stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW);
} else {
// Thread was in the vm or native code. Return and try to finish.
+ thread->disable_stack_yellow_reserved_zone();
return 1;
}
} else if (thread->in_stack_red_zone(addr)) {
diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp
index ed4d51c..34ecfe0 100644
--- a/src/hotspot/share/runtime/thread.cpp
+++ b/src/hotspot/share/runtime/thread.cpp
@@ -2577,8 +2577,7 @@
}
void JavaThread::enable_stack_reserved_zone() {
- assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
- assert(_stack_guard_state != stack_guard_enabled, "already enabled");
+ assert(_stack_guard_state == stack_guard_reserved_disabled, "inconsistent state");
// The base notation is from the stack's point of view, growing downward.
// We need to adjust it to work correctly with guard_memory()
@@ -2596,11 +2595,10 @@
}
void JavaThread::disable_stack_reserved_zone() {
- assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
- assert(_stack_guard_state != stack_guard_reserved_disabled, "already disabled");
+ assert(_stack_guard_state == stack_guard_enabled, "inconsistent state");
// Simply return if called for a thread that does not use guard pages.
- if (_stack_guard_state == stack_guard_unused) return;
+ if (_stack_guard_state != stack_guard_enabled) return;
// The base notation is from the stack's point of view, growing downward.
// We need to adjust it to work correctly with guard_memory()