2 * Support for 32-bit Linux for S390 ELF binaries.
4 * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
5 * Author(s): Gerhard Tonn (ton@de.ibm.com)
7 * Separated from binfmt_elf32.c to reduce exports for module enablement.
11 #include <linux/config.h>
12 #include <linux/slab.h>
13 #include <linux/file.h>
14 #include <linux/mman.h>
15 #include <linux/a.out.h>
16 #include <linux/stat.h>
17 #include <linux/fcntl.h>
18 #include <linux/smp_lock.h>
19 #include <linux/init.h>
20 #include <linux/pagemap.h>
22 #include <linux/highmem.h>
23 #include <linux/spinlock.h>
24 #include <linux/binfmts.h>
25 #include <linux/module.h>
26 #include <linux/security.h>
28 #include <asm/uaccess.h>
29 #include <asm/pgalloc.h>
30 #include <asm/mmu_context.h>
33 #include <linux/kmod.h>
38 #define STACK_TOP TASK31_SIZE
40 int setup_arg_pages32(struct linux_binprm *bprm, int executable_stack)
42 unsigned long stack_base;
43 struct vm_area_struct *mpnt;
44 struct mm_struct *mm = current->mm;
47 stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
48 mm->arg_start = bprm->p + stack_base;
50 bprm->p += stack_base;
52 bprm->loader += stack_base;
53 bprm->exec += stack_base;
55 mpnt = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
59 if (security_vm_enough_memory((STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p))>>PAGE_SHIFT)) {
60 kmem_cache_free(vm_area_cachep, mpnt);
64 down_write(&mm->mmap_sem);
67 mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
68 mpnt->vm_end = STACK_TOP;
69 /* executable stack setting would be applied here */
70 mpnt->vm_page_prot = PAGE_COPY;
71 mpnt->vm_flags = VM_STACK_FLAGS;
75 INIT_LIST_HEAD(&mpnt->shared);
76 mpnt->vm_private_data = (void *) 0;
77 insert_vm_struct(mm, mpnt);
78 mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
81 for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
82 struct page *page = bprm->page[i];
85 put_dirty_page(current,page,stack_base,PAGE_COPY);
87 stack_base += PAGE_SIZE;
89 up_write(&mm->mmap_sem);
94 EXPORT_SYMBOL(setup_arg_pages32);