Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Mark shared libraries private clean pages as non-writable on FreeBSD.
[simgrid.git] / src / xbt / memory_map.cpp
index 61355f4..e55ae03 100644 (file)
@@ -209,15 +209,13 @@ XBT_PRIVATE std::vector<VmMap> get_memory_map(pid_t pid)
     memreg.end_addr = vmentries[i].kve_end;
 
     /* Permissions */
-    memreg.prot = 0;
+    memreg.prot = PROT_NONE;
     if (vmentries[i].kve_protection & KVME_PROT_READ)
       memreg.prot |= PROT_READ;
     if (vmentries[i].kve_protection & KVME_PROT_WRITE)
       memreg.prot |= PROT_WRITE;
     if (vmentries[i].kve_protection & KVME_PROT_EXEC)
       memreg.prot |= PROT_EXEC;
-    if (memreg.prot == 0)
-      memreg.prot |= PROT_NONE;
 
     /* Private (copy-on-write) or shared? */
     if (vmentries[i].kve_flags & KVME_FLAG_COW)
@@ -235,16 +233,30 @@ XBT_PRIVATE std::vector<VmMap> get_memory_map(pid_t pid)
     /* Inode */
     memreg.inode = vmentries[i].kve_vn_fileid;
 
-    /*
-     * Path. Linuxize result by giving an anonymous mapping a path from
-     * the previous mapping... provided previous is vnode and has a path.
-     */
+     /*
+      * Path. Linuxize result by giving an anonymous mapping a path from
+      * the previous mapping, provided previous is vnode and has a path,
+      * and mark the stack.
+      */
     if (vmentries[i].kve_path[0] != '\0')
       memreg.pathname = vmentries[i].kve_path;
     else if (vmentries[i].kve_type == KVME_TYPE_DEFAULT
            && vmentries[i-1].kve_type == KVME_TYPE_VNODE
         && vmentries[i-1].kve_path[0] != '\0')
       memreg.pathname = vmentries[i-1].kve_path;
+    else if (vmentries[i].kve_type == KVME_TYPE_DEFAULT
+        && vmentries[i].kve_flags & KVME_FLAG_GROWS_DOWN)
+      memreg.pathname = "[stack]";
+
+    /*
+     * One last dirty modification: remove write permission from shared
+     * libraries private clean pages. This is necessary because simgrid
+     * later identifies mappings based on the permissions that are expected
+     * when running the Linux kernel.
+     */
+    if (vmentries[i].kve_type == KVME_TYPE_VNODE
+        && ! (vmentries[i].kve_flags & KVME_FLAG_NEEDS_COPY))
+      memreg.prot &= ~PROT_WRITE;
 
     ret.push_back(std::move(memreg));
   }