Mercurial > hg > truffle
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) { } |