src/os/linux/vm/os_linux.cpp

changeset 1091
6bdd6923ba16
parent 1082
bd441136a5ce
child 1126
956304450e80
     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;

mercurial