summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2003-10-04 21:03:17 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-10-04 21:03:17 -0700
commit9ff547bd81529d58fdac8dba008049afe032a288 (patch)
treefe4ceb217bbc57e455d32761da14e351fff0214e
parent62f75b2956e49a7c3aa58ac642f9acad193a2ac0 (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.c28
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;