Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137311640
D20799.id60038.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D20799.id60038.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D20799: Eliminate the last MI difference in AT_* definitions (for powerpc).
Attached
Detach File
Event Timeline
Log In to Comment