comparison src/os/windows/vm/os_windows.cpp @ 477:24fda36852ce

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
author coleenp
date Wed, 10 Dec 2008 15:14:29 -0800
parents 8724fb00c422
children 773234c55e8c 0fc941df6fb7
comparison
equal deleted inserted replaced
473:3ad2b8576c4a 477:24fda36852ce
2018 2018
2019 // In conservative mode, don't unguard unless the address is in the VM 2019 // In conservative mode, don't unguard unless the address is in the VM
2020 if (UnguardOnExecutionViolation > 0 && addr != last_addr && 2020 if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
2021 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { 2021 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
2022 2022
2023 // Unguard and retry 2023 // Set memory to RWX and retry
2024 address page_start = 2024 address page_start =
2025 (address) align_size_down((intptr_t) addr, (intptr_t) page_size); 2025 (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
2026 bool res = os::unguard_memory((char*) page_start, page_size); 2026 bool res = os::protect_memory((char*) page_start, page_size,
2027 os::MEM_PROT_RWX);
2027 2028
2028 if (PrintMiscellaneous && Verbose) { 2029 if (PrintMiscellaneous && Verbose) {
2029 char buf[256]; 2030 char buf[256];
2030 jio_snprintf(buf, sizeof(buf), "Execution protection violation " 2031 jio_snprintf(buf, sizeof(buf), "Execution protection violation "
2031 "at " INTPTR_FORMAT 2032 "at " INTPTR_FORMAT
2753 return VirtualProtect(addr, bytes, p, &old_status) != 0; 2754 return VirtualProtect(addr, bytes, p, &old_status) != 0;
2754 } 2755 }
2755 2756
2756 bool os::guard_memory(char* addr, size_t bytes) { 2757 bool os::guard_memory(char* addr, size_t bytes) {
2757 DWORD old_status; 2758 DWORD old_status;
2758 return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &old_status) != 0; 2759 return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0;
2759 } 2760 }
2760 2761
2761 bool os::unguard_memory(char* addr, size_t bytes) { 2762 bool os::unguard_memory(char* addr, size_t bytes) {
2762 DWORD old_status; 2763 DWORD old_status;
2763 return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &old_status) != 0; 2764 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
2764 } 2765 }
2765 2766
2766 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } 2767 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
2767 void os::free_memory(char *addr, size_t bytes) { } 2768 void os::free_memory(char *addr, size_t bytes) { }
2768 void os::numa_make_global(char *addr, size_t bytes) { } 2769 void os::numa_make_global(char *addr, size_t bytes) { }