sys_i386_32.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * This file contains various random system calls that
  3. * have a non-standard calling sequence on the Linux/i386
  4. * platform.
  5. */
  6. #include <linux/errno.h>
  7. #include <linux/sched.h>
  8. #include <linux/mm.h>
  9. #include <linux/fs.h>
  10. #include <linux/smp.h>
  11. #include <linux/sem.h>
  12. #include <linux/msg.h>
  13. #include <linux/shm.h>
  14. #include <linux/stat.h>
  15. #include <linux/syscalls.h>
  16. #include <linux/mman.h>
  17. #include <linux/file.h>
  18. #include <linux/utsname.h>
  19. #include <linux/ipc.h>
  20. #include <linux/uaccess.h>
  21. #include <linux/unistd.h>
  22. #include <asm/syscalls.h>
  23. /*
  24. * Old cruft
  25. */
  26. asmlinkage int sys_uname(struct old_utsname __user *name)
  27. {
  28. int err;
  29. if (!name)
  30. return -EFAULT;
  31. down_read(&uts_sem);
  32. err = copy_to_user(name, utsname(), sizeof(*name));
  33. up_read(&uts_sem);
  34. return err? -EFAULT:0;
  35. }
  36. asmlinkage int sys_olduname(struct oldold_utsname __user *name)
  37. {
  38. int error;
  39. if (!name)
  40. return -EFAULT;
  41. if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname)))
  42. return -EFAULT;
  43. down_read(&uts_sem);
  44. error = __copy_to_user(&name->sysname, &utsname()->sysname,
  45. __OLD_UTS_LEN);
  46. error |= __put_user(0, name->sysname + __OLD_UTS_LEN);
  47. error |= __copy_to_user(&name->nodename, &utsname()->nodename,
  48. __OLD_UTS_LEN);
  49. error |= __put_user(0, name->nodename + __OLD_UTS_LEN);
  50. error |= __copy_to_user(&name->release, &utsname()->release,
  51. __OLD_UTS_LEN);
  52. error |= __put_user(0, name->release + __OLD_UTS_LEN);
  53. error |= __copy_to_user(&name->version, &utsname()->version,
  54. __OLD_UTS_LEN);
  55. error |= __put_user(0, name->version + __OLD_UTS_LEN);
  56. error |= __copy_to_user(&name->machine, &utsname()->machine,
  57. __OLD_UTS_LEN);
  58. error |= __put_user(0, name->machine + __OLD_UTS_LEN);
  59. up_read(&uts_sem);
  60. error = error ? -EFAULT : 0;
  61. return error;
  62. }
  63. /*
  64. * Do a system call from kernel instead of calling sys_execve so we
  65. * end up with proper pt_regs.
  66. */
  67. int kernel_execve(const char *filename, char *const argv[], char *const envp[])
  68. {
  69. long __res;
  70. asm volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
  71. : "=a" (__res)
  72. : "0" (__NR_execve), "ri" (filename), "c" (argv), "d" (envp) : "memory");
  73. return __res;
  74. }