1.1 --- a/src/os/linux/vm/os_linux.cpp Mon Mar 23 10:42:20 2009 -0400 1.2 +++ b/src/os/linux/vm/os_linux.cpp Wed Mar 25 14:19:20 2009 -0400 1.3 @@ -2269,15 +2269,16 @@ 1.4 // All it does is to check if there are enough free pages 1.5 // left at the time of mmap(). This could be a potential 1.6 // problem. 1.7 -bool os::commit_memory(char* addr, size_t size) { 1.8 - uintptr_t res = (uintptr_t) ::mmap(addr, size, 1.9 - PROT_READ|PROT_WRITE|PROT_EXEC, 1.10 +bool os::commit_memory(char* addr, size_t size, bool exec) { 1.11 + int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; 1.12 + uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, 1.13 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); 1.14 return res != (uintptr_t) MAP_FAILED; 1.15 } 1.16 1.17 -bool os::commit_memory(char* addr, size_t size, size_t alignment_hint) { 1.18 - return commit_memory(addr, size); 1.19 +bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, 1.20 + bool exec) { 1.21 + return commit_memory(addr, size, exec); 1.22 } 1.23 1.24 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } 1.25 @@ -2417,8 +2418,7 @@ 1.26 unsigned long* os::Linux::_numa_all_nodes; 1.27 1.28 bool os::uncommit_memory(char* addr, size_t size) { 1.29 - return ::mmap(addr, size, 1.30 - PROT_READ|PROT_WRITE|PROT_EXEC, 1.31 + return ::mmap(addr, size, PROT_NONE, 1.32 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0) 1.33 != MAP_FAILED; 1.34 } 1.35 @@ -2441,7 +2441,9 @@ 1.36 flags |= MAP_FIXED; 1.37 } 1.38 1.39 - addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE|PROT_EXEC, 1.40 + // Map uncommitted pages PROT_READ and PROT_WRITE, change access 1.41 + // to PROT_EXEC if executable when we commit the page. 1.42 + addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE, 1.43 flags, -1, 0); 1.44 1.45 if (addr != MAP_FAILED) { 1.46 @@ -2582,7 +2584,9 @@ 1.47 #define SHM_HUGETLB 04000 1.48 #endif 1.49 1.50 -char* os::reserve_memory_special(size_t bytes, char* req_addr) { 1.51 +char* os::reserve_memory_special(size_t bytes, char* req_addr, bool exec) { 1.52 + // "exec" is passed in but not used. Creating the shared image for 1.53 + // the code cache doesn't have an SHM_X executable permission to check. 1.54 assert(UseLargePages, "only for large pages"); 1.55 1.56 key_t key = IPC_PRIVATE;