svn commit: r356129 - in head/sys: kern powerpc/include powerpc/powerpc
Justin Hibbits
jhibbits at FreeBSD.org
Fri Dec 27 17:38:26 UTC 2019
Author: jhibbits
Date: Fri Dec 27 17:38:25 2019
New Revision: 356129
URL: https://svnweb.freebsd.org/changeset/base/356129
Log:
Fix the powerpc copyout fixup from r356113
Summary:
r356113 used an older patch, which predated the
freebsd_copyout_auxargs() addition. Fix this by using a private
powerpc_copyout_auxargs() instead, and keep it private to powerpc, not in MI
files.
Reviewed by: kib, bdragon
Differential Revision: https://reviews.freebsd.org/D22935
Added:
head/sys/powerpc/powerpc/elf_common.c (contents, props changed)
Modified:
head/sys/kern/imgact_elf.c
head/sys/powerpc/include/elf.h
head/sys/powerpc/powerpc/elf32_machdep.c
head/sys/powerpc/powerpc/elf64_machdep.c
Modified: head/sys/kern/imgact_elf.c
==============================================================================
--- head/sys/kern/imgact_elf.c Fri Dec 27 17:12:06 2019 (r356128)
+++ head/sys/kern/imgact_elf.c Fri Dec 27 17:38:25 2019 (r356129)
@@ -1323,102 +1323,6 @@ ret:
#define suword __CONCAT(suword, __ELF_WORD_SIZE)
-#ifdef __powerpc__
-#define OLD_AT_NULL AT_NULL
-#define OLD_AT_IGNORE AT_IGNORE
-#define OLD_AT_EXECFD AT_EXECFD
-#define OLD_AT_PHDR AT_PHDR
-#define OLD_AT_PHENT AT_PHENT
-#define OLD_AT_PHNUM AT_PHNUM
-#define OLD_AT_PAGESZ AT_PAGESZ
-#define OLD_AT_BASE AT_BASE
-#define OLD_AT_FLAGS AT_FLAGS
-#define OLD_AT_ENTRY AT_ENTRY
-#define OLD_AT_NOTELF AT_NOTELF
-#define OLD_AT_UID AT_UID
-#define OLD_AT_EUID AT_EUID
-#define OLD_AT_EXECPATH 13
-#define OLD_AT_CANARY 14
-#define OLD_AT_CANARYLEN 15
-#define OLD_AT_OSRELDATE 16
-#define OLD_AT_NCPUS 17
-#define OLD_AT_PAGESIZES 18
-#define OLD_AT_PAGESIZESLEN 19
-#define OLD_AT_STACKPROT 21
-#define OLD_AT_TIMEKEEP AT_TIMEKEEP
-#define OLD_AT_EHDRFLAGS AT_EHDRFLAGS
-#define OLD_AT_HWCAP AT_HWCAP
-#define OLD_AT_HWCAP2 AT_HWCAP2
-
-#define OLD_AT_COUNT 27 /* Count of defined aux entry types. */
-
-static int
-__elfN(freebsd_fixup_old_auxargs)(uintptr_t *stack_base,
- struct image_params *imgp)
-{
- Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs;
- Elf_Auxinfo *argarray, *pos;
- Elf_Addr *base, *auxbase;
- int error;
-
- base = (Elf_Addr *)*stack_base;
- auxbase = base + imgp->args->argc + 1 + imgp->args->envc + 1;
- argarray = pos = malloc(OLD_AT_COUNT * sizeof(*pos), M_TEMP,
- M_WAITOK | M_ZERO);
-
- if (args->execfd != -1)
- AUXARGS_ENTRY(pos, OLD_AT_EXECFD, args->execfd);
- AUXARGS_ENTRY(pos, OLD_AT_PHDR, args->phdr);
- AUXARGS_ENTRY(pos, OLD_AT_PHENT, args->phent);
- AUXARGS_ENTRY(pos, OLD_AT_PHNUM, args->phnum);
- AUXARGS_ENTRY(pos, OLD_AT_PAGESZ, args->pagesz);
- AUXARGS_ENTRY(pos, OLD_AT_FLAGS, args->flags);
- AUXARGS_ENTRY(pos, OLD_AT_ENTRY, args->entry);
- AUXARGS_ENTRY(pos, OLD_AT_BASE, args->base);
- AUXARGS_ENTRY(pos, OLD_AT_EHDRFLAGS, args->hdr_eflags);
- if (imgp->execpathp != 0)
- AUXARGS_ENTRY(pos, OLD_AT_EXECPATH, imgp->execpathp);
- AUXARGS_ENTRY(pos, OLD_AT_OSRELDATE,
- imgp->proc->p_ucred->cr_prison->pr_osreldate);
- if (imgp->canary != 0) {
- AUXARGS_ENTRY(pos, OLD_AT_CANARY, imgp->canary);
- AUXARGS_ENTRY(pos, OLD_AT_CANARYLEN, imgp->canarylen);
- }
- AUXARGS_ENTRY(pos, OLD_AT_NCPUS, mp_ncpus);
- if (imgp->pagesizes != 0) {
- AUXARGS_ENTRY(pos, OLD_AT_PAGESIZES, imgp->pagesizes);
- AUXARGS_ENTRY(pos, OLD_AT_PAGESIZESLEN, imgp->pagesizeslen);
- }
- if (imgp->sysent->sv_timekeep_base != 0) {
- AUXARGS_ENTRY(pos, OLD_AT_TIMEKEEP,
- imgp->sysent->sv_timekeep_base);
- }
- AUXARGS_ENTRY(pos, OLD_AT_STACKPROT, imgp->sysent->sv_shared_page_obj
- != NULL && imgp->stack_prot != 0 ? imgp->stack_prot :
- imgp->sysent->sv_stackprot);
- if (imgp->sysent->sv_hwcap != NULL)
- AUXARGS_ENTRY(pos, OLD_AT_HWCAP, *imgp->sysent->sv_hwcap);
- if (imgp->sysent->sv_hwcap2 != NULL)
- AUXARGS_ENTRY(pos, OLD_AT_HWCAP2, *imgp->sysent->sv_hwcap2);
- AUXARGS_ENTRY(pos, OLD_AT_NULL, 0);
-
- free(imgp->auxargs, M_TEMP);
- imgp->auxargs = NULL;
- KASSERT(pos - argarray <= OLD_AT_COUNT, ("Too many auxargs"));
-
- error = copyout(argarray, auxbase, sizeof(*argarray) * OLD_AT_COUNT);
- free(argarray, M_TEMP);
- if (error != 0)
- return (error);
-
- base--;
- if (suword(base, imgp->args->argc) == -1)
- return (EFAULT);
- *stack_base = (uintptr_t)base;
- return (0);
-}
-#endif /* __powerpc__ */
-
int
__elfN(freebsd_copyout_auxargs)(struct image_params *imgp, uintptr_t base)
{
@@ -1478,11 +1382,6 @@ int
__elfN(freebsd_fixup)(uintptr_t *stack_base, struct image_params *imgp)
{
Elf_Addr *base;
-
-#ifdef __powerpc__
- if (imgp->proc->p_osrel < P_OSREL_POWERPC_NEW_AUX_ARGS)
- return (__elfN(freebsd_fixup_old_auxargs)(stack_base, imgp));
-#endif /* __powerpc__ */
base = (Elf_Addr *)*stack_base;
base--;
Modified: head/sys/powerpc/include/elf.h
==============================================================================
--- head/sys/powerpc/include/elf.h Fri Dec 27 17:12:06 2019 (r356128)
+++ head/sys/powerpc/include/elf.h Fri Dec 27 17:38:25 2019 (r356129)
@@ -114,4 +114,32 @@ __ElfType(Auxinfo);
#define ET_DYN_LOAD_ADDR 0x01010000
+#define AT_OLD_NULL AT_NULL
+#define AT_OLD_IGNORE AT_IGNORE
+#define AT_OLD_EXECFD AT_EXECFD
+#define AT_OLD_PHDR AT_PHDR
+#define AT_OLD_PHENT AT_PHENT
+#define AT_OLD_PHNUM AT_PHNUM
+#define AT_OLD_PAGESZ AT_PAGESZ
+#define AT_OLD_BASE AT_BASE
+#define AT_OLD_FLAGS AT_FLAGS
+#define AT_OLD_ENTRY AT_ENTRY
+#define AT_OLD_NOTELF AT_NOTELF
+#define AT_OLD_UID AT_UID
+#define AT_OLD_EUID AT_EUID
+#define AT_OLD_EXECPATH 13
+#define AT_OLD_CANARY 14
+#define AT_OLD_CANARYLEN 15
+#define AT_OLD_OSRELDATE 16
+#define AT_OLD_NCPUS 17
+#define AT_OLD_PAGESIZES 18
+#define AT_OLD_PAGESIZESLEN 19
+#define AT_OLD_STACKPROT 21
+#define AT_OLD_TIMEKEEP AT_TIMEKEEP
+#define AT_OLD_EHDRFLAGS AT_EHDRFLAGS
+#define AT_OLD_HWCAP AT_HWCAP
+#define AT_OLD_HWCAP2 AT_HWCAP2
+
+#define AT_OLD_COUNT 27 /* Count of defined aux entry types. */
+
#endif /* !_MACHINE_ELF_H_ */
Modified: head/sys/powerpc/powerpc/elf32_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/elf32_machdep.c Fri Dec 27 17:12:06 2019 (r356128)
+++ head/sys/powerpc/powerpc/elf32_machdep.c Fri Dec 27 17:38:25 2019 (r356129)
@@ -41,6 +41,8 @@
#include <sys/fcntl.h>
#include <sys/sysent.h>
#include <sys/imgact_elf.h>
+#include <sys/jail.h>
+#include <sys/smp.h>
#include <sys/syscall.h>
#include <sys/sysctl.h>
#include <sys/signalvar.h>
@@ -57,6 +59,8 @@
#include <machine/reg.h>
#include <machine/md_var.h>
+#include <powerpc/powerpc/elf_common.c>
+
#ifdef __powerpc64__
#include <compat/freebsd32/freebsd32_proto.h>
#include <compat/freebsd32/freebsd32_util.h>
@@ -89,7 +93,7 @@ struct sysentvec elf32_freebsd_sysvec = {
.sv_errtbl = NULL,
.sv_transtrap = NULL,
.sv_fixup = __elfN(freebsd_fixup),
- .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
+ .sv_copyout_auxargs = __elfN(powerpc_copyout_auxargs),
.sv_sendsig = sendsig,
.sv_sigcode = sigcode32,
.sv_szsigcode = &szsigcode32,
Modified: head/sys/powerpc/powerpc/elf64_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/elf64_machdep.c Fri Dec 27 17:12:06 2019 (r356128)
+++ head/sys/powerpc/powerpc/elf64_machdep.c Fri Dec 27 17:38:25 2019 (r356129)
@@ -38,6 +38,8 @@
#include <sys/fcntl.h>
#include <sys/sysent.h>
#include <sys/imgact_elf.h>
+#include <sys/jail.h>
+#include <sys/smp.h>
#include <sys/syscall.h>
#include <sys/signalvar.h>
#include <sys/vnode.h>
@@ -52,6 +54,8 @@
#include <machine/elf.h>
#include <machine/md_var.h>
+#include <powerpc/powerpc/elf_common.c>
+
static void exec_setregs_funcdesc(struct thread *td, struct image_params *imgp,
uintptr_t stack);
@@ -74,7 +78,7 @@ struct sysentvec elf64_freebsd_sysvec_v1 = {
.sv_usrstack = USRSTACK,
.sv_psstrings = PS_STRINGS,
.sv_stackprot = VM_PROT_ALL,
- .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
+ .sv_copyout_auxargs = __elfN(powerpc_copyout_auxargs),
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs_funcdesc,
.sv_fixlimit = NULL,
@@ -112,7 +116,7 @@ struct sysentvec elf64_freebsd_sysvec_v2 = {
.sv_usrstack = USRSTACK,
.sv_psstrings = PS_STRINGS,
.sv_stackprot = VM_PROT_ALL,
- .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
+ .sv_copyout_auxargs = __elfN(powerpc_copyout_auxargs),
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
Added: head/sys/powerpc/powerpc/elf_common.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/powerpc/powerpc/elf_common.c Fri Dec 27 17:38:25 2019 (r356129)
@@ -0,0 +1,89 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 2019 Justin Hibbits
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+static int
+__elfN(powerpc_copyout_auxargs)(struct image_params *imgp, uintptr_t base)
+{
+ Elf_Auxargs *args;
+ Elf_Auxinfo *argarray, *pos;
+ int error;
+
+ if (imgp->proc->p_osrel >= P_OSREL_POWERPC_NEW_AUX_ARGS)
+ return (__elfN(freebsd_copyout_auxargs)(imgp, base));
+
+ args = (Elf_Auxargs *)imgp->auxargs;
+ argarray = pos = malloc(AT_OLD_COUNT * sizeof(*pos), M_TEMP,
+ M_WAITOK | M_ZERO);
+
+ if (args->execfd != -1)
+ AUXARGS_ENTRY(pos, AT_OLD_EXECFD, args->execfd);
+ AUXARGS_ENTRY(pos, AT_OLD_PHDR, args->phdr);
+ AUXARGS_ENTRY(pos, AT_OLD_PHENT, args->phent);
+ AUXARGS_ENTRY(pos, AT_OLD_PHNUM, args->phnum);
+ AUXARGS_ENTRY(pos, AT_OLD_PAGESZ, args->pagesz);
+ AUXARGS_ENTRY(pos, AT_OLD_FLAGS, args->flags);
+ AUXARGS_ENTRY(pos, AT_OLD_ENTRY, args->entry);
+ AUXARGS_ENTRY(pos, AT_OLD_BASE, args->base);
+ AUXARGS_ENTRY(pos, AT_OLD_EHDRFLAGS, args->hdr_eflags);
+ if (imgp->execpathp != 0)
+ AUXARGS_ENTRY(pos, AT_OLD_EXECPATH, imgp->execpathp);
+ AUXARGS_ENTRY(pos, AT_OLD_OSRELDATE,
+ imgp->proc->p_ucred->cr_prison->pr_osreldate);
+ if (imgp->canary != 0) {
+ AUXARGS_ENTRY(pos, AT_OLD_CANARY, imgp->canary);
+ AUXARGS_ENTRY(pos, AT_OLD_CANARYLEN, imgp->canarylen);
+ }
+ AUXARGS_ENTRY(pos, AT_OLD_NCPUS, mp_ncpus);
+ if (imgp->pagesizes != 0) {
+ AUXARGS_ENTRY(pos, AT_OLD_PAGESIZES, imgp->pagesizes);
+ AUXARGS_ENTRY(pos, AT_OLD_PAGESIZESLEN, imgp->pagesizeslen);
+ }
+ if (imgp->sysent->sv_timekeep_base != 0) {
+ AUXARGS_ENTRY(pos, AT_OLD_TIMEKEEP,
+ imgp->sysent->sv_timekeep_base);
+ }
+ AUXARGS_ENTRY(pos, AT_OLD_STACKPROT, imgp->sysent->sv_shared_page_obj
+ != NULL && imgp->stack_prot != 0 ? imgp->stack_prot :
+ imgp->sysent->sv_stackprot);
+ if (imgp->sysent->sv_hwcap != NULL)
+ AUXARGS_ENTRY(pos, AT_OLD_HWCAP, *imgp->sysent->sv_hwcap);
+ if (imgp->sysent->sv_hwcap2 != NULL)
+ AUXARGS_ENTRY(pos, AT_OLD_HWCAP2, *imgp->sysent->sv_hwcap2);
+ AUXARGS_ENTRY(pos, AT_OLD_NULL, 0);
+
+ free(imgp->auxargs, M_TEMP);
+ imgp->auxargs = NULL;
+ KASSERT(pos - argarray <= AT_OLD_COUNT, ("Too many auxargs"));
+
+ error = copyout(argarray, (void *)base, sizeof(*argarray) * AT_OLD_COUNT);
+ free(argarray, M_TEMP);
+ return (error);
+}
More information about the svn-src-all
mailing list