Page MenuHomeFreeBSD

D20799.id60038.diff
No OneTemporary

D20799.id60038.diff

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

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 23, 8:20 AM (15 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26009192
Default Alt Text
D20799.id60038.diff (6 KB)

Event Timeline