Module Name:    src
Committed By:   ryo
Date:           Thu Nov 25 02:48:00 UTC 2021

Modified Files:
        src/sys/compat/linux32/arch/amd64: linux32_exec.h
        src/sys/compat/linux32/common: linux32_exec_elf32.c

Log Message:
Extra arguments for AT_HWCAP and AT_PLATFORM are now passed when executing 
linux32 binaries.

AT_SYSINFO (vsyscall) feature seems to be broken, so leave it commented out.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/compat/linux32/arch/amd64/linux32_exec.h
cvs rdiff -u -r1.20 -r1.21 src/sys/compat/linux32/common/linux32_exec_elf32.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/linux32/arch/amd64/linux32_exec.h
diff -u src/sys/compat/linux32/arch/amd64/linux32_exec.h:1.8 src/sys/compat/linux32/arch/amd64/linux32_exec.h:1.9
--- src/sys/compat/linux32/arch/amd64/linux32_exec.h:1.8	Thu Nov 25 02:38:56 2021
+++ src/sys/compat/linux32/arch/amd64/linux32_exec.h	Thu Nov 25 02:48:00 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_exec.h,v 1.8 2021/11/25 02:38:56 ryo Exp $ */
+/*	$NetBSD: linux32_exec.h,v 1.9 2021/11/25 02:48:00 ryo Exp $ */
 
 /*-
  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -42,17 +42,14 @@
 #define LINUX32_DEBUGLINK_SIGNATURE	1
 
 /* Counted from common/linux32_exec_elf32.c */
-#define LINUX32_ELF_AUX_ENTRIES 15
-
-#define LINUX32_RANDOM_BYTES 16		/* 16 bytes for AT_RANDOM */
-
-#if 0
+#define LINUX32_ELF_AUX_ENTRIES	20
 
 /* Hardware platform identifier string */
-#define LINUX32_PLATFORM "i686" 
+#define LINUX32_PLATFORM "i686"
 
 #define LINUX32_CPUCAP (cpu_feature[0])
 
+#if 0
 /* vsyscall assembly */
 static char linux32_kernel_vsyscall[] = {
 	0x55,				/* push   %ebp */		\
@@ -64,23 +61,20 @@ static char linux32_kernel_vsyscall[] = 
 	0x5d,				/* pop    %ebp */		\
 	0xc3,				/* ret */			\
 };
+#endif
  
 /* The extra data (ELF auxiliary table and platform name) on stack */  
 struct linux32_extra_stack_data {
-        Aux32Info ai[LINUX32_ELF_AUX_ENTRIES];
-        char hw_platform[sizeof(LINUX32_PLATFORM)];
-	int pad;
+	Aux32Info ai[LINUX32_ELF_AUX_ENTRIES];
+	uint32_t randbytes[4];
+	char hw_platform[8];	/* sizeof(LINUX32_PLATFORM) + align */
+#if 0 /* notyet */
 	Elf32_Ehdr elfhdr;
 	char kernel_vsyscall[sizeof(linux32_kernel_vsyscall)];
-};      
-#define LINUX32_ELF_AUX_ARGSIZ sizeof(struct linux32_extra_stack_data)
-
-#else
-
-#define LINUX32_ELF_AUX_ARGSIZ \
-    (LINUX32_ELF_AUX_ENTRIES * sizeof(Aux32Info) + LINUX32_RANDOM_BYTES)
-
 #endif
+};
+
+#define LINUX32_ELF_AUX_ARGSIZ sizeof(struct linux32_extra_stack_data)
 
 #define linux32_exec_setup_stack	linux_exec_setup_stack
 

Index: src/sys/compat/linux32/common/linux32_exec_elf32.c
diff -u src/sys/compat/linux32/common/linux32_exec_elf32.c:1.20 src/sys/compat/linux32/common/linux32_exec_elf32.c:1.21
--- src/sys/compat/linux32/common/linux32_exec_elf32.c:1.20	Tue Sep  7 11:43:04 2021
+++ src/sys/compat/linux32/common/linux32_exec_elf32.c	Thu Nov 25 02:48:00 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_exec_elf32.c,v 1.20 2021/09/07 11:43:04 riastradh Exp $ */
+/*	$NetBSD: linux32_exec_elf32.c,v 1.21 2021/11/25 02:48:00 ryo Exp $ */
 
 /*-                     
  * Copyright (c) 1995, 1998, 2000, 2001,2006 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_exec_elf32.c,v 1.20 2021/09/07 11:43:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_exec_elf32.c,v 1.21 2021/11/25 02:48:00 ryo Exp $");
 
 #define	ELFSIZE		32
 
@@ -107,19 +107,19 @@ int
 linux32_elf32_copyargs(struct lwp *l, struct exec_package *pack,
     struct ps_strings *arginfo, char **stackp, void *argp)
 {
-	Aux32Info ai[LINUX32_ELF_AUX_ENTRIES], *a;
-	uint32_t randbytes[4];
+	struct linux32_extra_stack_data esd, *esdp;
+	Aux32Info *a, *ai __diagused;
 	struct elf_args *ap;
 	struct vattr *vap;
-	size_t len;
 	int error;
 
 	if ((error = netbsd32_copyargs(l, pack, arginfo, stackp, argp)) != 0)
 		return error;
 
-	a = ai;
+	esdp = (struct linux32_extra_stack_data *)(*stackp);	/* userspace */
 
-	memset(ai, 0, sizeof(ai));
+	memset(&esd, 0, sizeof(esd));
+	ai = a = esd.ai;
 
 	/*
 	 * Push extra arguments on the stack needed by dynamically
@@ -189,66 +189,55 @@ linux32_elf32_copyargs(struct lwp *l, st
 	a++;
 
 	a->a_type = LINUX_AT_RANDOM;
-	a->a_v = NETBSD32PTR32I(*stackp);
+	a->a_v = NETBSD32PTR32I(&esdp->randbytes[0]);
 	a++;
+	esd.randbytes[0] = cprng_strong32();
+	esd.randbytes[1] = cprng_strong32();
+	esd.randbytes[2] = cprng_strong32();
+	esd.randbytes[3] = cprng_strong32();
 
-#if 0
-	/* XXX: increase LINUX32_ELF_AUX_ENTRIES if we enable those things */
-
+#if 0 /* defined(__amd64__) */
+	/* XXX: broken. vsyscall must be placed in the executable page */
 	a->a_type = LINUX_AT_SYSINFO;
 	a->a_v = NETBSD32PTR32I(&esdp->kernel_vsyscall[0]);
 	a++;
+	memcpy(esd.kernel_vsyscall, linux32_kernel_vsyscall,
+	    sizeof(linux32_kernel_vsyscall));
+#endif
 
+#if 0 /* notyet */
 	a->a_type = LINUX_AT_SYSINFO_EHDR;
 	a->a_v = NETBSD32PTR32I(&esdp->elfhdr);
 	a++;
+	memcpy(&esd.elfhdr, eh, sizeof(*eh));
+#endif
 
+#ifdef LINUX32_CPUCAP
 	a->a_type = LINUX_AT_HWCAP;
 	a->a_v = LINUX32_CPUCAP;
 	a++;
+#endif
 
+#ifdef LINUX32_PLATFORM
 	a->a_type = LINUX_AT_PLATFORM;
 	a->a_v = NETBSD32PTR32I(&esdp->hw_platform[0]);
 	a++;
+	strncpy(esd.hw_platform, LINUX32_PLATFORM, sizeof(esd.hw_platform));
 #endif
 
 	a->a_type = AT_NULL;
 	a->a_v = 0;
 	a++;
 
-	randbytes[0] = cprng_strong32();
-	randbytes[1] = cprng_strong32();
-	randbytes[2] = cprng_strong32();
-	randbytes[3] = cprng_strong32();
-
-	len = sizeof(randbytes);
-	if ((error = copyout(randbytes, *stackp, len)) != 0)
-		return error;
-	*stackp += len;
-
-#if 0
-	memset(&esd, 0, sizeof(esd));
-
-	memcpy(esd.kernel_vsyscall, linux32_kernel_vsyscall,
-	    sizeof(linux32_kernel_vsyscall));
+	KASSERTMSG(a <= &ai[LINUX32_ELF_AUX_ENTRIES],
+	    "increase LINUX32_ELF_AUX_ENTRIES to %lu", a - ai);
 
-	memcpy(&esd.elfhdr, eh, sizeof(*eh));
-
-	strcpy(esd.hw_platform, LINUX32_PLATFORM);
-	
 	/*
 	 * Copy out the ELF auxiliary table and hw platform name
 	 */
 	if ((error = copyout(&esd, esdp, sizeof(esd))) != 0)
 		return error;
 	*stackp += sizeof(esd);
-#endif
-
-	len = (a - ai) * sizeof(Aux32Info);
-	KASSERT(len <= LINUX32_ELF_AUX_ENTRIES * sizeof(Aux32Info));
-	if ((error = copyout(ai, *stackp, len)) != 0)
-		return error;
-	*stackp += len;
 
 	return 0;
 }

Reply via email to