diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2013-08-15 09:38:04 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2013-09-15 22:51:37 +0200 |
commit | c62a440d866ccd8259b408ec59a2c16069e0ce0c (patch) | |
tree | a22a7e1a71283f4cc23f6d536b34b50234289607 | |
parent | cc22fd1612ff8ff5b93575fef487e3900fadba2c (diff) |
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.
-rw-r--r-- | proc/mgt.c | 39 | ||||
-rw-r--r-- | proc/proc.h | 2 |
2 files changed, 41 insertions, 0 deletions
@@ -210,6 +210,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; } @@ -903,3 +912,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 ed47cccb..f846b37b 100644 --- a/proc/proc.h +++ b/proc/proc.h @@ -64,6 +64,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 */ |