Index: sys/kern/imgact_elf.c =================================================================== --- sys/kern/imgact_elf.c +++ sys/kern/imgact_elf.c @@ -1301,6 +1301,115 @@ #define suword __CONCAT(suword, __ELF_WORD_SIZE) +#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 +#ifndef __powerpc__ +#define OLD_AT_GID AT_GID +#define OLD_AT_EGID AT_EGID +#define OLD_AT_EXECPATH AT_EXECPATH +#define OLD_AT_CANARY AT_CANARY +#define OLD_AT_CANARYLEN AT_CANARYLEN +#define OLD_AT_OSRELDATE AT_OSRELDATE +#define OLD_AT_NCPUS AT_NCPUS +#define OLD_AT_PAGESIZES AT_PAGESIZES +#define OLD_AT_PAGESIZESLEN AT_PAGESIZESLEN +#else /* defined(__powerpc__) */ +#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 +#endif /* defined(__powerpc__) */ +#define OLD_AT_TIMEKEEP AT_TIMEKEEP +#ifndef __powerpc__ +#define OLD_AT_STACKPROT AT_STACKPROT +#endif +#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)(register_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 = (register_t *)base; + return (0); +} + int __elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp) { @@ -1309,6 +1418,9 @@ Elf_Addr *base, *auxbase; int error; + if (imgp->proc->p_osrel < P_OSREL_POWERPC_NEW_AUX_ARGS) + return (__elfN(freebsd_fixup_old_auxargs)(stack_base, imgp)); + base = (Elf_Addr *)*stack_base; auxbase = base + imgp->args->argc + 1 + imgp->args->envc + 1; argarray = pos = malloc(AT_COUNT * sizeof(*pos), M_TEMP, Index: sys/sys/elf_common.h =================================================================== --- sys/sys/elf_common.h +++ sys/sys/elf_common.h @@ -927,7 +927,6 @@ #define AT_NOTELF 10 /* Program is not ELF ?? */ #define AT_UID 11 /* Real uid. */ #define AT_EUID 12 /* Effective uid. */ -#ifndef __powerpc__ #define AT_GID 13 /* Real gid. */ #define AT_EGID 14 /* Effective gid. */ #define AT_EXECPATH 15 /* Path to the executable. */ @@ -937,20 +936,8 @@ #define AT_NCPUS 19 /* Number of CPUs. */ #define AT_PAGESIZES 20 /* Pagesizes. */ #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ -#else /* defined(__powerpc__) */ -#define AT_EXECPATH 13 -#define AT_CANARY 14 -#define AT_CANARYLEN 15 -#define AT_OSRELDATE 16 -#define AT_NCPUS 17 -#define AT_PAGESIZES 18 -#define AT_PAGESIZESLEN 19 -#define AT_STACKPROT 21 -#endif /* defined(__powerpc__) */ #define AT_TIMEKEEP 22 /* Pointer to timehands. */ -#ifndef __powerpc__ #define AT_STACKPROT 23 /* Initial stack protection. */ -#endif #define AT_EHDRFLAGS 24 /* e_flags field from elf hdr */ #define AT_HWCAP 25 /* CPU feature flags. */ #define AT_HWCAP2 26 /* CPU feature flags 2. */ Index: sys/sys/param.h =================================================================== --- sys/sys/param.h +++ sys/sys/param.h @@ -60,7 +60,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 1300034 /* Master, propagated to newvers */ +#define __FreeBSD_version 1300035 /* Master, propagated to newvers */ /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD, @@ -90,6 +90,7 @@ #define P_OSREL_VMTOTAL64 1200054 #define P_OSREL_CK_SUPERBLOCK 1300000 #define P_OSREL_CK_INODE 1300005 +#define P_OSREL_POWERPC_NEW_AUX_ARGS 1300035 #define P_OSREL_MAJOR(x) ((x) / 100000) #endif