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.




 25-akpm/fs/proc/base.c |   28 ++++++++++++++++++++++++++++
 1 files changed, 28 insertions(+)

diff -puN fs/proc/base.c~proc-sys-auxv fs/proc/base.c
--- 25/fs/proc/base.c~proc-sys-auxv	Thu Oct  2 17:21:13 2003
+++ 25-akpm/fs/proc/base.c	Thu Oct  2 17:21:13 2003
@@ -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
 			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;

_