Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/compat/linux32/common Extra arguments for AT_HWCAP and A...
details: https://anonhg.NetBSD.org/src/rev/bc2c93e77465
branches: trunk
changeset: 1026439:bc2c93e77465
user: ryo <ryo%NetBSD.org@localhost>
date: Thu Nov 25 02:48:00 2021 +0000
description:
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.
diffstat:
sys/compat/linux32/arch/amd64/linux32_exec.h | 30 ++++-------
sys/compat/linux32/common/linux32_exec_elf32.c | 63 ++++++++++---------------
2 files changed, 38 insertions(+), 55 deletions(-)
diffs (191 lines):
diff -r 16cd984b5aee -r bc2c93e77465 sys/compat/linux32/arch/amd64/linux32_exec.h
--- a/sys/compat/linux32/arch/amd64/linux32_exec.h Thu Nov 25 02:38:56 2021 +0000
+++ b/sys/compat/linux32/arch/amd64/linux32_exec.h Thu Nov 25 02:48:00 2021 +0000
@@ -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 @@
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
+#endif
+};
-#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
diff -r 16cd984b5aee -r bc2c93e77465 sys/compat/linux32/common/linux32_exec_elf32.c
--- a/sys/compat/linux32/common/linux32_exec_elf32.c Thu Nov 25 02:38:56 2021 +0000
+++ b/sys/compat/linux32/common/linux32_exec_elf32.c Thu Nov 25 02:48:00 2021 +0000
@@ -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 @@
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 @@
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;
+ KASSERTMSG(a <= &ai[LINUX32_ELF_AUX_ENTRIES],
+ "increase LINUX32_ELF_AUX_ENTRIES to %lu", a - ai);
-#if 0
- memset(&esd, 0, sizeof(esd));
-
- memcpy(esd.kernel_vsyscall, linux32_kernel_vsyscall,
- sizeof(linux32_kernel_vsyscall));
-
- 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;
}
Home |
Main Index |
Thread Index |
Old Index