Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/linux32/linux32_sysvec.c
Show First 20 Lines • Show All 193 Lines • ▼ Show 20 Lines | linux_copyout_auxargs(struct image_params *imgp, uintptr_t base) | ||||
Elf32_Auxinfo *argarray, *pos; | Elf32_Auxinfo *argarray, *pos; | ||||
int error, issetugid; | int error, issetugid; | ||||
args = (Elf32_Auxargs *)imgp->auxargs; | args = (Elf32_Auxargs *)imgp->auxargs; | ||||
argarray = pos = malloc(LINUX_AT_COUNT * sizeof(*pos), M_TEMP, | argarray = pos = malloc(LINUX_AT_COUNT * sizeof(*pos), M_TEMP, | ||||
M_WAITOK | M_ZERO); | M_WAITOK | M_ZERO); | ||||
issetugid = imgp->proc->p_flag & P_SUGID ? 1 : 0; | issetugid = imgp->proc->p_flag & P_SUGID ? 1 : 0; | ||||
AUXARGS_ENTRY(pos, LINUX_AT_SYSINFO, linux32_vsyscall); | |||||
AUXARGS_ENTRY(pos, LINUX_AT_SYSINFO_EHDR, | AUXARGS_ENTRY(pos, LINUX_AT_SYSINFO_EHDR, | ||||
imgp->proc->p_sysent->sv_shared_page_base); | imgp->proc->p_sysent->sv_shared_page_base); | ||||
AUXARGS_ENTRY(pos, LINUX_AT_SYSINFO, linux32_vsyscall); | |||||
AUXARGS_ENTRY(pos, LINUX_AT_HWCAP, cpu_feature); | AUXARGS_ENTRY(pos, LINUX_AT_HWCAP, cpu_feature); | ||||
AUXARGS_ENTRY(pos, AT_PAGESZ, args->pagesz); | |||||
/* | /* | ||||
* Do not export AT_CLKTCK when emulating Linux kernel prior to 2.4.0, | * Do not export AT_CLKTCK when emulating Linux kernel prior to 2.4.0, | ||||
* as it has appeared in the 2.4.0-rc7 first time. | * as it has appeared in the 2.4.0-rc7 first time. | ||||
* Being exported, AT_CLKTCK is returned by sysconf(_SC_CLK_TCK), | * Being exported, AT_CLKTCK is returned by sysconf(_SC_CLK_TCK), | ||||
* glibc falls back to the hard-coded CLK_TCK value when aux entry | * glibc falls back to the hard-coded CLK_TCK value when aux entry | ||||
* is not present. | * is not present. | ||||
* Also see linux_times() implementation. | * Also see linux_times() implementation. | ||||
*/ | */ | ||||
if (linux_kernver(curthread) >= LINUX_KERNVER_2004000) | if (linux_kernver(curthread) >= LINUX_KERNVER_2004000) | ||||
AUXARGS_ENTRY(pos, LINUX_AT_CLKTCK, stclohz); | AUXARGS_ENTRY(pos, LINUX_AT_CLKTCK, stclohz); | ||||
AUXARGS_ENTRY(pos, AT_PHDR, args->phdr); | AUXARGS_ENTRY(pos, AT_PHDR, args->phdr); | ||||
AUXARGS_ENTRY(pos, AT_PHENT, args->phent); | AUXARGS_ENTRY(pos, AT_PHENT, args->phent); | ||||
AUXARGS_ENTRY(pos, AT_PHNUM, args->phnum); | AUXARGS_ENTRY(pos, AT_PHNUM, args->phnum); | ||||
AUXARGS_ENTRY(pos, AT_PAGESZ, args->pagesz); | AUXARGS_ENTRY(pos, AT_BASE, args->base); | ||||
AUXARGS_ENTRY(pos, AT_FLAGS, args->flags); | AUXARGS_ENTRY(pos, AT_FLAGS, args->flags); | ||||
AUXARGS_ENTRY(pos, AT_ENTRY, args->entry); | AUXARGS_ENTRY(pos, AT_ENTRY, args->entry); | ||||
AUXARGS_ENTRY(pos, AT_BASE, args->base); | |||||
AUXARGS_ENTRY(pos, LINUX_AT_SECURE, issetugid); | |||||
AUXARGS_ENTRY(pos, AT_UID, imgp->proc->p_ucred->cr_ruid); | AUXARGS_ENTRY(pos, AT_UID, imgp->proc->p_ucred->cr_ruid); | ||||
AUXARGS_ENTRY(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid); | AUXARGS_ENTRY(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid); | ||||
AUXARGS_ENTRY(pos, AT_GID, imgp->proc->p_ucred->cr_rgid); | AUXARGS_ENTRY(pos, AT_GID, imgp->proc->p_ucred->cr_rgid); | ||||
AUXARGS_ENTRY(pos, AT_EGID, imgp->proc->p_ucred->cr_svgid); | AUXARGS_ENTRY(pos, AT_EGID, imgp->proc->p_ucred->cr_svgid); | ||||
AUXARGS_ENTRY(pos, LINUX_AT_PLATFORM, PTROUT(linux_platform)); | AUXARGS_ENTRY(pos, LINUX_AT_SECURE, issetugid); | ||||
AUXARGS_ENTRY(pos, LINUX_AT_RANDOM, PTROUT(imgp->canary)); | AUXARGS_ENTRY(pos, LINUX_AT_RANDOM, PTROUT(imgp->canary)); | ||||
AUXARGS_ENTRY(pos, LINUX_AT_HWCAP2, 0); | |||||
if (imgp->execpathp != 0) | if (imgp->execpathp != 0) | ||||
AUXARGS_ENTRY(pos, LINUX_AT_EXECFN, PTROUT(imgp->execpathp)); | AUXARGS_ENTRY(pos, LINUX_AT_EXECFN, PTROUT(imgp->execpathp)); | ||||
if (args->execfd != -1) | if (args->execfd != -1) | ||||
AUXARGS_ENTRY(pos, AT_EXECFD, args->execfd); | AUXARGS_ENTRY(pos, AT_EXECFD, args->execfd); | ||||
AUXARGS_ENTRY(pos, LINUX_AT_PLATFORM, PTROUT(linux_platform)); | |||||
AUXARGS_ENTRY(pos, AT_NULL, 0); | AUXARGS_ENTRY(pos, AT_NULL, 0); | ||||
free(imgp->auxargs, M_TEMP); | free(imgp->auxargs, M_TEMP); | ||||
imgp->auxargs = NULL; | imgp->auxargs = NULL; | ||||
KASSERT(pos - argarray <= LINUX_AT_COUNT, ("Too many auxargs")); | KASSERT(pos - argarray <= LINUX_AT_COUNT, ("Too many auxargs")); | ||||
error = copyout(argarray, (void *)base, | error = copyout(argarray, (void *)base, | ||||
sizeof(*argarray) * LINUX_AT_COUNT); | sizeof(*argarray) * LINUX_AT_COUNT); | ||||
▲ Show 20 Lines • Show All 865 Lines • Show Last 20 Lines |