# HG changeset patch # User coleenp # Date 1228950869 28800 # Node ID 24fda36852ce76e8b0cb0dd0c96147d9a64927e2 # Parent 3ad2b8576c4a8c189eee1994e35a72ac792883b7 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE Summary: Make reguard_stack change access to RW, not execute and use os::protect_memory with the new parameter when change needed to X. Reviewed-by: acorn, jcoomes diff -r 3ad2b8576c4a -r 24fda36852ce src/os/linux/vm/os_linux.cpp --- a/src/os/linux/vm/os_linux.cpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/os/linux/vm/os_linux.cpp Wed Dec 10 15:14:29 2008 -0800 @@ -2500,7 +2500,7 @@ } bool os::unguard_memory(char* addr, size_t size) { - return linux_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC); + return linux_mprotect(addr, size, PROT_READ|PROT_WRITE); } // Large page support diff -r 3ad2b8576c4a -r 24fda36852ce src/os/solaris/vm/os_solaris.cpp --- a/src/os/solaris/vm/os_solaris.cpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/os/solaris/vm/os_solaris.cpp Wed Dec 10 15:14:29 2008 -0800 @@ -3026,6 +3026,8 @@ // Protect memory (Used to pass readonly pages through // JNI GetArrayElements with empty arrays.) +// Also, used for serialization page and for compressed oops null pointer +// checking. bool os::protect_memory(char* addr, size_t bytes, ProtType prot, bool is_committed) { unsigned int p = 0; @@ -3049,7 +3051,7 @@ } bool os::unguard_memory(char* addr, size_t bytes) { - return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE|PROT_EXEC); + return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE); } // Large page support diff -r 3ad2b8576c4a -r 24fda36852ce src/os/windows/vm/os_windows.cpp --- a/src/os/windows/vm/os_windows.cpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/os/windows/vm/os_windows.cpp Wed Dec 10 15:14:29 2008 -0800 @@ -2020,10 +2020,11 @@ if (UnguardOnExecutionViolation > 0 && addr != last_addr && (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { - // Unguard and retry + // Set memory to RWX and retry address page_start = (address) align_size_down((intptr_t) addr, (intptr_t) page_size); - bool res = os::unguard_memory((char*) page_start, page_size); + bool res = os::protect_memory((char*) page_start, page_size, + os::MEM_PROT_RWX); if (PrintMiscellaneous && Verbose) { char buf[256]; @@ -2755,12 +2756,12 @@ bool os::guard_memory(char* addr, size_t bytes) { DWORD old_status; - return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &old_status) != 0; + return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0; } bool os::unguard_memory(char* addr, size_t bytes) { DWORD old_status; - return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &old_status) != 0; + return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0; } void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } diff -r 3ad2b8576c4a -r 24fda36852ce src/os_cpu/linux_x86/vm/os_linux_x86.cpp --- a/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Wed Dec 10 15:14:29 2008 -0800 @@ -422,10 +422,11 @@ if (addr != last_addr && (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { - // Unguard and retry + // Set memory to RWX and retry address page_start = (address) align_size_down((intptr_t) addr, (intptr_t) page_size); - bool res = os::unguard_memory((char*) page_start, page_size); + bool res = os::protect_memory((char*) page_start, page_size, + os::MEM_PROT_RWX); if (PrintMiscellaneous && Verbose) { char buf[256]; diff -r 3ad2b8576c4a -r 24fda36852ce src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp --- a/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Wed Dec 10 15:14:29 2008 -0800 @@ -576,10 +576,11 @@ if (addr != last_addr && (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { - // Unguard and retry + // Make memory rwx and retry address page_start = (address) align_size_down((intptr_t) addr, (intptr_t) page_size); - bool res = os::unguard_memory((char*) page_start, page_size); + bool res = os::protect_memory((char*) page_start, page_size, + os::MEM_PROT_RWX); if (PrintMiscellaneous && Verbose) { char buf[256]; diff -r 3ad2b8576c4a -r 24fda36852ce src/share/vm/prims/jni.cpp --- a/src/share/vm/prims/jni.cpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/share/vm/prims/jni.cpp Wed Dec 10 15:14:29 2008 -0800 @@ -2173,7 +2173,8 @@ size_t size = os::vm_allocation_granularity(); bad_address = os::reserve_memory(size); if (bad_address != NULL) { - os::protect_memory(bad_address, size, os::MEM_PROT_READ); + os::protect_memory(bad_address, size, os::MEM_PROT_READ, + /*is_committed*/false); } } return bad_address; diff -r 3ad2b8576c4a -r 24fda36852ce src/share/vm/runtime/os.cpp --- a/src/share/vm/runtime/os.cpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/share/vm/runtime/os.cpp Wed Dec 10 15:14:29 2008 -0800 @@ -932,8 +932,9 @@ // the mutator thread if such case is encountered. See bug 6546278 for details. Thread::muxAcquire(&SerializePageLock, "serialize_thread_states"); os::protect_memory((char *)os::get_memory_serialize_page(), - os::vm_page_size(), MEM_PROT_READ, /*is_committed*/true ); - os::unguard_memory((char *)os::get_memory_serialize_page(), os::vm_page_size()); + os::vm_page_size(), MEM_PROT_READ); + os::protect_memory((char *)os::get_memory_serialize_page(), + os::vm_page_size(), MEM_PROT_RW); Thread::muxRelease(&SerializePageLock); } diff -r 3ad2b8576c4a -r 24fda36852ce src/share/vm/runtime/os.hpp --- a/src/share/vm/runtime/os.hpp Tue Dec 09 09:55:39 2008 -0500 +++ b/src/share/vm/runtime/os.hpp Wed Dec 10 15:14:29 2008 -0800 @@ -208,7 +208,7 @@ enum ProtType { MEM_PROT_NONE, MEM_PROT_READ, MEM_PROT_RW, MEM_PROT_RWX }; static bool protect_memory(char* addr, size_t bytes, ProtType prot, - bool is_committed = false); + bool is_committed = true); static bool guard_memory(char* addr, size_t bytes); static bool unguard_memory(char* addr, size_t bytes);