exec32.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Support for 32-bit Linux for S390 ELF binaries.
  3.  *
  4.  * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
  5.  * Author(s): Gerhard Tonn (ton@de.ibm.com)
  6.  *
  7.  * Seperated from binfmt_elf32.c to reduce exports for module enablement.
  8.  *
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/slab.h>
  12. #include <linux/file.h>
  13. #include <linux/mman.h>
  14. #include <linux/a.out.h>
  15. #include <linux/stat.h>
  16. #include <linux/fcntl.h>
  17. #include <linux/smp_lock.h>
  18. #include <linux/init.h>
  19. #include <linux/pagemap.h>
  20. #include <linux/highmem.h>
  21. #include <linux/spinlock.h>
  22. #define __NO_VERSION__
  23. #include <linux/module.h>
  24. #include <asm/uaccess.h>
  25. #include <asm/pgalloc.h>
  26. #include <asm/mmu_context.h>
  27. #ifdef CONFIG_KMOD
  28. #include <linux/kmod.h>
  29. #endif
  30. extern void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long address);
  31. #undef STACK_TOP
  32. #define STACK_TOP TASK31_SIZE
  33. int setup_arg_pages32(struct linux_binprm *bprm)
  34. {
  35. unsigned long stack_base;
  36. struct vm_area_struct *mpnt;
  37. int i;
  38. stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
  39. bprm->p += stack_base;
  40. if (bprm->loader)
  41. bprm->loader += stack_base;
  42. bprm->exec += stack_base;
  43. mpnt = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
  44. if (!mpnt) 
  45. return -ENOMEM; 
  46. down_write(&current->mm->mmap_sem);
  47. {
  48. mpnt->vm_mm = current->mm;
  49. mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
  50. mpnt->vm_end = STACK_TOP;
  51. mpnt->vm_page_prot = PAGE_COPY;
  52. mpnt->vm_flags = VM_STACK_FLAGS;
  53. mpnt->vm_ops = NULL;
  54. mpnt->vm_pgoff = 0;
  55. mpnt->vm_file = NULL;
  56. mpnt->vm_private_data = (void *) 0;
  57. insert_vm_struct(current->mm, mpnt);
  58. current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
  59. for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
  60. struct page *page = bprm->page[i];
  61. if (page) {
  62. bprm->page[i] = NULL;
  63. put_dirty_page(current,page,stack_base);
  64. }
  65. stack_base += PAGE_SIZE;
  66. }
  67. up_write(&current->mm->mmap_sem);
  68. return 0;
  69. }
  70. EXPORT_SYMBOL(setup_arg_pages32);