comparison src/os/windows/vm/os_windows.cpp @ 237:1fdb98a17101

6716785: implicit null checks not triggering with CompressedOops Summary: allocate alignment-sized page(s) below java heap so that memory accesses at heap_base+1page give signal and cause an implicit null check Reviewed-by: kvn, jmasa, phh, jcoomes
author coleenp
date Sat, 19 Jul 2008 17:38:22 -0400
parents d1605aabd0a1
children d95b224e9f17
comparison
equal deleted inserted replaced
235:9c2ecc2ffb12 237:1fdb98a17101
2168 #else /* !IA64 */ 2168 #else /* !IA64 */
2169 2169
2170 // Windows 98 reports faulting addresses incorrectly 2170 // Windows 98 reports faulting addresses incorrectly
2171 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) || 2171 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) ||
2172 !os::win32::is_nt()) { 2172 !os::win32::is_nt()) {
2173
2173 return Handle_Exception(exceptionInfo, 2174 return Handle_Exception(exceptionInfo,
2174 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL)); 2175 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL));
2175 } 2176 }
2176 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2177 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2177 exceptionInfo->ContextRecord); 2178 exceptionInfo->ContextRecord);
2561 2562
2562 bool os::release_memory(char* addr, size_t bytes) { 2563 bool os::release_memory(char* addr, size_t bytes) {
2563 return VirtualFree(addr, 0, MEM_RELEASE) != 0; 2564 return VirtualFree(addr, 0, MEM_RELEASE) != 0;
2564 } 2565 }
2565 2566
2566 bool os::protect_memory(char* addr, size_t bytes) { 2567 // Set protections specified
2568 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
2569 bool is_committed) {
2570 unsigned int p = 0;
2571 switch (prot) {
2572 case MEM_PROT_NONE: p = PAGE_NOACCESS; break;
2573 case MEM_PROT_READ: p = PAGE_READONLY; break;
2574 case MEM_PROT_RW: p = PAGE_READWRITE; break;
2575 case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break;
2576 default:
2577 ShouldNotReachHere();
2578 }
2579
2567 DWORD old_status; 2580 DWORD old_status;
2568 return VirtualProtect(addr, bytes, PAGE_READONLY, &old_status) != 0; 2581
2582 // Strange enough, but on Win32 one can change protection only for committed
2583 // memory, not a big deal anyway, as bytes less or equal than 64K
2584 if (!is_committed && !commit_memory(addr, bytes)) {
2585 fatal("cannot commit protection page");
2586 }
2587 // One cannot use os::guard_memory() here, as on Win32 guard page
2588 // have different (one-shot) semantics, from MSDN on PAGE_GUARD:
2589 //
2590 // Pages in the region become guard pages. Any attempt to access a guard page
2591 // causes the system to raise a STATUS_GUARD_PAGE exception and turn off
2592 // the guard page status. Guard pages thus act as a one-time access alarm.
2593 return VirtualProtect(addr, bytes, p, &old_status) != 0;
2569 } 2594 }
2570 2595
2571 bool os::guard_memory(char* addr, size_t bytes) { 2596 bool os::guard_memory(char* addr, size_t bytes) {
2572 DWORD old_status; 2597 DWORD old_status;
2573 return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &old_status) != 0; 2598 return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &old_status) != 0;