Hi all,
the attached patch passes down the stack base addresses of the main
thread. This is the final kernel change required to remove the stackid
logic in libpthread. This is for use by pthread_attr_getstack as needed
e.g. by a number of programs using garbage collection.

Joerg
Index: kern/exec_elf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/sys/kern/exec_elf.c,v
retrieving revision 1.34
diff -u -p -r1.34 exec_elf.c
--- kern/exec_elf.c	1 Feb 2012 21:49:52 -0000	1.34
+++ kern/exec_elf.c	3 Feb 2012 20:27:04 -0000
@@ -235,6 +235,10 @@ elf_copyargs(struct lwp *l, struct exec_
 		a->a_v = kauth_cred_getgid(l->l_cred);
 		a++;
 
+		a->a_type = AT_STACKBASE;
+		a->a_v = l->l_proc->p_stackbase;
+		a++;
+
 		if (pack->ep_path) {
 			execname = a;
 			a->a_type = AT_SUN_EXECNAME;
@@ -249,7 +253,9 @@ elf_copyargs(struct lwp *l, struct exec_
 	a->a_v = 0;
 	a++;
 
-	vlen = (a - ai) * sizeof(AuxInfo);
+	vlen = (a - ai) * sizeof(ai[0]);
+
+	KASSERT(vlen <= sizeof(ai));
 
 	if (execname) {
 		char *path = pack->ep_path;
Index: sys/exec_elf.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/sys/sys/exec_elf.h,v
retrieving revision 1.121
diff -u -p -r1.121 exec_elf.h
--- sys/exec_elf.h	21 Jan 2012 21:44:03 -0000	1.121
+++ sys/exec_elf.h	3 Feb 2012 20:25:25 -0000
@@ -714,6 +714,7 @@ typedef struct {
 #define AT_DCACHEBSIZE	10	/* Data cache block size */
 #define AT_ICACHEBSIZE	11	/* Instruction cache block size */
 #define AT_UCACHEBSIZE	12	/* Unified cache block size */
+#define AT_STACKBASE	13	/* Base address of the main thread */
 
 	/* Vendor specific */
 #define AT_MIPS_NOTELF	10	/* XXX a_val != 0 -> MIPS XCOFF executable */
@@ -1138,7 +1139,7 @@ typedef Elf32_Versym	Elf64_Versym;
 
 #ifdef _KERNEL
 
-#define ELF_AUX_ENTRIES 14	/* Max size of aux array passed to loader */
+#define ELF_AUX_ENTRIES 15	/* Max size of aux array passed to loader */
 #define ELF32_NO_ADDR	(~(Elf32_Addr)0) /* Indicates addr. not yet filled in */
 #define ELF32_LINK_ADDR ((Elf32_Addr)-2) /* advises to use link address */
 #define ELF64_NO_ADDR	(~(Elf64_Addr)0) /* Indicates addr. not yet filled in */

Reply via email to