On Fri, Nov 15, 2019 at 06:42:13PM +0000, John Baldwin wrote:
> Author: jhb
> Date: Fri Nov 15 18:42:13 2019
> New Revision: 354741
> URL: https://svnweb.freebsd.org/changeset/base/354741
>
> Log:
> Add a sv_copyout_auxargs() hook in sysentvec.
>
> Change the FreeBSD ELF ABIs to use this new hook to copyout ELF auxv
> instead of doing it in the sv_fixup hook. In particular, this new
> hook allows the stack space to be allocated at the same time the auxv
> values are copied out to userland. This allows us to avoid wasting
> space for unused auxv entries as well as not having to recalculate
> where the auxv vector is by walking back up over the argv and
> environment vectors.
>
> Reviewed by: brooks, emaste
> Tested on: amd64 (amd64 and i386 binaries), i386, mips, mips64
> Sponsored by: DARPA
> Differential Revision: https://reviews.freebsd.org/D22355
>
> Modified:
> head/sys/amd64/amd64/elf_machdep.c
> head/sys/arm/arm/elf_machdep.c
> head/sys/arm64/arm64/elf32_machdep.c
> head/sys/arm64/arm64/elf_machdep.c
> head/sys/compat/freebsd32/freebsd32_misc.c
> head/sys/compat/ia32/ia32_sysvec.c
> head/sys/i386/i386/elf_machdep.c
> head/sys/kern/imgact_elf.c
> head/sys/kern/kern_exec.c
> head/sys/mips/mips/elf_machdep.c
> head/sys/mips/mips/freebsd32_machdep.c
> head/sys/powerpc/powerpc/elf32_machdep.c
> head/sys/powerpc/powerpc/elf64_machdep.c
> head/sys/riscv/riscv/elf_machdep.c
> head/sys/sparc64/sparc64/elf_machdep.c
> head/sys/sys/imgact_elf.h
> head/sys/sys/sysent.h
>
> Modified: head/sys/amd64/amd64/elf_machdep.c
> ==============================================================================
> --- head/sys/amd64/amd64/elf_machdep.c Fri Nov 15 18:34:36 2019
> (r354740)
> +++ head/sys/amd64/amd64/elf_machdep.c Fri Nov 15 18:42:13 2019
> (r354741)
> @@ -68,6 +68,7 @@ struct sysentvec elf64_freebsd_sysvec = {
> .sv_usrstack = USRSTACK,
> .sv_psstrings = PS_STRINGS,
> .sv_stackprot = VM_PROT_ALL,
> + .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
> .sv_copyout_strings = exec_copyout_strings,
> .sv_setregs = exec_setregs,
> .sv_fixlimit = NULL,
>
> Modified: head/sys/arm/arm/elf_machdep.c
> ==============================================================================
> --- head/sys/arm/arm/elf_machdep.c Fri Nov 15 18:34:36 2019
> (r354740)
> +++ head/sys/arm/arm/elf_machdep.c Fri Nov 15 18:42:13 2019
> (r354741)
> @@ -75,6 +75,7 @@ struct sysentvec elf32_freebsd_sysvec = {
> .sv_usrstack = USRSTACK,
> .sv_psstrings = PS_STRINGS,
> .sv_stackprot = VM_PROT_ALL,
> + .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
> .sv_copyout_strings = exec_copyout_strings,
> .sv_setregs = exec_setregs,
> .sv_fixlimit = NULL,
>
> Modified: head/sys/arm64/arm64/elf32_machdep.c
> ==============================================================================
> --- head/sys/arm64/arm64/elf32_machdep.c Fri Nov 15 18:34:36 2019
> (r354740)
> +++ head/sys/arm64/arm64/elf32_machdep.c Fri Nov 15 18:42:13 2019
> (r354741)
> @@ -92,6 +92,7 @@ static struct sysentvec elf32_freebsd_sysvec = {
> .sv_usrstack = FREEBSD32_USRSTACK,
> .sv_psstrings = FREEBSD32_PS_STRINGS,
> .sv_stackprot = VM_PROT_READ | VM_PROT_WRITE,
> + .sv_copyout_auxargs = elf32_freebsd_copyout_auxargs,
> .sv_copyout_strings = freebsd32_copyout_strings,
> .sv_setregs = freebsd32_setregs,
> .sv_fixlimit = NULL, // XXX
>
> Modified: head/sys/arm64/arm64/elf_machdep.c
> ==============================================================================
> --- head/sys/arm64/arm64/elf_machdep.c Fri Nov 15 18:34:36 2019
> (r354740)
> +++ head/sys/arm64/arm64/elf_machdep.c Fri Nov 15 18:42:13 2019
> (r354741)
> @@ -76,6 +76,7 @@ static struct sysentvec elf64_freebsd_sysvec = {
> .sv_usrstack = USRSTACK,
> .sv_psstrings = PS_STRINGS,
> .sv_stackprot = VM_PROT_READ | VM_PROT_WRITE,
> + .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
> .sv_copyout_strings = exec_copyout_strings,
> .sv_setregs = exec_setregs,
> .sv_fixlimit = NULL,
>
> Modified: head/sys/compat/freebsd32/freebsd32_misc.c
> ==============================================================================
> --- head/sys/compat/freebsd32/freebsd32_misc.c Fri Nov 15 18:34:36
> 2019 (r354740)
> +++ head/sys/compat/freebsd32/freebsd32_misc.c Fri Nov 15 18:42:13
> 2019 (r354741)
> @@ -3195,14 +3195,8 @@ freebsd32_copyout_strings(struct image_params *imgp)
> if (imgp->sysent->sv_stackgap != NULL)
> imgp->sysent->sv_stackgap(imgp, (u_long *)&vectp);
>
> - if (imgp->auxargs) {
> - /*
> - * Allocate room on the stack for the ELF auxargs
> - * array. It has up to AT_COUNT entries.
> - */
> - vectp -= howmany(AT_COUNT * sizeof(Elf32_Auxinfo),
> - sizeof(*vectp));
> - }
> + if (imgp->auxargs)
> + imgp->sysent->sv_copyout_auxargs(imgp, (u_long *)&vectp);
>
> /*
> * Allocate room for the argv[] and env vectors including the
>
> Modified: head/sys/compat/ia32/ia32_sysvec.c
> ==============================================================================
> --- head/sys/compat/ia32/ia32_sysvec.c Fri Nov 15 18:34:36 2019
> (r354740)
> +++ head/sys/compat/ia32/ia32_sysvec.c Fri Nov 15 18:42:13 2019
> (r354741)
> @@ -114,6 +114,7 @@ struct sysentvec ia32_freebsd_sysvec = {
> .sv_usrstack = FREEBSD32_USRSTACK,
> .sv_psstrings = FREEBSD32_PS_STRINGS,
> .sv_stackprot = VM_PROT_ALL,
> + .sv_copyout_auxargs = elf32_freebsd_copyout_auxargs,
> .sv_copyout_strings = freebsd32_copyout_strings,
> .sv_setregs = ia32_setregs,
> .sv_fixlimit = ia32_fixlimit,
>
> Modified: head/sys/i386/i386/elf_machdep.c
> ==============================================================================
> --- head/sys/i386/i386/elf_machdep.c Fri Nov 15 18:34:36 2019
> (r354740)
> +++ head/sys/i386/i386/elf_machdep.c Fri Nov 15 18:42:13 2019
> (r354741)
> @@ -70,6 +70,7 @@ struct sysentvec elf32_freebsd_sysvec = {
> .sv_usrstack = USRSTACK,
> .sv_psstrings = PS_STRINGS,
> .sv_stackprot = VM_PROT_ALL,
> + .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
> .sv_copyout_strings = exec_copyout_strings,
> .sv_setregs = exec_setregs,
> .sv_fixlimit = NULL,
>
> Modified: head/sys/kern/imgact_elf.c
> ==============================================================================
> --- head/sys/kern/imgact_elf.c Fri Nov 15 18:34:36 2019
> (r354740)
> +++ head/sys/kern/imgact_elf.c Fri Nov 15 18:42:13 2019
> (r354741)
> @@ -1289,7 +1289,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *i
> addr = et_dyn_addr;
>
> /*
> - * Construct auxargs table (used by the fixup routine)
> + * Construct auxargs table (used by the copyout_auxargs routine)
> */
> elf_auxargs = malloc(sizeof(Elf_Auxargs), M_TEMP, M_NOWAIT);
> if (elf_auxargs == NULL) {
> @@ -1323,16 +1323,13 @@ ret:
>
> #define suword __CONCAT(suword, __ELF_WORD_SIZE)
>
> -int
> -__elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp)
> +void
> +__elfN(freebsd_copyout_auxargs)(struct image_params *imgp, u_long *base)
> {
> Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs;
> Elf_Auxinfo *argarray, *pos;
> - Elf_Addr *base, *auxbase;
> - int error;
> + u_long auxlen;
>
> - base = (Elf_Addr *)*stack_base;
> - auxbase = base + imgp->args->argc + 1 + imgp->args->envc + 1;
> argarray = pos = malloc(AT_COUNT * sizeof(*pos), M_TEMP,
> M_WAITOK | M_ZERO);
>
> @@ -1376,11 +1373,18 @@ __elfN(freebsd_fixup)(register_t **stack_base, struct
> imgp->auxargs = NULL;
> KASSERT(pos - argarray <= AT_COUNT, ("Too many auxargs"));
>
> - error = copyout(argarray, auxbase, sizeof(*argarray) * AT_COUNT);
> + auxlen = sizeof(*argarray) * (pos - argarray);
> + *base -= auxlen;
> + copyout(argarray, (void *)*base, auxlen);
> free(argarray, M_TEMP);
> - if (error != 0)
> - return (error);
> +}
So you are ignoring copyout errors ?
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"