Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/imgact_elf.c
Show First 20 Lines • Show All 1,317 Lines • ▼ Show 20 Lines | |||||
ret: | ret: | ||||
if (free_interp) | if (free_interp) | ||||
free(interp, M_TEMP); | free(interp, M_TEMP); | ||||
return (error); | return (error); | ||||
} | } | ||||
#define suword __CONCAT(suword, __ELF_WORD_SIZE) | #define suword __CONCAT(suword, __ELF_WORD_SIZE) | ||||
void | int | ||||
__elfN(freebsd_copyout_auxargs)(struct image_params *imgp, u_long *base) | __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, u_long *base) | ||||
{ | { | ||||
Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs; | Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs; | ||||
Elf_Auxinfo *argarray, *pos; | Elf_Auxinfo *argarray, *pos; | ||||
u_long auxlen; | u_long auxlen; | ||||
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); | ||||
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); | ||||
Show All 30 Lines | __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, u_long *base) | ||||
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")); | ||||
auxlen = sizeof(*argarray) * (pos - argarray); | auxlen = sizeof(*argarray) * (pos - argarray); | ||||
*base -= auxlen; | *base -= auxlen; | ||||
copyout(argarray, (void *)*base, auxlen); | error = copyout(argarray, (void *)*base, auxlen); | ||||
free(argarray, M_TEMP); | free(argarray, M_TEMP); | ||||
return (error); | |||||
} | } | ||||
int | int | ||||
__elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp) | __elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp) | ||||
{ | { | ||||
Elf_Addr *base; | Elf_Addr *base; | ||||
base = (Elf_Addr *)*stack_base; | base = (Elf_Addr *)*stack_base; | ||||
▲ Show 20 Lines • Show All 1,381 Lines • Show Last 20 Lines |