mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
Pull m68knommu updates from Greg Ungerer: "This series is all about Nicolas flat format support for MMU systems. Traditional m68k no-MMU flat format binaries can now be run on m68k MMU enabled systems too. The series includes some nice cleanups of the binfmt_flat code and converts it to using proper user space accessor functions. With all this in place you can boot and run a complete no-MMU flat format based user space on an MMU enabled system" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu: m68k: enable binfmt_flat on systems with an MMU binfmt_flat: allow compressed flat binary format to work on MMU systems binfmt_flat: add MMU-specific support binfmt_flat: update libraries' data segment pointer with userspace accessors binfmt_flat: use clear_user() rather than memset() to clear .bss binfmt_flat: use proper user space accessors with old relocs code binfmt_flat: use proper user space accessors with relocs processing code binfmt_flat: clean up create_flat_tables() and stack accesses binfmt_flat: use generic transfer_args_to_stack() elf_fdpic_transfer_args_to_stack(): make it generic binfmt_flat: prevent kernel dammage from corrupted executable headers binfmt_flat: convert printk invocations to their modern form binfmt_flat: assorted cleanups m68k: use same start_thread() on MMU and no-MMU m68k: fix file path comment m68k: fix bFLT executable running on MMU enabled systems
This commit is contained in:
commit
8e7106a607
7 changed files with 340 additions and 281 deletions
33
fs/exec.c
33
fs/exec.c
|
@ -762,6 +762,39 @@ out_unlock:
|
|||
}
|
||||
EXPORT_SYMBOL(setup_arg_pages);
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Transfer the program arguments and environment from the holding pages
|
||||
* onto the stack. The provided stack pointer is adjusted accordingly.
|
||||
*/
|
||||
int transfer_args_to_stack(struct linux_binprm *bprm,
|
||||
unsigned long *sp_location)
|
||||
{
|
||||
unsigned long index, stop, sp;
|
||||
int ret = 0;
|
||||
|
||||
stop = bprm->p >> PAGE_SHIFT;
|
||||
sp = *sp_location;
|
||||
|
||||
for (index = MAX_ARG_PAGES - 1; index >= stop; index--) {
|
||||
unsigned int offset = index == stop ? bprm->p & ~PAGE_MASK : 0;
|
||||
char *src = kmap(bprm->page[index]) + offset;
|
||||
sp -= PAGE_SIZE - offset;
|
||||
if (copy_to_user((void *) sp, src, PAGE_SIZE - offset) != 0)
|
||||
ret = -EFAULT;
|
||||
kunmap(bprm->page[index]);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
*sp_location = sp;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(transfer_args_to_stack);
|
||||
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
static struct file *do_open_execat(int fd, struct filename *name, int flags)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue