syscall_wrapper.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * syscall_wrapper.h - s390 specific wrappers to syscall definitions
  4. *
  5. */
  6. #ifndef _ASM_S390_SYSCALL_WRAPPER_H
  7. #define _ASM_S390_SYSCALL_WRAPPER_H
  8. #define __SC_TYPE(t, a) t
  9. #define SYSCALL_PT_ARG6(regs, m, t1, t2, t3, t4, t5, t6)\
  10. SYSCALL_PT_ARG5(regs, m, t1, t2, t3, t4, t5), \
  11. m(t6, (regs->gprs[7]))
  12. #define SYSCALL_PT_ARG5(regs, m, t1, t2, t3, t4, t5) \
  13. SYSCALL_PT_ARG4(regs, m, t1, t2, t3, t4), \
  14. m(t5, (regs->gprs[6]))
  15. #define SYSCALL_PT_ARG4(regs, m, t1, t2, t3, t4) \
  16. SYSCALL_PT_ARG3(regs, m, t1, t2, t3), \
  17. m(t4, (regs->gprs[5]))
  18. #define SYSCALL_PT_ARG3(regs, m, t1, t2, t3) \
  19. SYSCALL_PT_ARG2(regs, m, t1, t2), \
  20. m(t3, (regs->gprs[4]))
  21. #define SYSCALL_PT_ARG2(regs, m, t1, t2) \
  22. SYSCALL_PT_ARG1(regs, m, t1), \
  23. m(t2, (regs->gprs[3]))
  24. #define SYSCALL_PT_ARG1(regs, m, t1) \
  25. m(t1, (regs->orig_gpr2))
  26. #define SYSCALL_PT_ARGS(x, ...) SYSCALL_PT_ARG##x(__VA_ARGS__)
  27. #ifdef CONFIG_COMPAT
  28. #define __SC_COMPAT_TYPE(t, a) \
  29. __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a
  30. #define __SC_COMPAT_CAST(t, a) \
  31. ({ \
  32. long __ReS = a; \
  33. \
  34. BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \
  35. !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t) && \
  36. !__TYPE_IS_LL(t)); \
  37. if (__TYPE_IS_L(t)) \
  38. __ReS = (s32)a; \
  39. if (__TYPE_IS_UL(t)) \
  40. __ReS = (u32)a; \
  41. if (__TYPE_IS_PTR(t)) \
  42. __ReS = a & 0x7fffffff; \
  43. if (__TYPE_IS_LL(t)) \
  44. return -ENOSYS; \
  45. (t)__ReS; \
  46. })
  47. #define __S390_SYS_STUBx(x, name, ...) \
  48. long __s390_sys##name(struct pt_regs *regs); \
  49. ALLOW_ERROR_INJECTION(__s390_sys##name, ERRNO); \
  50. long __s390_sys##name(struct pt_regs *regs) \
  51. { \
  52. long ret = __do_sys##name(SYSCALL_PT_ARGS(x, regs, \
  53. __SC_COMPAT_CAST, __MAP(x, __SC_TYPE, __VA_ARGS__))); \
  54. __MAP(x,__SC_TEST,__VA_ARGS__); \
  55. return ret; \
  56. }
  57. /*
  58. * To keep the naming coherent, re-define SYSCALL_DEFINE0 to create an alias
  59. * named __s390x_sys_*()
  60. */
  61. #define COMPAT_SYSCALL_DEFINE0(sname) \
  62. SYSCALL_METADATA(_##sname, 0); \
  63. long __s390_compat_sys_##sname(void); \
  64. ALLOW_ERROR_INJECTION(__s390_compat_sys_##sname, ERRNO); \
  65. long __s390_compat_sys_##sname(void)
  66. #define SYSCALL_DEFINE0(sname) \
  67. SYSCALL_METADATA(_##sname, 0); \
  68. long __s390x_sys_##sname(void); \
  69. ALLOW_ERROR_INJECTION(__s390x_sys_##sname, ERRNO); \
  70. long __s390_sys_##sname(void) \
  71. __attribute__((alias(__stringify(__s390x_sys_##sname)))); \
  72. long __s390x_sys_##sname(void)
  73. #define COND_SYSCALL(name) \
  74. cond_syscall(__s390x_sys_##name); \
  75. cond_syscall(__s390_sys_##name)
  76. #define SYS_NI(name) \
  77. SYSCALL_ALIAS(__s390x_sys_##name, sys_ni_posix_timers); \
  78. SYSCALL_ALIAS(__s390_sys_##name, sys_ni_posix_timers)
  79. #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
  80. __diag_push(); \
  81. __diag_ignore(GCC, 8, "-Wattribute-alias", \
  82. "Type aliasing is used to sanitize syscall arguments"); \
  83. long __s390_compat_sys##name(struct pt_regs *regs); \
  84. long __s390_compat_sys##name(struct pt_regs *regs) \
  85. __attribute__((alias(__stringify(__se_compat_sys##name)))); \
  86. ALLOW_ERROR_INJECTION(__s390_compat_sys##name, ERRNO); \
  87. static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
  88. long __se_compat_sys##name(struct pt_regs *regs); \
  89. long __se_compat_sys##name(struct pt_regs *regs) \
  90. { \
  91. long ret = __do_compat_sys##name(SYSCALL_PT_ARGS(x, regs, __SC_DELOUSE, \
  92. __MAP(x, __SC_TYPE, __VA_ARGS__))); \
  93. __MAP(x,__SC_TEST,__VA_ARGS__); \
  94. return ret; \
  95. } \
  96. __diag_pop(); \
  97. static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
  98. /*
  99. * As some compat syscalls may not be implemented, we need to expand
  100. * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in
  101. * kernel/time/posix-stubs.c to cover this case as well.
  102. */
  103. #define COND_SYSCALL_COMPAT(name) \
  104. cond_syscall(__s390_compat_sys_##name)
  105. #define COMPAT_SYS_NI(name) \
  106. SYSCALL_ALIAS(__s390_compat_sys_##name, sys_ni_posix_timers)
  107. #else /* CONFIG_COMPAT */
  108. #define __S390_SYS_STUBx(x, fullname, name, ...)
  109. #define SYSCALL_DEFINE0(sname) \
  110. SYSCALL_METADATA(_##sname, 0); \
  111. long __s390x_sys_##sname(void); \
  112. ALLOW_ERROR_INJECTION(__s390x_sys_##sname, ERRNO); \
  113. long __s390x_sys_##sname(void)
  114. #define COND_SYSCALL(name) \
  115. cond_syscall(__s390x_sys_##name)
  116. #define SYS_NI(name) \
  117. SYSCALL_ALIAS(__s390x_sys_##name, sys_ni_posix_timers);
  118. #endif /* CONFIG_COMPAT */
  119. #define __SYSCALL_DEFINEx(x, name, ...) \
  120. __diag_push(); \
  121. __diag_ignore(GCC, 8, "-Wattribute-alias", \
  122. "Type aliasing is used to sanitize syscall arguments"); \
  123. long __s390x_sys##name(struct pt_regs *regs) \
  124. __attribute__((alias(__stringify(__se_sys##name)))); \
  125. ALLOW_ERROR_INJECTION(__s390x_sys##name, ERRNO); \
  126. static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
  127. long __se_sys##name(struct pt_regs *regs); \
  128. __S390_SYS_STUBx(x, name, __VA_ARGS__) \
  129. long __se_sys##name(struct pt_regs *regs) \
  130. { \
  131. long ret = __do_sys##name(SYSCALL_PT_ARGS(x, regs, \
  132. __SC_CAST, __MAP(x, __SC_TYPE, __VA_ARGS__))); \
  133. __MAP(x,__SC_TEST,__VA_ARGS__); \
  134. return ret; \
  135. } \
  136. __diag_pop(); \
  137. static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
  138. #endif /* _ASM_S390_SYSCALL_WRAPPER_H */