diff options
| author | Andrew Morton <akpm@osdl.org> | 2003-10-04 21:03:17 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.osdl.org> | 2003-10-04 21:03:17 -0700 |
| commit | 9ff547bd81529d58fdac8dba008049afe032a288 (patch) | |
| tree | fe4ceb217bbc57e455d32761da14e351fff0214e | |
| parent | 62f75b2956e49a7c3aa58ac642f9acad193a2ac0 (diff) | |
[PATCH] /proc/sys/auxv
From: Roland McGrath <roland@redhat.com>
This was supposed to be part of the recent mm_struct.saved_auxv[] patch.
The /proc addition is half the reason for the patch, and the more important
one (letting you debug live processes, while NT_AUXV in core dumps lets you
debug dead ones). The patch below was supposed to be part of the original.
| -rw-r--r-- | fs/proc/base.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 640cddefdb78..3cc64eb275b1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -53,6 +53,7 @@ enum pid_directory_inos { PROC_TGID_EXE, PROC_TGID_FD, PROC_TGID_ENVIRON, + PROC_TGID_AUXV, PROC_TGID_CMDLINE, PROC_TGID_STAT, PROC_TGID_STATM, @@ -75,6 +76,7 @@ enum pid_directory_inos { PROC_TID_EXE, PROC_TID_FD, PROC_TID_ENVIRON, + PROC_TID_AUXV, PROC_TID_CMDLINE, PROC_TID_STAT, PROC_TID_STATM, @@ -104,6 +106,7 @@ static struct pid_entry tgid_base_stuff[] = { E(PROC_TGID_TASK, "task", S_IFDIR|S_IRUGO|S_IXUGO), E(PROC_TGID_FD, "fd", S_IFDIR|S_IRUSR|S_IXUSR), E(PROC_TGID_ENVIRON, "environ", S_IFREG|S_IRUSR), + E(PROC_TGID_AUXV, "auxv", S_IFREG|S_IRUSR), E(PROC_TGID_STATUS, "status", S_IFREG|S_IRUGO), E(PROC_TGID_CMDLINE, "cmdline", S_IFREG|S_IRUGO), E(PROC_TGID_STAT, "stat", S_IFREG|S_IRUGO), @@ -125,6 +128,7 @@ static struct pid_entry tgid_base_stuff[] = { static struct pid_entry tid_base_stuff[] = { E(PROC_TID_FD, "fd", S_IFDIR|S_IRUSR|S_IXUSR), E(PROC_TID_ENVIRON, "environ", S_IFREG|S_IRUSR), + E(PROC_TID_AUXV, "auxv", S_IFREG|S_IRUSR), E(PROC_TID_STATUS, "status", S_IFREG|S_IRUGO), E(PROC_TID_CMDLINE, "cmdline", S_IFREG|S_IRUGO), E(PROC_TID_STAT, "stat", S_IFREG|S_IRUGO), @@ -322,6 +326,25 @@ out: return res; } +static int proc_pid_auxv(struct task_struct *task, char *buffer) +{ + int res = 0; + struct mm_struct *mm = get_task_mm(task); + if (mm) { + unsigned int nwords = 0; + do + nwords += 2; + while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */ + res = nwords * sizeof(mm->saved_auxv[0]); + if (res > PAGE_SIZE) + res = PAGE_SIZE; + memcpy(buffer, mm->saved_auxv, res); + mmput(mm); + } + return res; +} + + #ifdef CONFIG_KALLSYMS /* * Provides a wchan file via kallsyms in a proper one-value-per-file format. @@ -1271,6 +1294,11 @@ static struct dentry *proc_pident_lookup(struct inode *dir, inode->i_fop = &proc_info_file_operations; ei->op.proc_read = proc_pid_environ; break; + case PROC_TID_AUXV: + case PROC_TGID_AUXV: + inode->i_fop = &proc_info_file_operations; + ei->op.proc_read = proc_pid_auxv; + break; case PROC_TID_STATUS: case PROC_TGID_STATUS: inode->i_fop = &proc_info_file_operations; |
