# HG changeset patch # User coleenp # Date 1240344771 14400 # Node ID c8152ae3f3396aa2bf5007ea6f82a71a2a6a45f4 # Parent 981375ca07b7f0605f92f57aad95122e8c385a4d 6830069: UseLargePages is broken on Win64 Summary: Making VirtualAlloc/VirtualProtect two calls for PAGE_EXECUTE_READWRITE doesn't work for MEM_LARGE_PAGES. Reviewed-by: xlu, kvn, jcoomes diff -r 981375ca07b7 -r c8152ae3f339 src/os/windows/vm/os_windows.cpp --- a/src/os/windows/vm/os_windows.cpp Fri Apr 17 12:22:18 2009 -0700 +++ b/src/os/windows/vm/os_windows.cpp Tue Apr 21 16:12:51 2009 -0400 @@ -2632,6 +2632,8 @@ char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) { + const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; + if (UseLargePagesIndividualAllocation) { if (TracePageSizes && Verbose) { tty->print_cr("Reserving large pages individually."); @@ -2694,13 +2696,7 @@ p_new = (char *) VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, - PAGE_READWRITE); - if (p_new != NULL && exec) { - DWORD oldprot; - // Windows doc says to use VirtualProtect to get execute permissions - VirtualProtect(next_alloc_addr, bytes_to_rq, - PAGE_EXECUTE_READWRITE, &oldprot); - } + prot); } if (p_new == NULL) { @@ -2729,12 +2725,7 @@ } else { // normal policy just allocate it all at once DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; - char * res = (char *)VirtualAlloc(NULL, bytes, flag, PAGE_READWRITE); - if (res != NULL && exec) { - DWORD oldprot; - // Windows doc says to use VirtualProtect to get execute permissions - VirtualProtect(res, bytes, PAGE_EXECUTE_READWRITE, &oldprot); - } + char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot); return res; } }