Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/imgact_elf.c
Show First 20 Lines • Show All 1,283 Lines • ▼ Show 20 Lines | error = __elfN(load_interp)(imgp, brand_info, interp, &addr, | ||||
&imgp->entry_addr); | &imgp->entry_addr); | ||||
vn_lock(imgp->vp, LK_SHARED | LK_RETRY); | vn_lock(imgp->vp, LK_SHARED | LK_RETRY); | ||||
if (error != 0) | if (error != 0) | ||||
goto ret; | goto ret; | ||||
} else | } else | ||||
addr = et_dyn_addr; | addr = et_dyn_addr; | ||||
/* | /* | ||||
* Construct auxargs table (used by the fixup routine) | * Construct auxargs table (used by the copyout_auxargs routine) | ||||
*/ | */ | ||||
elf_auxargs = malloc(sizeof(Elf_Auxargs), M_TEMP, M_NOWAIT); | elf_auxargs = malloc(sizeof(Elf_Auxargs), M_TEMP, M_NOWAIT); | ||||
if (elf_auxargs == NULL) { | if (elf_auxargs == NULL) { | ||||
VOP_UNLOCK(imgp->vp, 0); | VOP_UNLOCK(imgp->vp, 0); | ||||
elf_auxargs = malloc(sizeof(Elf_Auxargs), M_TEMP, M_WAITOK); | elf_auxargs = malloc(sizeof(Elf_Auxargs), M_TEMP, M_WAITOK); | ||||
vn_lock(imgp->vp, LK_SHARED | LK_RETRY); | vn_lock(imgp->vp, LK_SHARED | LK_RETRY); | ||||
} | } | ||||
elf_auxargs->execfd = -1; | elf_auxargs->execfd = -1; | ||||
Show All 17 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) | ||||
int | void | ||||
__elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp) | __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; | ||||
Elf_Addr *base, *auxbase; | u_long auxlen; | ||||
int error; | |||||
base = (Elf_Addr *)*stack_base; | |||||
auxbase = base + imgp->args->argc + 1 + imgp->args->envc + 1; | |||||
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); | ||||
AUXARGS_ENTRY(pos, AT_PHNUM, args->phnum); | AUXARGS_ENTRY(pos, AT_PHNUM, args->phnum); | ||||
Show All 27 Lines | __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, u_long *base) | ||||
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_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, auxbase, sizeof(*argarray) * AT_COUNT); | auxlen = sizeof(*argarray) * (pos - argarray); | ||||
*base -= auxlen; | |||||
copyout(argarray, (void *)*base, auxlen); | |||||
free(argarray, M_TEMP); | free(argarray, M_TEMP); | ||||
if (error != 0) | } | ||||
return (error); | |||||
int | |||||
__elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp) | |||||
{ | |||||
Elf_Addr *base; | |||||
base = (Elf_Addr *)*stack_base; | |||||
base--; | base--; | ||||
if (suword(base, imgp->args->argc) == -1) | if (suword(base, imgp->args->argc) == -1) | ||||
return (EFAULT); | return (EFAULT); | ||||
*stack_base = (register_t *)base; | *stack_base = (register_t *)base; | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 1,373 Lines • Show Last 20 Lines |