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