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) { } |