[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH 13/16] proc: keep track of {start,end}_code



Any executable segments loaded from the ELF binary are in this range.

* proc/proc.h (struct proc): Add {start,end}_code.
* proc/mgt.h (S_proc_set_code): New function.
* proc/mgt.h (S_proc_get_code): New function.
---
 proc/mgt.c  |   39 +++++++++++++++++++++++++++++++++++++++
 proc/proc.h |    2 ++
 2 files changed, 41 insertions(+)

diff --git a/proc/mgt.c b/proc/mgt.c
index 6e72233..656cc25 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -211,6 +211,15 @@ S_proc_child (struct proc *parentp,
 			    childp->p_parent->p_pid, childp->p_pgrp->pg_pgid,
 			    !childp->p_pgrp->pg_orphcnt);
   childp->p_parentset = 1;
+
+  /* If these are not set in the child, it was probably fork(2)ed.  If
+     so, it inherits the values of its parent.  */
+  if (! childp->start_code && ! childp->end_code)
+    {
+      childp->start_code = parentp->start_code;
+      childp->end_code = parentp->end_code;
+    }
+
   return 0;
 }
 
@@ -939,3 +948,33 @@ S_proc_is_important (struct proc *callerp,
 
   return 0;
 }
+
+/* Implement proc_set_code as described in <hurd/process.defs>.  */
+error_t
+S_proc_set_code (struct proc *callerp,
+		 vm_address_t start_code,
+		 vm_address_t end_code)
+{
+  if (!callerp)
+    return EOPNOTSUPP;
+
+  callerp->start_code = start_code;
+  callerp->end_code = end_code;
+
+  return 0;
+}
+
+/* Implement proc_get_code as described in <hurd/process.defs>.  */
+error_t
+S_proc_get_code (struct proc *callerp,
+		 vm_address_t *start_code,
+		 vm_address_t *end_code)
+{
+  if (!callerp)
+    return EOPNOTSUPP;
+
+  *start_code = callerp->start_code;
+  *end_code = callerp->end_code;
+
+  return 0;
+}
diff --git a/proc/proc.h b/proc/proc.h
index 1073045..a3e0c9a 100644
--- a/proc/proc.h
+++ b/proc/proc.h
@@ -65,6 +65,8 @@ struct proc
 
   /* Miscellaneous information */
   vm_address_t p_argv, p_envp;
+  vm_address_t start_code;	/* all executable segments are in this range */
+  vm_address_t end_code;
   int p_status;			/* to return via wait */
   int p_sigcode;
   struct rusage p_rusage;	/* my usage if I'm dead, to return via wait */
-- 
1.7.10.4


Reply to: