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 pt_regs *regs = current_pt_regs();
|
||||
unsigned long p = bprm->p;
|
||||
unsigned long stack_len;
|
||||
unsigned long sp, stack_len;
|
||||
unsigned long start_addr;
|
||||
unsigned long *sp;
|
||||
int res;
|
||||
int i, j;
|
||||
|
||||
|
@ -884,15 +882,15 @@ static int load_flat_binary(struct linux_binprm *bprm)
|
|||
|
||||
set_binfmt(&flat_format);
|
||||
|
||||
p = ((current->mm->context.end_brk + stack_len + 3) & ~3) - 4;
|
||||
pr_debug("p=%lx\n", p);
|
||||
sp = ((current->mm->context.end_brk + stack_len + 3) & ~3) - 4;
|
||||
pr_debug("sp=%lx\n", sp);
|
||||
|
||||
/* copy the arg pages onto the stack, this could be more efficient :-) */
|
||||
for (i = TOP_OF_ARGS - 1; i >= bprm->p; i--)
|
||||
*(char *) --p =
|
||||
((char *) page_address(bprm->page[i/PAGE_SIZE]))[i % PAGE_SIZE];
|
||||
/* copy the arg pages onto the stack */
|
||||
res = transfer_args_to_stack(bprm, &sp);
|
||||
if (res)
|
||||
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
|
||||
* 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--) {
|
||||
if (libinfo.lib_list[i].loaded) {
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 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
|
||||
FLAT_PLAT_INIT(regs);
|
||||
|
|
Loading…
Reference in New Issue