Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/imgact_elf.c
Show First 20 Lines • Show All 1,427 Lines • ▼ Show 20 Lines | |||||
#define elf_suword __CONCAT(suword, __ELF_WORD_SIZE) | #define elf_suword __CONCAT(suword, __ELF_WORD_SIZE) | ||||
int | int | ||||
__elfN(freebsd_copyout_auxargs)(struct image_params *imgp, uintptr_t base) | __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, uintptr_t base) | ||||
{ | { | ||||
Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs; | Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs; | ||||
Elf_Auxinfo *argarray, *pos; | Elf_Auxinfo *argarray, *pos; | ||||
struct vmspace *vmspace; | |||||
int error; | int error; | ||||
argarray = pos = malloc(AT_COUNT * sizeof(*pos), M_TEMP, | argarray = pos = malloc(AT_COUNT * sizeof(*pos), M_TEMP, | ||||
M_WAITOK | M_ZERO); | M_WAITOK | M_ZERO); | ||||
vmspace = imgp->proc->p_vmspace; | |||||
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, 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_PAGESZ, args->pagesz); | ||||
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, AT_BASE, args->base); | ||||
AUXARGS_ENTRY(pos, AT_EHDRFLAGS, args->hdr_eflags); | AUXARGS_ENTRY(pos, AT_EHDRFLAGS, args->hdr_eflags); | ||||
if (imgp->execpathp != 0) | if (imgp->execpathp != 0) | ||||
AUXARGS_ENTRY_PTR(pos, AT_EXECPATH, imgp->execpathp); | AUXARGS_ENTRY_PTR(pos, AT_EXECPATH, imgp->execpathp); | ||||
AUXARGS_ENTRY(pos, AT_OSRELDATE, | AUXARGS_ENTRY(pos, AT_OSRELDATE, | ||||
imgp->proc->p_ucred->cr_prison->pr_osreldate); | imgp->proc->p_ucred->cr_prison->pr_osreldate); | ||||
if (imgp->canary != 0) { | if (imgp->canary != 0) { | ||||
AUXARGS_ENTRY_PTR(pos, AT_CANARY, imgp->canary); | AUXARGS_ENTRY_PTR(pos, AT_CANARY, imgp->canary); | ||||
AUXARGS_ENTRY(pos, AT_CANARYLEN, imgp->canarylen); | AUXARGS_ENTRY(pos, AT_CANARYLEN, imgp->canarylen); | ||||
} | } | ||||
AUXARGS_ENTRY(pos, AT_NCPUS, mp_ncpus); | AUXARGS_ENTRY(pos, AT_NCPUS, mp_ncpus); | ||||
if (imgp->pagesizes != 0) { | if (imgp->pagesizes != 0) { | ||||
AUXARGS_ENTRY_PTR(pos, AT_PAGESIZES, imgp->pagesizes); | AUXARGS_ENTRY_PTR(pos, AT_PAGESIZES, imgp->pagesizes); | ||||
AUXARGS_ENTRY(pos, AT_PAGESIZESLEN, imgp->pagesizeslen); | AUXARGS_ENTRY(pos, AT_PAGESIZESLEN, imgp->pagesizeslen); | ||||
} | } | ||||
if (imgp->sysent->sv_timekeep_base != 0) { | if ((imgp->sysent->sv_flags & SV_TIMEKEEP) != 0) { | ||||
AUXARGS_ENTRY(pos, AT_TIMEKEEP, | AUXARGS_ENTRY(pos, AT_TIMEKEEP, | ||||
imgp->sysent->sv_timekeep_base); | vmspace->vm_shp_base + imgp->sysent->sv_timekeep_offset); | ||||
} | } | ||||
AUXARGS_ENTRY(pos, AT_STACKPROT, imgp->sysent->sv_shared_page_obj | AUXARGS_ENTRY(pos, AT_STACKPROT, imgp->sysent->sv_shared_page_obj | ||||
!= NULL && imgp->stack_prot != 0 ? imgp->stack_prot : | != NULL && imgp->stack_prot != 0 ? imgp->stack_prot : | ||||
imgp->sysent->sv_stackprot); | imgp->sysent->sv_stackprot); | ||||
if (imgp->sysent->sv_hwcap != NULL) | if (imgp->sysent->sv_hwcap != NULL) | ||||
AUXARGS_ENTRY(pos, AT_HWCAP, *imgp->sysent->sv_hwcap); | AUXARGS_ENTRY(pos, AT_HWCAP, *imgp->sysent->sv_hwcap); | ||||
if (imgp->sysent->sv_hwcap2 != NULL) | if (imgp->sysent->sv_hwcap2 != NULL) | ||||
AUXARGS_ENTRY(pos, AT_HWCAP2, *imgp->sysent->sv_hwcap2); | AUXARGS_ENTRY(pos, AT_HWCAP2, *imgp->sysent->sv_hwcap2); | ||||
AUXARGS_ENTRY(pos, AT_BSDFLAGS, __elfN(sigfastblock) ? | AUXARGS_ENTRY(pos, AT_BSDFLAGS, __elfN(sigfastblock) ? | ||||
ELF_BSDF_SIGFASTBLK : 0); | ELF_BSDF_SIGFASTBLK : 0); | ||||
AUXARGS_ENTRY(pos, AT_ARGC, imgp->args->argc); | AUXARGS_ENTRY(pos, AT_ARGC, imgp->args->argc); | ||||
AUXARGS_ENTRY_PTR(pos, AT_ARGV, imgp->argv); | AUXARGS_ENTRY_PTR(pos, AT_ARGV, imgp->argv); | ||||
AUXARGS_ENTRY(pos, AT_ENVC, imgp->args->envc); | AUXARGS_ENTRY(pos, AT_ENVC, imgp->args->envc); | ||||
AUXARGS_ENTRY_PTR(pos, AT_ENVV, imgp->envv); | AUXARGS_ENTRY_PTR(pos, AT_ENVV, imgp->envv); | ||||
AUXARGS_ENTRY_PTR(pos, AT_PS_STRINGS, imgp->ps_strings); | AUXARGS_ENTRY_PTR(pos, AT_PS_STRINGS, imgp->ps_strings); | ||||
if (imgp->sysent->sv_fxrng_gen_base != 0) | #ifdef RANDOM_FENESTRASX | ||||
AUXARGS_ENTRY(pos, AT_FXRNG, imgp->sysent->sv_fxrng_gen_base); | if ((imgp->sysent->sv_flags & SV_RNG_SEED_VER) != 0) { | ||||
if (imgp->sysent->sv_vdso_base != 0 && __elfN(vdso) != 0) | AUXARGS_ENTRY(pos, AT_FXRNG, | ||||
AUXARGS_ENTRY(pos, AT_KPRELOAD, imgp->sysent->sv_vdso_base); | vmspace->vm_shp_base + imgp->sysent->sv_fxrng_gen_offset); | ||||
} | |||||
#endif | |||||
if ((imgp->sysent->sv_flags & SV_DSO_SIG) != 0 && __elfN(vdso) != 0) { | |||||
AUXARGS_ENTRY(pos, AT_KPRELOAD, | |||||
vmspace->vm_shp_base + imgp->sysent->sv_vdso_offset); | |||||
} | |||||
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 <= AT_COUNT, ("Too many auxargs")); | KASSERT(pos - argarray <= AT_COUNT, ("Too many auxargs")); | ||||
error = copyout(argarray, (void *)base, sizeof(*argarray) * AT_COUNT); | error = copyout(argarray, (void *)base, sizeof(*argarray) * AT_COUNT); | ||||
free(argarray, M_TEMP); | free(argarray, M_TEMP); | ||||
▲ Show 20 Lines • Show All 1,396 Lines • Show Last 20 Lines |