sys_s390.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * S390 version
  3. * Copyright IBM Corp. 1999, 2000
  4. * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
  5. * Thomas Spatzier (tspat@de.ibm.com)
  6. *
  7. * Derived from "arch/i386/kernel/sys_i386.c"
  8. *
  9. * This file contains various random system calls that
  10. * have a non-standard calling sequence on the Linux/s390
  11. * platform.
  12. */
  13. #include <linux/errno.h>
  14. #include <linux/sched.h>
  15. #include <linux/mm.h>
  16. #include <linux/fs.h>
  17. #include <linux/smp.h>
  18. #include <linux/sem.h>
  19. #include <linux/msg.h>
  20. #include <linux/shm.h>
  21. #include <linux/stat.h>
  22. #include <linux/syscalls.h>
  23. #include <linux/mman.h>
  24. #include <linux/file.h>
  25. #include <linux/utsname.h>
  26. #include <linux/personality.h>
  27. #include <linux/unistd.h>
  28. #include <linux/ipc.h>
  29. #include <asm/uaccess.h>
  30. #include "entry.h"
  31. /*
  32. * Perform the mmap() system call. Linux for S/390 isn't able to handle more
  33. * than 5 system call parameters, so this system call uses a memory block
  34. * for parameter passing.
  35. */
  36. struct s390_mmap_arg_struct {
  37. unsigned long addr;
  38. unsigned long len;
  39. unsigned long prot;
  40. unsigned long flags;
  41. unsigned long fd;
  42. unsigned long offset;
  43. };
  44. SYSCALL_DEFINE1(mmap2, struct s390_mmap_arg_struct __user *, arg)
  45. {
  46. struct s390_mmap_arg_struct a;
  47. int error = -EFAULT;
  48. if (copy_from_user(&a, arg, sizeof(a)))
  49. goto out;
  50. error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
  51. out:
  52. return error;
  53. }
  54. /*
  55. * sys_ipc() is the de-multiplexer for the SysV IPC calls.
  56. */
  57. SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, unsigned long, second,
  58. unsigned long, third, void __user *, ptr)
  59. {
  60. if (call >> 16)
  61. return -EINVAL;
  62. /* The s390 sys_ipc variant has only five parameters instead of six
  63. * like the generic variant. The only difference is the handling of
  64. * the SEMTIMEDOP subcall where on s390 the third parameter is used
  65. * as a pointer to a struct timespec where the generic variant uses
  66. * the fifth parameter.
  67. * Therefore we can call the generic variant by simply passing the
  68. * third parameter also as fifth parameter.
  69. */
  70. return sys_ipc(call, first, second, third, ptr, third);
  71. }
  72. SYSCALL_DEFINE1(s390_personality, unsigned int, personality)
  73. {
  74. unsigned int ret;
  75. if (personality(current->personality) == PER_LINUX32 &&
  76. personality(personality) == PER_LINUX)
  77. personality |= PER_LINUX32;
  78. ret = sys_personality(personality);
  79. if (personality(ret) == PER_LINUX32)
  80. ret &= ~PER_LINUX32;
  81. return ret;
  82. }