Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Dec 2019 11:23:13 +0800
From:      Ganbold Tsagaankhuu <ganbold@gmail.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all <svn-src-all@freebsd.org>,  svn-src-head <svn-src-head@freebsd.org>
Subject:   Re: svn commit: r355373 - in head/sys: amd64/amd64 amd64/cloudabi32 amd64/cloudabi64 amd64/ia32 amd64/linux amd64/linux32 arm/arm arm/cloudabi32 arm64/arm64 arm64/cloudabi32 arm64/cloudabi64 arm64/linu...
Message-ID:  <CAGtf9xOhxr0DgqMagNBrbaFMG_k3YU60GwBqP0g_zmAEQbu2mg@mail.gmail.com>
In-Reply-To: <201912032317.xB3NHsjB022858@repo.freebsd.org>
References:  <201912032317.xB3NHsjB022858@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Dec 4, 2019 at 7:18 AM John Baldwin <jhb@freebsd.org> wrote:

> Author: jhb
> Date: Tue Dec  3 23:17:54 2019
> New Revision: 355373
> URL: https://svnweb.freebsd.org/changeset/base/355373
>
> Log:
>   Use uintptr_t instead of register_t * for the stack base.
>
>   - Use ustringp for the location of the argv and environment strings
>     and allow destp to travel further down the stack for the stackgap
>     and auxv regions.
>   - Update the Linux copyout_strings variants to move destp down the
>     stack as was done for the native ABIs in r263349.
>   - Stop allocating a space for a stack gap in the Linux ABIs.  This
>     used to hold translated system call arguments, but hasn't been used
>     since r159992.
>
>   Reviewed by:  kib
>   Tested on:    md64 (amd64, i386, linux64), i386 (i386, linux)
>   Sponsored by: DARPA
>   Differential Revision:        https://reviews.freebsd.org/D22501
>
> Modified:
>   head/sys/amd64/amd64/machdep.c
>   head/sys/amd64/cloudabi32/cloudabi32_sysvec.c
>   head/sys/amd64/cloudabi64/cloudabi64_sysvec.c
>   head/sys/amd64/ia32/ia32_signal.c
>   head/sys/amd64/linux/linux_sysvec.c
>   head/sys/amd64/linux32/linux32_sysvec.c
>   head/sys/arm/arm/machdep.c
>   head/sys/arm/cloudabi32/cloudabi32_sysvec.c
>   head/sys/arm64/arm64/elf32_machdep.c
>   head/sys/arm64/arm64/machdep.c
>   head/sys/arm64/cloudabi32/cloudabi32_sysvec.c
>   head/sys/arm64/cloudabi64/cloudabi64_sysvec.c
>   head/sys/arm64/linux/linux_sysvec.c
>

This maybe breaks buildkernel on arm64:

--- all_subdir_linux64 ---
/usr/src/sys/arm64/linux/linux_sysvec.c:235:8: error: incompatible integer
to pointer conversion assigning to 'uintptr_t *' (aka 'unsigned long *')
from 'uintptr_t' (aka 'unsigned long') [-Werror,-Wint-conversion]
        destp = (uintptr_t)arginfo;
              ^ ~~~~~~~~~~~~~~~~~~
/usr/src/sys/arm64/linux/linux_sysvec.c:239:11: error: invalid operands to
binary expression ('uintptr_t *' (aka 'unsigned long *') and 'unsigned
long')
                destp = rounddown2(destp, sizeof(void *));
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/src/sys/sys/param.h:301:30: note: expanded from macro 'rounddown2'
--- all_subdir_mac_test ---
--- mac_test.o ---
--- all_subdir_linux64 ---
#define rounddown2(x, y) ((x)&(~((y)-1)))          /* if y is power of two
*/
                          ~~~^~~~~~~~~~~
/usr/src/sys/arm64/linux/linux_sysvec.c:240:19: error: incompatible pointer
to integer conversion assigning to 'unsigned long' from 'uintptr_t *' (aka
'unsigned long *'); dereference with * [-Werror,-Wint-conversion]
                imgp->execpathp = destp;
                                ^ ~~~~~
                                  *
/usr/src/sys/arm64/linux/linux_sysvec.c:249:15: error: incompatible pointer
to integer conversion assigning to 'unsigned long' from 'uintptr_t *' (aka
'unsigned long *'); dereference with * [-Werror,-Wint-conversion]
        imgp->canary = destp;
                     ^ ~~~~~
                       *
/usr/src/sys/arm64/linux/linux_sysvec.c:256:10: error: invalid operands to
binary expression ('uintptr_t *' (aka 'unsigned long *') and 'unsigned
long')
        destp = rounddown2(destp, sizeof(void *));
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/src/sys/sys/param.h:301:30: note: expanded from macro 'rounddown2'
#define rounddown2(x, y) ((x)&(~((y)-1)))          /* if y is power of two
*/
                          ~~~^~~~~~~~~~~
--- all_subdir_mac_test ---
cc -target aarch64-unknown-freebsd13.0
--sysroot=/usr/obj/usr/src/arm64.aarch64/tmp
-B/usr/obj/usr/src/arm64.aarch64/tmp/usr/bin  -O2 -pipe
 -fno-strict-aliasing -Werror -D_KERNEL -DKLD_MODULE -DKLD_TIED -nostdinc
-DHAVE_KERNEL_OPTION_HEADERS -include
/usr/obj/usr/src/arm64.aarch64/sys/GENERIC/opt_global.h -I. -I/usr/src/sys
-I/usr/src/sys/contrib/ck/include -fno-common -g -fPIC
-fdebug-prefix-map=./machine=/usr/src/sys/arm64/include
-I/usr/obj/usr/src/arm64.aarch64/sys/GENERIC     -MD  -MF.depend.mac_test.o
-MTmac_test.o -mgeneral-regs-only -ffixed-x18 -ffreestanding -fwrapv
-fstack-protector -gdwarf-2 -Wall -Wredundant-decls -Wnested-externs
-Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual
-Wundef -Wno-pointer-sign -D__printf__=__freebsd_kprintf__
-Wmissing-include-dirs -fdiagnostics-show-option -Wno-unknown-pragmas
-Wno-error-tautological-compare -Wno-error-empty-body
-Wno-error-parentheses-equality -Wno-error-unused-function
-Wno-error-pointer-sign -Wno-error-shift-negative-value
-Wno-address-of-packed-member -Wno-format-zero-length     -std=iso9899:1999
-c /usr/src/sys/security/mac_test/mac_test.c -o mac_test.o
--- all_subdir_linux64 ---
/usr/src/sys/arm64/linux/linux_sysvec.c:260:50: error: incompatible pointer
types passing 'uintptr_t **' (aka 'unsigned long **') to parameter of type
'uintptr_t *' (aka 'unsigned long *'); remove &
[-Werror,-Wincompatible-pointer-types]
                error = imgp->sysent->sv_copyout_auxargs(imgp, &destp);
                                                               ^~~~~~
/usr/src/sys/arm64/linux/linux_sysvec.c:297:23: error: incompatible pointer
to integer conversion passing 'uintptr_t *' (aka 'unsigned long *') to
parameter of type 'long' [-Werror,-Wint-conversion]
                if (suword(vectp++, ustringp) != 0)
                                    ^~~~~~~~
/usr/src/sys/sys/systm.h:390:38: note: passing argument to parameter 'word'
here
int     suword(volatile void *base, long word);
                                         ^
/usr/src/sys/arm64/linux/linux_sysvec.c:314:23: error: incompatible pointer
to integer conversion passing 'uintptr_t *' (aka 'unsigned long *') to
parameter of type 'long' [-Werror,-Wint-conversion]
                if (suword(vectp++, ustringp) != 0)
                                    ^~~~~~~~
/usr/src/sys/sys/systm.h:390:38: note: passing argument to parameter 'word'
here
int     suword(volatile void *base, long word);
                                         ^
8 errors generated.
*** [linux_sysvec.o] Error code 1


Ganbold



>   head/sys/compat/cloudabi32/cloudabi32_module.c
>   head/sys/compat/cloudabi32/cloudabi32_util.h
>   head/sys/compat/cloudabi64/cloudabi64_module.c
>   head/sys/compat/cloudabi64/cloudabi64_util.h
>   head/sys/compat/freebsd32/freebsd32_misc.c
>   head/sys/compat/freebsd32/freebsd32_util.h
>   head/sys/compat/ia32/ia32_signal.h
>   head/sys/i386/cloudabi32/cloudabi32_sysvec.c
>   head/sys/i386/i386/machdep.c
>   head/sys/i386/linux/linux_sysvec.c
>   head/sys/kern/imgact_aout.c
>   head/sys/kern/imgact_elf.c
>   head/sys/kern/kern_exec.c
>   head/sys/mips/mips/freebsd32_machdep.c
>   head/sys/mips/mips/pm_machdep.c
>   head/sys/powerpc/include/reg.h
>   head/sys/powerpc/powerpc/elf64_machdep.c
>   head/sys/powerpc/powerpc/exec_machdep.c
>   head/sys/riscv/riscv/machdep.c
>   head/sys/sparc64/sparc64/machdep.c
>   head/sys/sys/imgact.h
>   head/sys/sys/imgact_elf.h
>   head/sys/sys/sysent.h
>
> Modified: head/sys/amd64/amd64/machdep.c
>
> ==============================================================================
> --- head/sys/amd64/amd64/machdep.c      Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/amd64/amd64/machdep.c      Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -577,7 +577,7 @@ freebsd4_sigreturn(struct thread *td, struct freebsd4_
>   * Reset registers to default values on exec.
>   */
>  void
> -exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
> +exec_setregs(struct thread *td, struct image_params *imgp, uintptr_t
> stack)
>  {
>         struct trapframe *regs;
>         struct pcb *pcb;
>
> Modified: head/sys/amd64/cloudabi32/cloudabi32_sysvec.c
>
> ==============================================================================
> --- head/sys/amd64/cloudabi32/cloudabi32_sysvec.c       Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/amd64/cloudabi32/cloudabi32_sysvec.c       Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -53,7 +53,7 @@ extern struct sysent cloudabi32_sysent[];
>  extern unsigned long ia32_maxssiz;
>
>  static int
> -cloudabi32_fixup_tcb(register_t **stack_base, struct image_params *imgp)
> +cloudabi32_fixup_tcb(uintptr_t *stack_base, struct image_params *imgp)
>  {
>         int error;
>         uint32_t args[2];
> @@ -73,16 +73,16 @@ cloudabi32_fixup_tcb(register_t **stack_base, struct i
>          * refer to the auxiliary vector, which is stored right after
>          * the TCB.
>          */
> -       args[0] = (uintptr_t)*stack_base;
> -       args[1] = (uintptr_t)*stack_base +
> +       args[0] = *stack_base;
> +       args[1] = *stack_base +
>             roundup(sizeof(cloudabi32_tcb_t), sizeof(register_t));
> -       *stack_base -= howmany(sizeof(args), sizeof(register_t));
> -       return (copyout(args, *stack_base, sizeof(args)));
> +       *stack_base -= roundup2(sizeof(args), sizeof(register_t));
> +       return (copyout(args, (void *)*stack_base, sizeof(args)));
>  }
>
>  static void
>  cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
> -    unsigned long stack)
> +    uintptr_t stack)
>  {
>
>         ia32_setregs(td, imgp, stack);
>
> Modified: head/sys/amd64/cloudabi64/cloudabi64_sysvec.c
>
> ==============================================================================
> --- head/sys/amd64/cloudabi64/cloudabi64_sysvec.c       Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/amd64/cloudabi64/cloudabi64_sysvec.c       Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -48,7 +48,7 @@ extern const char *cloudabi64_syscallnames[];
>  extern struct sysent cloudabi64_sysent[];
>
>  static int
> -cloudabi64_fixup_tcb(register_t **stack_base, struct image_params *imgp)
> +cloudabi64_fixup_tcb(uintptr_t *stack_base, struct image_params *imgp)
>  {
>         int error;
>         register_t tcbptr;
> @@ -64,12 +64,13 @@ cloudabi64_fixup_tcb(register_t **stack_base, struct i
>          * containing a pointer to the TCB. %fs base will point to this.
>          */
>         tcbptr = (register_t)*stack_base;
> -       return (copyout(&tcbptr, --*stack_base, sizeof(tcbptr)));
> +       *stack_base -= sizeof(tcbptr);
> +       return (copyout(&tcbptr, (void *)*stack_base, sizeof(tcbptr)));
>  }
>
>  static void
>  cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
> -    unsigned long stack)
> +    uintptr_t stack)
>  {
>         struct trapframe *regs;
>
>
> Modified: head/sys/amd64/ia32/ia32_signal.c
>
> ==============================================================================
> --- head/sys/amd64/ia32/ia32_signal.c   Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/amd64/ia32/ia32_signal.c   Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -936,7 +936,7 @@ freebsd32_sigreturn(td, uap)
>   * Clear registers on exec
>   */
>  void
> -ia32_setregs(struct thread *td, struct image_params *imgp, u_long stack)
> +ia32_setregs(struct thread *td, struct image_params *imgp, uintptr_t
> stack)
>  {
>         struct trapframe *regs;
>         struct pcb *pcb;
>
> Modified: head/sys/amd64/linux/linux_sysvec.c
>
> ==============================================================================
> --- head/sys/amd64/linux/linux_sysvec.c Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/amd64/linux/linux_sysvec.c Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -97,8 +97,8 @@ extern struct sysent linux_sysent[LINUX_SYS_MAXSYSCALL
>  SET_DECLARE(linux_ioctl_handler_set, struct linux_ioctl_handler);
>
>  static int     linux_copyout_strings(struct image_params *imgp,
> -                   register_t **stack_base);
> -static int     linux_fixup_elf(register_t **stack_base,
> +                   uintptr_t *stack_base);
> +static int     linux_fixup_elf(uintptr_t *stack_base,
>                     struct image_params *iparams);
>  static bool    linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
>  static void    linux_vdso_install(void *param);
> @@ -106,7 +106,7 @@ static void linux_vdso_deinstall(void *param);
>  static void    linux_set_syscall_retval(struct thread *td, int error);
>  static int     linux_fetch_syscall_args(struct thread *td);
>  static void    linux_exec_setregs(struct thread *td, struct image_params
> *imgp,
> -                   u_long stack);
> +                   uintptr_t stack);
>  static int     linux_vsyscall(struct thread *td);
>
>  #define LINUX_T_UNKNOWN  255
> @@ -224,7 +224,7 @@ linux_set_syscall_retval(struct thread *td, int error)
>  }
>
>  static int
> -linux_copyout_auxargs(struct image_params *imgp, u_long *base)
> +linux_copyout_auxargs(struct image_params *imgp, uintptr_t *base)
>  {
>         Elf_Auxargs *args;
>         Elf_Auxinfo *argarray, *pos;
> @@ -274,7 +274,7 @@ linux_copyout_auxargs(struct image_params *imgp, u_lon
>  }
>
>  static int
> -linux_fixup_elf(register_t **stack_base, struct image_params *imgp)
> +linux_fixup_elf(uintptr_t *stack_base, struct image_params *imgp)
>  {
>         Elf_Addr *base;
>
> @@ -283,7 +283,7 @@ linux_fixup_elf(register_t **stack_base, struct image_
>         if (suword(base, (uint64_t)imgp->args->argc) == -1)
>                 return (EFAULT);
>
> -       *stack_base = (register_t *)base;
> +       *stack_base = (uintptr_t)base;
>         return (0);
>  }
>
> @@ -293,11 +293,12 @@ linux_fixup_elf(register_t **stack_base, struct
> image_
>   * as the initial stack pointer.
>   */
>  static int
> -linux_copyout_strings(struct image_params *imgp, register_t **stack_base)
> +linux_copyout_strings(struct image_params *imgp, uintptr_t *stack_base)
>  {
>         int argc, envc, error;
>         char **vectp;
> -       char *stringp, *destp;
> +       char *stringp;
> +       uintptr_t destp, ustringp;
>         struct ps_strings *arginfo;
>         char canary[LINUX_AT_RANDOM_LEN];
>         size_t execpath_len;
> @@ -311,43 +312,45 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         p = imgp->proc;
>         arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
> -       destp = (caddr_t)arginfo - SPARE_USRSPACE -
> -           roundup(sizeof(canary), sizeof(char *)) -
> -           roundup(execpath_len, sizeof(char *)) -
> -           roundup(ARG_MAX - imgp->args->stringspace, sizeof(char *));
> +       destp = (uintptr_t)arginfo;
>
>         if (execpath_len != 0) {
> -               imgp->execpathp = (uintptr_t)arginfo - execpath_len;
> -               error = copyout(imgp->execpath, (void *)imgp->execpathp,
> -                   execpath_len);
> +               destp -= execpath_len;
> +               destp = rounddown2(destp, sizeof(void *));
> +               imgp->execpathp = destp;
> +               error = copyout(imgp->execpath, (void *)destp,
> execpath_len);
>                 if (error != 0)
>                         return (error);
>         }
>
>         /* Prepare the canary for SSP. */
>         arc4rand(canary, sizeof(canary), 0);
> -       imgp->canary = (uintptr_t)arginfo -
> -           roundup(execpath_len, sizeof(char *)) -
> -           roundup(sizeof(canary), sizeof(char *));
> -       error = copyout(canary, (void *)imgp->canary, sizeof(canary));
> +       destp -= roundup(sizeof(canary), sizeof(void *));
> +       imgp->canary = destp;
> +       error = copyout(canary, (void *)destp, sizeof(canary));
>         if (error != 0)
>                 return (error);
>
> -       vectp = (char **)destp;
> +       /* Allocate room for the argument and environment strings. */
> +       destp -= ARG_MAX - imgp->args->stringspace;
> +       destp = rounddown2(destp, sizeof(void *));
> +       ustringp = destp;
>
>         /*
>          * Starting with 2.24, glibc depends on a 16-byte stack alignment.
>          * One "long argc" will be prepended later.
>          */
> -       vectp = (char **)((((uintptr_t)vectp + 8) & ~0xF) - 8);
> +       if (destp % 16 == 0)
> +               destp -= 8;
>
>         if (imgp->auxargs) {
> -               error = imgp->sysent->sv_copyout_auxargs(imgp,
> -                   (u_long *)&vectp);
> +               error = imgp->sysent->sv_copyout_auxargs(imgp, &destp);
>                 if (error != 0)
>                         return (error);
>         }
>
> +       vectp = (char **)destp;
> +
>         /*
>          * Allocate room for the argv[] and env vectors including the
>          * terminating NULL pointers.
> @@ -355,14 +358,15 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>         vectp -= imgp->args->argc + 1 + imgp->args->envc + 1;
>
>         /* vectp also becomes our initial stack base. */
> -       *stack_base = (register_t *)vectp;
> +       *stack_base = (uintptr_t)vectp;
>
>         stringp = imgp->args->begin_argv;
>         argc = imgp->args->argc;
>         envc = imgp->args->envc;
>
>         /* Copy out strings - arguments and environment. */
> -       error = copyout(stringp, destp, ARG_MAX - imgp->args->stringspace);
> +       error = copyout(stringp, (void *)ustringp,
> +           ARG_MAX - imgp->args->stringspace);
>         if (error != 0)
>                 return (error);
>
> @@ -373,11 +377,11 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         /* Fill in argument portion of vector table. */
>         for (; argc > 0; --argc) {
> -               if (suword(vectp++, (long)(intptr_t)destp) != 0)
> +               if (suword(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* A null vector table pointer separates the argp's from the
> envp's. */
> @@ -390,11 +394,11 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         /* Fill in environment portion of vector table. */
>         for (; envc > 0; --envc) {
> -               if (suword(vectp++, (long)(intptr_t)destp) != 0)
> +               if (suword(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* The end of the vector table is a null pointer. */
> @@ -408,7 +412,8 @@ linux_copyout_strings(struct image_params *imgp, regis
>   * Reset registers to default values on exec.
>   */
>  static void
> -linux_exec_setregs(struct thread *td, struct image_params *imgp, u_long
> stack)
> +linux_exec_setregs(struct thread *td, struct image_params *imgp,
> +    uintptr_t stack)
>  {
>         struct trapframe *regs;
>         struct pcb *pcb;
>
> Modified: head/sys/amd64/linux32/linux32_sysvec.c
>
> ==============================================================================
> --- head/sys/amd64/linux32/linux32_sysvec.c     Tue Dec  3 23:11:40 2019
>       (r355372)
> +++ head/sys/amd64/linux32/linux32_sysvec.c     Tue Dec  3 23:17:54 2019
>       (r355373)
> @@ -101,13 +101,13 @@ extern struct sysent
> linux32_sysent[LINUX32_SYS_MAXSYS
>
>  SET_DECLARE(linux_ioctl_handler_set, struct linux_ioctl_handler);
>
> -static int     linux_fixup_elf(register_t **stack_base,
> +static int     linux_fixup_elf(uintptr_t *stack_base,
>                     struct image_params *iparams);
>  static int     linux_copyout_strings(struct image_params *imgp,
> -                   register_t **stack_base);
> +                   uintptr_t *stack_base);
>  static void     linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t
> *mask);
>  static void    linux_exec_setregs(struct thread *td,
> -                                  struct image_params *imgp, u_long
> stack);
> +                                  struct image_params *imgp, uintptr_t
> stack);
>  static void    linux32_fixlimit(struct rlimit *rl, int which);
>  static bool    linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
>  static void    linux_vdso_install(void *param);
> @@ -246,7 +246,7 @@ linux_copyout_auxargs(struct image_params *imgp, u_lon
>  }
>
>  static int
> -linux_fixup_elf(register_t **stack_base, struct image_params *imgp)
> +linux_fixup_elf(uintptr_t *stack_base, struct image_params *imgp)
>  {
>         Elf32_Addr *base;
>
> @@ -254,7 +254,7 @@ linux_fixup_elf(register_t **stack_base, struct image_
>         base--;
>         if (suword32(base, (uint32_t)imgp->args->argc) == -1)
>                 return (EFAULT);
> -       *stack_base = (register_t *)base;
> +       *stack_base = (uintptr_t)base;
>         return (0);
>  }
>
> @@ -677,7 +677,8 @@ linux32_fetch_syscall_args(struct thread *td)
>   * XXX copied from ia32_signal.c.
>   */
>  static void
> -linux_exec_setregs(struct thread *td, struct image_params *imgp, u_long
> stack)
> +linux_exec_setregs(struct thread *td, struct image_params *imgp,
> +    uintptr_t stack)
>  {
>         struct trapframe *regs = td->td_frame;
>         struct pcb *pcb = td->td_pcb;
> @@ -721,11 +722,12 @@ linux_exec_setregs(struct thread *td, struct
> image_par
>   * XXX copied from ia32_sysvec.c.
>   */
>  static int
> -linux_copyout_strings(struct image_params *imgp, register_t **stack_base)
> +linux_copyout_strings(struct image_params *imgp, uintptr_t *stack_base)
>  {
>         int argc, envc, error;
>         u_int32_t *vectp;
> -       char *stringp, *destp;
> +       char *stringp;
> +       uintptr_t destp, ustringp;
>         struct linux32_ps_strings *arginfo;
>         char canary[LINUX_AT_RANDOM_LEN];
>         size_t execpath_len;
> @@ -737,36 +739,38 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>                 execpath_len = 0;
>
>         arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
> -       destp = (caddr_t)arginfo - SPARE_USRSPACE -
> -           roundup(sizeof(canary), sizeof(char *)) -
> -           roundup(execpath_len, sizeof(char *)) -
> -           roundup(ARG_MAX - imgp->args->stringspace, sizeof(char *));
> +       destp = (uintptr_t)arginfo;
>
>         if (execpath_len != 0) {
> -               imgp->execpathp = (uintptr_t)arginfo - execpath_len;
> -               error = copyout(imgp->execpath, (void *)imgp->execpathp,
> -                   execpath_len);
> +               destp -= execpath_len;
> +               destp = rounddown2(destp, sizeof(void *));
> +               imgp->execpathp = destp;
> +               error = copyout(imgp->execpath, (void *)destp,
> execpath_len);
>                 if (error != 0)
>                         return (error);
>         }
>
>         /* Prepare the canary for SSP. */
>         arc4rand(canary, sizeof(canary), 0);
> -       imgp->canary = (uintptr_t)arginfo -
> -           roundup(execpath_len, sizeof(char *)) -
> -           roundup(sizeof(canary), sizeof(char *));
> -       error = copyout(canary, (void *)imgp->canary, sizeof(canary));
> +       destp -= roundup(sizeof(canary), sizeof(void *));
> +       imgp->canary = destp;
> +       error = copyout(canary, (void *)destp, sizeof(canary));
>         if (error != 0)
>                 return (error);
>
> -       vectp = (uint32_t *)destp;
> +       /* Allocate room for the argument and environment strings. */
> +       destp -= ARG_MAX - imgp->args->stringspace;
> +       destp = rounddown2(destp, sizeof(void *));
> +       ustringp = destp;
> +
>         if (imgp->auxargs) {
> -               error = imgp->sysent->sv_copyout_auxargs(imgp,
> -                   (u_long *)&vectp);
> +               error = imgp->sysent->sv_copyout_auxargs(imgp, &destp);
>                 if (error != 0)
>                         return (error);
>         }
>
> +       vectp = (uint32_t *)destp;
> +
>         /*
>          * Allocate room for the argv[] and env vectors including the
>          * terminating NULL pointers.
> @@ -774,13 +778,15 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>         vectp -= imgp->args->argc + 1 + imgp->args->envc + 1;
>
>         /* vectp also becomes our initial stack base. */
> -       *stack_base = (register_t *)vectp;
> +       *stack_base = (uintptr_t)vectp;
>
>         stringp = imgp->args->begin_argv;
>         argc = imgp->args->argc;
>         envc = imgp->args->envc;
> +
>         /* Copy out strings - arguments and environment. */
> -       error = copyout(stringp, destp, ARG_MAX - imgp->args->stringspace);
> +       error = copyout(stringp, (void *)ustringp,
> +           ARG_MAX - imgp->args->stringspace);
>         if (error != 0)
>                 return (error);
>
> @@ -791,11 +797,11 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         /* Fill in argument portion of vector table. */
>         for (; argc > 0; --argc) {
> -               if (suword32(vectp++, (uint32_t)(intptr_t)destp) != 0)
> +               if (suword32(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* A null vector table pointer separates the argp's from the
> envp's. */
> @@ -808,11 +814,11 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         /* Fill in environment portion of vector table. */
>         for (; envc > 0; --envc) {
> -               if (suword32(vectp++, (uint32_t)(intptr_t)destp) != 0)
> +               if (suword32(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* The end of the vector table is a null pointer. */
>
> Modified: head/sys/arm/arm/machdep.c
>
> ==============================================================================
> --- head/sys/arm/arm/machdep.c  Tue Dec  3 23:11:40 2019        (r355372)
> +++ head/sys/arm/arm/machdep.c  Tue Dec  3 23:17:54 2019        (r355373)
> @@ -412,7 +412,7 @@ spinlock_exit(void)
>   * Clear registers on exec
>   */
>  void
> -exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
> +exec_setregs(struct thread *td, struct image_params *imgp, uintptr_t
> stack)
>  {
>         struct trapframe *tf = td->td_frame;
>
>
> Modified: head/sys/arm/cloudabi32/cloudabi32_sysvec.c
>
> ==============================================================================
> --- head/sys/arm/cloudabi32/cloudabi32_sysvec.c Tue Dec  3 23:11:40 2019
>       (r355372)
> +++ head/sys/arm/cloudabi32/cloudabi32_sysvec.c Tue Dec  3 23:17:54 2019
>       (r355373)
> @@ -49,7 +49,7 @@ extern struct sysent cloudabi32_sysent[];
>
>  static void
>  cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
> -    unsigned long stack)
> +    uintptr_t stack)
>  {
>         struct trapframe *regs;
>
>
> Modified: head/sys/arm64/arm64/elf32_machdep.c
>
> ==============================================================================
> --- head/sys/arm64/arm64/elf32_machdep.c        Tue Dec  3 23:11:40 2019
>       (r355372)
> +++ head/sys/arm64/arm64/elf32_machdep.c        Tue Dec  3 23:17:54 2019
>       (r355373)
> @@ -232,7 +232,7 @@ freebsd32_set_syscall_retval(struct thread *td, int er
>
>  static void
>  freebsd32_setregs(struct thread *td, struct image_params *imgp,
> -   u_long stack)
> +   uintptr_t stack)
>  {
>         struct trapframe *tf = td->td_frame;
>
>
> Modified: head/sys/arm64/arm64/machdep.c
>
> ==============================================================================
> --- head/sys/arm64/arm64/machdep.c      Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/arm64/arm64/machdep.c      Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -436,7 +436,7 @@ ptrace_clear_single_step(struct thread *td)
>  }
>
>  void
> -exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
> +exec_setregs(struct thread *td, struct image_params *imgp, uintptr_t
> stack)
>  {
>         struct trapframe *tf = td->td_frame;
>
>
> Modified: head/sys/arm64/cloudabi32/cloudabi32_sysvec.c
>
> ==============================================================================
> --- head/sys/arm64/cloudabi32/cloudabi32_sysvec.c       Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/arm64/cloudabi32/cloudabi32_sysvec.c       Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -49,7 +49,7 @@ extern struct sysent cloudabi32_sysent[];
>
>  static void
>  cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
> -    unsigned long stack)
> +    uintptr_t stack)
>  {
>         struct trapframe *regs;
>
>
> Modified: head/sys/arm64/cloudabi64/cloudabi64_sysvec.c
>
> ==============================================================================
> --- head/sys/arm64/cloudabi64/cloudabi64_sysvec.c       Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/arm64/cloudabi64/cloudabi64_sysvec.c       Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -49,7 +49,7 @@ extern struct sysent cloudabi64_sysent[];
>
>  static void
>  cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
> -    unsigned long stack)
> +    uintptr_t stack)
>  {
>         struct trapframe *regs;
>
>
> Modified: head/sys/arm64/linux/linux_sysvec.c
>
> ==============================================================================
> --- head/sys/arm64/linux/linux_sysvec.c Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/arm64/linux/linux_sysvec.c Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -70,8 +70,8 @@ extern struct sysent linux_sysent[LINUX_SYS_MAXSYSCALL
>  SET_DECLARE(linux_ioctl_handler_set, struct linux_ioctl_handler);
>
>  static int     linux_copyout_strings(struct image_params *imgp,
> -                   register_t **stack_base);
> -static int     linux_elf_fixup(register_t **stack_base,
> +                   uintptr_t *stack_base);
> +static int     linux_elf_fixup(uintptr_t *stack_base,
>                     struct image_params *iparams);
>  static bool    linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
>  static void    linux_vdso_install(const void *param);
> @@ -79,7 +79,7 @@ static void   linux_vdso_deinstall(const void *param);
>  static void    linux_set_syscall_retval(struct thread *td, int error);
>  static int     linux_fetch_syscall_args(struct thread *td);
>  static void    linux_exec_setregs(struct thread *td, struct image_params
> *imgp,
> -                   u_long stack);
> +                   uintptr_t stack);
>  static int     linux_vsyscall(struct thread *td);
>
>  /* DTrace init */
> @@ -143,7 +143,7 @@ linux_set_syscall_retval(struct thread *td, int error)
>  }
>
>  static int
> -linux_copyout_auxargs(struct image_params *imgp, u_long *base)
> +linux_copyout_auxargs(struct image_params *imgp, uintptr_t *base)
>  {
>         Elf_Auxargs *args;
>         Elf_Auxinfo *argarray, *pos;
> @@ -198,7 +198,7 @@ linux_copyout_auxargs(struct image_params *imgp, u_lon
>  }
>
>  static int
> -linux_elf_fixup(register_t **stack_base, struct image_params *imgp)
> +linux_elf_fixup(uintptr_t *stack_base, struct image_params *imgp)
>  {
>
>         LIN_SDT_PROBE0(sysvec, linux_elf_fixup, todo);
> @@ -213,10 +213,11 @@ linux_elf_fixup(register_t **stack_base, struct
> image_
>   * LINUXTODO: deduplicate against other linuxulator archs
>   */
>  static int
> -linux_copyout_strings(struct image_params *imgp, register_t **stack_base)
> +linux_copyout_strings(struct image_params *imgp, uintptr_t *stack_base)
>  {
>         char **vectp;
> -       char *stringp, *destp;
> +       char *stringp;
> +       uintptr_t *destp, *ustringp;
>         struct ps_strings *arginfo;
>         char canary[LINUX_AT_RANDOM_LEN];
>         size_t execpath_len;
> @@ -231,36 +232,38 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         p = imgp->proc;
>         arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
> -       destp = (caddr_t)arginfo - SPARE_USRSPACE -
> -           roundup(sizeof(canary), sizeof(char *)) -
> -           roundup(execpath_len, sizeof(char *)) -
> -           roundup(ARG_MAX - imgp->args->stringspace, sizeof(char *));
> +       destp = (uintptr_t)arginfo;
>
>         if (execpath_len != 0) {
> -               imgp->execpathp = (uintptr_t)arginfo - execpath_len;
> -               error = copyout(imgp->execpath, (void *)imgp->execpathp,
> -                   execpath_len);
> +               destp -= execpath_len;
> +               destp = rounddown2(destp, sizeof(void *));
> +               imgp->execpathp = destp;
> +               error = copyout(imgp->execpath, (void *)destp,
> execpath_len);
>                 if (error != 0)
>                         return (error);
>         }
>
>         /* Prepare the canary for SSP. */
>         arc4rand(canary, sizeof(canary), 0);
> -       imgp->canary = (uintptr_t)arginfo -
> -           roundup(execpath_len, sizeof(char *)) -
> -           roundup(sizeof(canary), sizeof(char *));
> -       error = copyout(canary, (void *)imgp->canary, sizeof(canary));
> +       destp -= roundup(sizeof(canary), sizeof(void *));
> +       imgp->canary = destp;
> +       error = copyout(canary, (void *)destp, sizeof(canary));
>         if (error != 0)
>                 return (error);
>
> -       vectp = (char **)destp;
> +       /* Allocate room for the argument and environment strings. */
> +       destp -= ARG_MAX - imgp->args->stringspace;
> +       destp = rounddown2(destp, sizeof(void *));
> +       ustringp = destp;
> +
>         if (imgp->auxargs) {
> -               error = imgp->sysent->sv_copyout_auxargs(imgp,
> -                   (u_long *)&vectp);
> +               error = imgp->sysent->sv_copyout_auxargs(imgp, &destp);
>                 if (error != 0)
>                         return (error);
>         }
>
> +       vectp = (char **)destp;
> +
>         /*
>          * Allocate room for argc and the argv[] and env vectors including
> the
>          * terminating NULL pointers.
> @@ -269,14 +272,15 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>         vectp = (char **)STACKALIGN(vectp);
>
>         /* vectp also becomes our initial stack base. */
> -       *stack_base = (register_t *)vectp;
> +       *stack_base = (uintptr_t)vectp;
>
>         stringp = imgp->args->begin_argv;
>         argc = imgp->args->argc;
>         envc = imgp->args->envc;
>
>         /* Copy out strings - arguments and environment. */
> -       error = copyout(stringp, destp, ARG_MAX - imgp->args->stringspace);
> +       error = copyout(stringp, (void *)ustringp,
> +           ARG_MAX - imgp->args->stringspace);
>         if (error != 0)
>                 return (error);
>
> @@ -290,11 +294,11 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         /* Fill in argument portion of vector table. */
>         for (; argc > 0; --argc) {
> -               if (suword(vectp++, (long)(intptr_t)destp) != 0)
> +               if (suword(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* A null vector table pointer separates the argp's from the
> envp's. */
> @@ -307,11 +311,11 @@ linux_copyout_strings(struct image_params *imgp,
> regis
>
>         /* Fill in environment portion of vector table. */
>         for (; envc > 0; --envc) {
> -               if (suword(vectp++, (long)(intptr_t)destp) != 0)
> +               if (suword(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* The end of the vector table is a null pointer. */
> @@ -325,7 +329,8 @@ linux_copyout_strings(struct image_params *imgp, regis
>   * Reset registers to default values on exec.
>   */
>  static void
> -linux_exec_setregs(struct thread *td, struct image_params *imgp, u_long
> stack)
> +linux_exec_setregs(struct thread *td, struct image_params *imgp,
> +    uintptr_t stack)
>  {
>         struct trapframe *regs = td->td_frame;
>
>
> Modified: head/sys/compat/cloudabi32/cloudabi32_module.c
>
> ==============================================================================
> --- head/sys/compat/cloudabi32/cloudabi32_module.c      Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/compat/cloudabi32/cloudabi32_module.c      Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -46,7 +46,7 @@ extern char _binary_cloudabi32_vdso_o_start[];
>  extern char _binary_cloudabi32_vdso_o_end[];
>
>  int
> -cloudabi32_copyout_strings(struct image_params *imgp, register_t
> **stack_base)
> +cloudabi32_copyout_strings(struct image_params *imgp, uintptr_t
> *stack_base)
>  {
>         struct image_args *args;
>         uintptr_t begin;
> @@ -56,12 +56,12 @@ cloudabi32_copyout_strings(struct image_params *imgp,
>         args = imgp->args;
>         len = exec_args_get_begin_envv(args) - args->begin_argv;
>         begin = rounddown2(imgp->sysent->sv_usrstack - len,
> sizeof(register_t));
> -       *stack_base = (register_t *)begin;
> +       *stack_base = begin;
>         return (copyout(args->begin_argv, (void *)begin, len));
>  }
>
>  int
> -cloudabi32_fixup(register_t **stack_base, struct image_params *imgp)
> +cloudabi32_fixup(uintptr_t *stack_base, struct image_params *imgp)
>  {
>         char canarybuf[64], pidbuf[16];
>         Elf32_Auxargs *args;
> @@ -79,12 +79,12 @@ cloudabi32_fixup(register_t **stack_base, struct image
>         td = curthread;
>         td->td_proc->p_osrel = __FreeBSD_version;
>
> -       argdata = *stack_base;
> +       argdata = (void *)*stack_base;
>
>         /* Store canary for stack smashing protection. */
>         arc4rand(canarybuf, sizeof(canarybuf), 0);
> -       *stack_base -= howmany(sizeof(canarybuf), sizeof(register_t));
> -       canary = *stack_base;
> +       *stack_base -= roundup(sizeof(canarybuf), sizeof(register_t));
> +       canary = (void *)*stack_base;
>         error = copyout(canarybuf, canary, sizeof(canarybuf));
>         if (error != 0)
>                 return (error);
> @@ -97,8 +97,8 @@ cloudabi32_fixup(register_t **stack_base, struct image
>         arc4rand(pidbuf, sizeof(pidbuf), 0);
>         pidbuf[6] = (pidbuf[6] & 0x0f) | 0x40;
>         pidbuf[8] = (pidbuf[8] & 0x3f) | 0x80;
> -       *stack_base -= howmany(sizeof(pidbuf), sizeof(register_t));
> -       pid = *stack_base;
> +       *stack_base -= roundup(sizeof(pidbuf), sizeof(register_t));
> +       pid = (void *)*stack_base;
>         error = copyout(pidbuf, pid, sizeof(pidbuf));
>         if (error != 0)
>                 return (error);
> @@ -135,13 +135,13 @@ cloudabi32_fixup(register_t **stack_base, struct
> image
>  #undef PTR
>                 { .a_type = CLOUDABI_AT_NULL },
>         };
> -       *stack_base -= howmany(sizeof(auxv), sizeof(register_t));
> -       error = copyout(auxv, *stack_base, sizeof(auxv));
> +       *stack_base -= roundup(sizeof(auxv), sizeof(register_t));
> +       error = copyout(auxv, (void *)*stack_base, sizeof(auxv));
>         if (error != 0)
>                 return (error);
>
>         /* Reserve space for storing the TCB. */
> -       *stack_base -= howmany(sizeof(cloudabi32_tcb_t),
> sizeof(register_t));
> +       *stack_base -= roundup(sizeof(cloudabi32_tcb_t),
> sizeof(register_t));
>         return (0);
>  }
>
>
> Modified: head/sys/compat/cloudabi32/cloudabi32_util.h
>
> ==============================================================================
> --- head/sys/compat/cloudabi32/cloudabi32_util.h        Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/compat/cloudabi32/cloudabi32_util.h        Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -42,8 +42,8 @@ extern Elf32_Brandinfo cloudabi32_brand;
>  #define        TO_PTR(x)       ((void *)(uintptr_t)(x))
>
>  /* Stack initialization during process execution. */
> -int    cloudabi32_copyout_strings(struct image_params *, register_t **);
> -int    cloudabi32_fixup(register_t **, struct image_params *);
> +int    cloudabi32_copyout_strings(struct image_params *, uintptr_t *);
> +int    cloudabi32_fixup(uintptr_t *, struct image_params *);
>
>  int    cloudabi32_thread_setregs(struct thread *,
>      const cloudabi32_threadattr_t *, uint32_t);
>
> Modified: head/sys/compat/cloudabi64/cloudabi64_module.c
>
> ==============================================================================
> --- head/sys/compat/cloudabi64/cloudabi64_module.c      Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/compat/cloudabi64/cloudabi64_module.c      Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -46,7 +46,7 @@ extern char _binary_cloudabi64_vdso_o_start[];
>  extern char _binary_cloudabi64_vdso_o_end[];
>
>  int
> -cloudabi64_copyout_strings(struct image_params *imgp, register_t
> **stack_base)
> +cloudabi64_copyout_strings(struct image_params *imgp, uintptr_t
> *stack_base)
>  {
>         struct image_args *args;
>         uintptr_t begin;
> @@ -56,12 +56,12 @@ cloudabi64_copyout_strings(struct image_params *imgp,
>         args = imgp->args;
>         len = exec_args_get_begin_envv(args) - args->begin_argv;
>         begin = rounddown2(imgp->sysent->sv_usrstack - len,
> sizeof(register_t));
> -       *stack_base = (register_t *)begin;
> +       *stack_base = begin;
>         return (copyout(args->begin_argv, (void *)begin, len));
>  }
>
>  int
> -cloudabi64_fixup(register_t **stack_base, struct image_params *imgp)
> +cloudabi64_fixup(uintptr_t *stack_base, struct image_params *imgp)
>  {
>         char canarybuf[64], pidbuf[16];
>         Elf64_Auxargs *args;
> @@ -79,12 +79,12 @@ cloudabi64_fixup(register_t **stack_base, struct image
>         td = curthread;
>         td->td_proc->p_osrel = __FreeBSD_version;
>
> -       argdata = *stack_base;
> +       argdata = (void *)*stack_base;
>
>         /* Store canary for stack smashing protection. */
>         arc4rand(canarybuf, sizeof(canarybuf), 0);
> -       *stack_base -= howmany(sizeof(canarybuf), sizeof(register_t));
> -       canary = *stack_base;
> +       *stack_base -= roundup(sizeof(canarybuf), sizeof(register_t));
> +       canary = (void *)*stack_base;
>         error = copyout(canarybuf, canary, sizeof(canarybuf));
>         if (error != 0)
>                 return (error);
> @@ -97,8 +97,8 @@ cloudabi64_fixup(register_t **stack_base, struct image
>         arc4rand(pidbuf, sizeof(pidbuf), 0);
>         pidbuf[6] = (pidbuf[6] & 0x0f) | 0x40;
>         pidbuf[8] = (pidbuf[8] & 0x3f) | 0x80;
> -       *stack_base -= howmany(sizeof(pidbuf), sizeof(register_t));
> -       pid = *stack_base;
> +       *stack_base -= roundup(sizeof(pidbuf), sizeof(register_t));
> +       pid = (void *)*stack_base;
>         error = copyout(pidbuf, pid, sizeof(pidbuf));
>         if (error != 0)
>                 return (error);
> @@ -135,13 +135,13 @@ cloudabi64_fixup(register_t **stack_base, struct
> image
>  #undef PTR
>                 { .a_type = CLOUDABI_AT_NULL },
>         };
> -       *stack_base -= howmany(sizeof(auxv), sizeof(register_t));
> -       error = copyout(auxv, *stack_base, sizeof(auxv));
> +       *stack_base -= roundup(sizeof(auxv), sizeof(register_t));
> +       error = copyout(auxv, (void *)*stack_base, sizeof(auxv));
>         if (error != 0)
>                 return (error);
>
>         /* Reserve space for storing the TCB. */
> -       *stack_base -= howmany(sizeof(cloudabi64_tcb_t),
> sizeof(register_t));
> +       *stack_base -= roundup(sizeof(cloudabi64_tcb_t),
> sizeof(register_t));
>         return (0);
>  }
>
>
> Modified: head/sys/compat/cloudabi64/cloudabi64_util.h
>
> ==============================================================================
> --- head/sys/compat/cloudabi64/cloudabi64_util.h        Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/compat/cloudabi64/cloudabi64_util.h        Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -42,8 +42,8 @@ extern Elf64_Brandinfo cloudabi64_brand;
>  #define        TO_PTR(x)       ((void *)(uintptr_t)(x))
>
>  /* Stack initialization during process execution. */
> -int    cloudabi64_copyout_strings(struct image_params *, register_t **);
> -int    cloudabi64_fixup(register_t **, struct image_params *);
> +int    cloudabi64_copyout_strings(struct image_params *, uintptr_t *);
> +int    cloudabi64_fixup(uintptr_t *, struct image_params *);
>
>  int    cloudabi64_thread_setregs(struct thread *,
>      const cloudabi64_threadattr_t *, uint64_t);
>
> Modified: head/sys/compat/freebsd32/freebsd32_misc.c
>
> ==============================================================================
> --- head/sys/compat/freebsd32/freebsd32_misc.c  Tue Dec  3 23:11:40 2019
>       (r355372)
> +++ head/sys/compat/freebsd32/freebsd32_misc.c  Tue Dec  3 23:17:54 2019
>       (r355373)
> @@ -3120,12 +3120,12 @@ syscall32_helper_unregister(struct
> syscall_helper_data
>  }
>
>  int
> -freebsd32_copyout_strings(struct image_params *imgp, register_t
> **stack_base)
> +freebsd32_copyout_strings(struct image_params *imgp, uintptr_t
> *stack_base)
>  {
>         int argc, envc, i;
>         u_int32_t *vectp;
>         char *stringp;
> -       uintptr_t destp;
> +       uintptr_t destp, ustringp;
>         struct freebsd32_ps_strings *arginfo;
>         char canary[sizeof(long) * 8];
>         int32_t pagesizes32[MAXPAGESIZES];
> @@ -3195,20 +3195,24 @@ freebsd32_copyout_strings(struct image_params
> *imgp, r
>                 return (error);
>         imgp->pagesizeslen = sizeof(pagesizes32);
>
> +       /*
> +        * Allocate room for the argument and environment strings.
> +        */
>         destp -= ARG_MAX - imgp->args->stringspace;
>         destp = rounddown2(destp, sizeof(uint32_t));
> +       ustringp = destp;
>
> -       vectp = (uint32_t *)destp;
>         if (imgp->sysent->sv_stackgap != NULL)
> -               imgp->sysent->sv_stackgap(imgp, (u_long *)&vectp);
> +               imgp->sysent->sv_stackgap(imgp, &destp);
>
>         if (imgp->auxargs) {
> -               error = imgp->sysent->sv_copyout_auxargs(imgp,
> -                   (u_long *)&vectp);
> +               error = imgp->sysent->sv_copyout_auxargs(imgp, &destp);
>                 if (error != 0)
>                         return (error);
>         }
>
> +       vectp = (uint32_t *)destp;
> +
>         /*
>          * Allocate room for the argv[] and env vectors including the
>          * terminating NULL pointers.
> @@ -3218,7 +3222,7 @@ freebsd32_copyout_strings(struct image_params *imgp,
> r
>         /*
>          * vectp also becomes our initial stack base
>          */
> -       *stack_base = (register_t *)vectp;
> +       *stack_base = (uintptr_t)vectp;
>
>         stringp = imgp->args->begin_argv;
>         argc = imgp->args->argc;
> @@ -3226,7 +3230,7 @@ freebsd32_copyout_strings(struct image_params *imgp,
> r
>         /*
>          * Copy out strings - arguments and environment.
>          */
> -       error = copyout(stringp, (void *)destp,
> +       error = copyout(stringp, (void *)ustringp,
>             ARG_MAX - imgp->args->stringspace);
>         if (error != 0)
>                 return (error);
> @@ -3242,11 +3246,11 @@ freebsd32_copyout_strings(struct image_params
> *imgp, r
>          * Fill in argument portion of vector table.
>          */
>         for (; argc > 0; --argc) {
> -               if (suword32(vectp++, (u_int32_t)(intptr_t)destp) != 0)
> +               if (suword32(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* a null vector table pointer separates the argp's from the
> envp's */
> @@ -3261,11 +3265,11 @@ freebsd32_copyout_strings(struct image_params
> *imgp, r
>          * Fill in environment portion of vector table.
>          */
>         for (; envc > 0; --envc) {
> -               if (suword32(vectp++, (u_int32_t)(intptr_t)destp) != 0)
> +               if (suword32(vectp++, ustringp) != 0)
>                         return (EFAULT);
>                 while (*stringp++ != 0)
> -                       destp++;
> -               destp++;
> +                       ustringp++;
> +               ustringp++;
>         }
>
>         /* end of vector table is a null pointer */
>
> Modified: head/sys/compat/freebsd32/freebsd32_util.h
>
> ==============================================================================
> --- head/sys/compat/freebsd32/freebsd32_util.h  Tue Dec  3 23:11:40 2019
>       (r355372)
> +++ head/sys/compat/freebsd32/freebsd32_util.h  Tue Dec  3 23:17:54 2019
>       (r355373)
> @@ -113,7 +113,7 @@ int    syscall32_helper_unregister(struct syscall_help
>  struct iovec32;
>  struct rusage32;
>  int    freebsd32_copyout_strings(struct image_params *imgp,
> -           register_t **stack_base);
> +           uintptr_t *stack_base);
>  int    freebsd32_copyiniov(struct iovec32 *iovp, u_int iovcnt,
>             struct iovec **iov, int error);
>  void   freebsd32_rusage_out(const struct rusage *s, struct rusage32 *s32);
>
> Modified: head/sys/compat/ia32/ia32_signal.h
>
> ==============================================================================
> --- head/sys/compat/ia32/ia32_signal.h  Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/compat/ia32/ia32_signal.h  Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -206,7 +206,7 @@ extern int sz_ia32_osigcode;
>  extern int sz_lcall_tramp;
>  void ia32_sendsig(sig_t, struct ksiginfo *, sigset_t *);
>  void ia32_setregs(struct thread *td, struct image_params *imgp,
> -    u_long stack);
> +    uintptr_t stack);
>  int setup_lcall_gate(void);
>
>  #endif
>
> Modified: head/sys/i386/cloudabi32/cloudabi32_sysvec.c
>
> ==============================================================================
> --- head/sys/i386/cloudabi32/cloudabi32_sysvec.c        Tue Dec  3
> 23:11:40 2019        (r355372)
> +++ head/sys/i386/cloudabi32/cloudabi32_sysvec.c        Tue Dec  3
> 23:17:54 2019        (r355373)
> @@ -48,7 +48,7 @@ extern const char *cloudabi32_syscallnames[];
>  extern struct sysent cloudabi32_sysent[];
>
>  static int
> -cloudabi32_fixup_tcb(register_t **stack_base, struct image_params *imgp)
> +cloudabi32_fixup_tcb(uintptr_t *stack_base, struct image_params *imgp)
>  {
>         int error;
>         uint32_t args[2];
> @@ -68,16 +68,16 @@ cloudabi32_fixup_tcb(register_t **stack_base, struct i
>          * refer to the auxiliary vector, which is stored right after
>          * the TCB.
>          */
> -       args[0] = (uintptr_t)*stack_base;
> -       args[1] = (uintptr_t)*stack_base +
> +       args[0] = *stack_base;
> +       args[1] = *stack_base +
>             roundup(sizeof(cloudabi32_tcb_t), sizeof(register_t));
> -       *stack_base -= howmany(sizeof(args), sizeof(register_t));
> -       return (copyout(args, *stack_base, sizeof(args)));
> +       *stack_base -= roundup(sizeof(args), sizeof(register_t));
> +       return (copyout(args, (void *)*stack_base, sizeof(args)));
>  }
>
>  static void
>  cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
> -    unsigned long stack)
> +    uintptr_t stack)
>  {
>
>         exec_setregs(td, imgp, stack);
>
> Modified: head/sys/i386/i386/machdep.c
>
> ==============================================================================
> --- head/sys/i386/i386/machdep.c        Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/i386/i386/machdep.c        Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -1124,7 +1124,7 @@ setup_priv_lcall_gate(struct proc *p)
>   * Reset registers to default values on exec.
>   */
>  void
> -exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
> +exec_setregs(struct thread *td, struct image_params *imgp, uintptr_t
> stack)
>  {
>         struct trapframe *regs;
>         struct pcb *pcb;
>
> Modified: head/sys/i386/linux/linux_sysvec.c
>
> ==============================================================================
> --- head/sys/i386/linux/linux_sysvec.c  Tue Dec  3 23:11:40 2019
> (r355372)
> +++ head/sys/i386/linux/linux_sysvec.c  Tue Dec  3 23:17:54 2019
> (r355373)
> @@ -88,15 +88,15 @@ extern struct sysent linux_sysent[LINUX_SYS_MAXSYSCALL
>
>  SET_DECLARE(linux_ioctl_handler_set, struct linux_ioctl_handler);
>
> -static int     linux_fixup(register_t **stack_base,
> +static int     linux_fixup(uintptr_t *stack_base,
>                     struct image_params *iparams);
> -static int     linux_fixup_elf(register_t **stack_base,
> +static int     linux_fixup_elf(uintptr_t *stack_base,
>                     struct image_params *iparams);
>  static void     linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t
> *mask);
>  static void    linux_exec_setregs(struct thread *td,
> -                   struct image_params *imgp, u_long stack);
>
> *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGtf9xOhxr0DgqMagNBrbaFMG_k3YU60GwBqP0g_zmAEQbu2mg>