syscall.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  3. * Licensed under the GPL
  4. */
  5. #include "linux/file.h"
  6. #include "linux/fs.h"
  7. #include "linux/mm.h"
  8. #include "linux/sched.h"
  9. #include "linux/utsname.h"
  10. #include "linux/syscalls.h"
  11. #include "asm/current.h"
  12. #include "asm/mman.h"
  13. #include "asm/uaccess.h"
  14. #include "asm/unistd.h"
  15. #include "internal.h"
  16. long sys_fork(void)
  17. {
  18. long ret;
  19. current->thread.forking = 1;
  20. ret = do_fork(SIGCHLD, UPT_SP(&current->thread.regs.regs),
  21. &current->thread.regs, 0, NULL, NULL);
  22. current->thread.forking = 0;
  23. return ret;
  24. }
  25. long sys_vfork(void)
  26. {
  27. long ret;
  28. current->thread.forking = 1;
  29. ret = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
  30. UPT_SP(&current->thread.regs.regs),
  31. &current->thread.regs, 0, NULL, NULL);
  32. current->thread.forking = 0;
  33. return ret;
  34. }
  35. long old_mmap(unsigned long addr, unsigned long len,
  36. unsigned long prot, unsigned long flags,
  37. unsigned long fd, unsigned long offset)
  38. {
  39. long err = -EINVAL;
  40. if (offset & ~PAGE_MASK)
  41. goto out;
  42. err = sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
  43. out:
  44. return err;
  45. }
  46. long sys_uname(struct old_utsname __user * name)
  47. {
  48. long err;
  49. if (!name)
  50. return -EFAULT;
  51. down_read(&uts_sem);
  52. err = copy_to_user(name, utsname(), sizeof (*name));
  53. up_read(&uts_sem);
  54. return err?-EFAULT:0;
  55. }
  56. long sys_olduname(struct oldold_utsname __user * name)
  57. {
  58. long error;
  59. if (!name)
  60. return -EFAULT;
  61. if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname)))
  62. return -EFAULT;
  63. down_read(&uts_sem);
  64. error = __copy_to_user(&name->sysname, &utsname()->sysname,
  65. __OLD_UTS_LEN);
  66. error |= __put_user(0, name->sysname + __OLD_UTS_LEN);
  67. error |= __copy_to_user(&name->nodename, &utsname()->nodename,
  68. __OLD_UTS_LEN);
  69. error |= __put_user(0, name->nodename + __OLD_UTS_LEN);
  70. error |= __copy_to_user(&name->release, &utsname()->release,
  71. __OLD_UTS_LEN);
  72. error |= __put_user(0, name->release + __OLD_UTS_LEN);
  73. error |= __copy_to_user(&name->version, &utsname()->version,
  74. __OLD_UTS_LEN);
  75. error |= __put_user(0, name->version + __OLD_UTS_LEN);
  76. error |= __copy_to_user(&name->machine, &utsname()->machine,
  77. __OLD_UTS_LEN);
  78. error |= __put_user(0, name->machine + __OLD_UTS_LEN);
  79. up_read(&uts_sem);
  80. error = error ? -EFAULT : 0;
  81. return error;
  82. }
  83. int kernel_execve(const char *filename, char *const argv[], char *const envp[])
  84. {
  85. mm_segment_t fs;
  86. int ret;
  87. fs = get_fs();
  88. set_fs(KERNEL_DS);
  89. ret = um_execve((char *)filename, (char __user *__user *)argv,
  90. (char __user *__user *) envp);
  91. set_fs(fs);
  92. return ret;
  93. }