binfmt_flat: use generic transfer_args_to_stack()
This gets rid of the rather ugly, open coded and suboptimal copy code. Signed-off-by: Nicolas Pitre <nico@linaro.org> Reviewed-by: Greg Ungerer <gerg@linux-m68k.org> Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
This commit is contained in:
parent
7e7ec6a934
commit
687fd7738e
|
@ -846,10 +846,8 @@ static int load_flat_binary(struct linux_binprm *bprm)
|
||||||
{
|
{
|
||||||
struct lib_info libinfo;
|
struct lib_info libinfo;
|
||||||
struct pt_regs *regs = current_pt_regs();
|
struct pt_regs *regs = current_pt_regs();
|
||||||
unsigned long p = bprm->p;
|
unsigned long sp, stack_len;
|
||||||
unsigned long stack_len;
|
|
||||||
unsigned long start_addr;
|
unsigned long start_addr;
|
||||||
unsigned long *sp;
|
|
||||||
int res;
|
int res;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
@ -884,15 +882,15 @@ static int load_flat_binary(struct linux_binprm *bprm)
|
||||||
|
|
||||||
set_binfmt(&flat_format);
|
set_binfmt(&flat_format);
|
||||||
|
|
||||||
p = ((current->mm->context.end_brk + stack_len + 3) & ~3) - 4;
|
sp = ((current->mm->context.end_brk + stack_len + 3) & ~3) - 4;
|
||||||
pr_debug("p=%lx\n", p);
|
pr_debug("sp=%lx\n", sp);
|
||||||
|
|
||||||
/* copy the arg pages onto the stack, this could be more efficient :-) */
|
/* copy the arg pages onto the stack */
|
||||||
for (i = TOP_OF_ARGS - 1; i >= bprm->p; i--)
|
res = transfer_args_to_stack(bprm, &sp);
|
||||||
*(char *) --p =
|
if (res)
|
||||||
((char *) page_address(bprm->page[i/PAGE_SIZE]))[i % PAGE_SIZE];
|
return res;
|
||||||
|
|
||||||
sp = (unsigned long *) create_flat_tables(p, bprm);
|
sp = create_flat_tables(sp, bprm);
|
||||||
|
|
||||||
/* Fake some return addresses to ensure the call chain will
|
/* Fake some return addresses to ensure the call chain will
|
||||||
* initialise library in order for us. We are required to call
|
* initialise library in order for us. We are required to call
|
||||||
|
@ -904,14 +902,14 @@ static int load_flat_binary(struct linux_binprm *bprm)
|
||||||
for (i = MAX_SHARED_LIBS-1; i > 0; i--) {
|
for (i = MAX_SHARED_LIBS-1; i > 0; i--) {
|
||||||
if (libinfo.lib_list[i].loaded) {
|
if (libinfo.lib_list[i].loaded) {
|
||||||
/* Push previos first to call address */
|
/* Push previos first to call address */
|
||||||
--sp; put_user(start_addr, sp);
|
--sp; put_user(start_addr, (unsigned long *)sp);
|
||||||
start_addr = libinfo.lib_list[i].entry;
|
start_addr = libinfo.lib_list[i].entry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Stash our initial stack pointer into the mm structure */
|
/* Stash our initial stack pointer into the mm structure */
|
||||||
current->mm->start_stack = (unsigned long)sp;
|
current->mm->start_stack = sp;
|
||||||
|
|
||||||
#ifdef FLAT_PLAT_INIT
|
#ifdef FLAT_PLAT_INIT
|
||||||
FLAT_PLAT_INIT(regs);
|
FLAT_PLAT_INIT(regs);
|
||||||
|
|
Loading…
Reference in New Issue