mm: variable length argument support
[linux-2.6.git] / arch / ia64 / ia32 / binfmt_elf32.c
index 6f4d3d0..e1189ba 100644 (file)
@@ -195,62 +195,27 @@ ia64_elf32_init (struct pt_regs *regs)
        ia32_load_state(current);
 }
 
+/*
+ * Undo the override of setup_arg_pages() without this ia32_setup_arg_pages()
+ * will suffer infinite self recursion.
+ */
+#undef setup_arg_pages
+
 int
 ia32_setup_arg_pages (struct linux_binprm *bprm, int executable_stack)
 {
-       unsigned long stack_base;
-       struct vm_area_struct *mpnt;
-       struct mm_struct *mm = current->mm;
-       int i, ret;
-
-       stack_base = IA32_STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
-       mm->arg_start = bprm->p + stack_base;
-
-       bprm->p += stack_base;
-       if (bprm->loader)
-               bprm->loader += stack_base;
-       bprm->exec += stack_base;
-
-       mpnt = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
-       if (!mpnt)
-               return -ENOMEM;
-
-       down_write(&current->mm->mmap_sem);
-       {
-               mpnt->vm_mm = current->mm;
-               mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
-               mpnt->vm_end = IA32_STACK_TOP;
-               if (executable_stack == EXSTACK_ENABLE_X)
-                       mpnt->vm_flags = VM_STACK_FLAGS |  VM_EXEC;
-               else if (executable_stack == EXSTACK_DISABLE_X)
-                       mpnt->vm_flags = VM_STACK_FLAGS & ~VM_EXEC;
-               else
-                       mpnt->vm_flags = VM_STACK_FLAGS;
-               mpnt->vm_page_prot = (mpnt->vm_flags & VM_EXEC)?
-                                       PAGE_COPY_EXEC: PAGE_COPY;
-               if ((ret = insert_vm_struct(current->mm, mpnt))) {
-                       up_write(&current->mm->mmap_sem);
-                       kmem_cache_free(vm_area_cachep, mpnt);
-                       return ret;
-               }
-               current->mm->stack_vm = current->mm->total_vm = vma_pages(mpnt);
+       int ret;
+
+       ret = setup_arg_pages(bprm, IA32_STACK_TOP, executable_stack);
+       if (!ret) {
+               /*
+                * Can't do it in ia64_elf32_init(). Needs to be done before
+                * calls to elf32_map()
+                */
+               current->thread.ppl = ia32_init_pp_list();
        }
 
-       for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
-               struct page *page = bprm->page[i];
-               if (page) {
-                       bprm->page[i] = NULL;
-                       install_arg_page(mpnt, page, stack_base);
-               }
-               stack_base += PAGE_SIZE;
-       }
-       up_write(&current->mm->mmap_sem);
-
-       /* Can't do it in ia64_elf32_init(). Needs to be done before calls to
-          elf32_map() */
-       current->thread.ppl = ia32_init_pp_list();
-
-       return 0;
+       return ret;
 }
 
 static void