compat.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. #ifndef __ASM_COMPAT_H
  3. #define __ASM_COMPAT_H
  4. #define compat_mode_t compat_mode_t
  5. typedef u16 compat_mode_t;
  6. /*
  7. * Architecture specific compatibility types
  8. */
  9. #include <linux/types.h>
  10. #include <linux/sched.h>
  11. #include <linux/sched/task_stack.h>
  12. #include <asm-generic/compat.h>
  13. #define COMPAT_USER_HZ 100
  14. #define COMPAT_UTS_MACHINE "riscv\0\0"
  15. #define _COMPAT_NSIG _NSIG
  16. #define _COMPAT_NSIG_BPW 32
  17. typedef compat_uint_t __compat_uid_t;
  18. typedef compat_uint_t __compat_gid_t;
  19. typedef compat_uint_t __compat_uid32_t;
  20. typedef compat_uint_t __compat_gid32_t;
  21. typedef compat_uint_t compat_dev_t;
  22. typedef compat_int_t compat_ipc_pid_t;
  23. typedef u32 compat_sigset_word;
  24. typedef u32 compat_caddr_t;
  25. struct compat_stat {
  26. compat_ulong_t st_dev;
  27. compat_ulong_t st_ino;
  28. compat_uint_t st_mode;
  29. compat_uint_t st_nlink;
  30. compat_uint_t st_uid;
  31. compat_uint_t st_gid;
  32. compat_ulong_t st_rdev;
  33. compat_ulong_t __pad1;
  34. compat_long_t st_size;
  35. compat_int_t st_blksize;
  36. compat_int_t __pad2;
  37. compat_long_t st_blocks;
  38. compat_long_t st_atime;
  39. compat_ulong_t st_atime_nsec;
  40. compat_long_t st_mtime;
  41. compat_ulong_t st_mtime_nsec;
  42. compat_long_t st_ctime;
  43. compat_ulong_t st_ctime_nsec;
  44. compat_uint_t __unused4;
  45. compat_uint_t __unused5;
  46. };
  47. struct compat_flock {
  48. compat_short_t l_type;
  49. compat_short_t l_whence;
  50. compat_off_t l_start;
  51. compat_off_t l_len;
  52. compat_pid_t l_pid;
  53. /* No __ARCH_FLOCK_PAD in riscv */
  54. };
  55. #define F_GETLK64 12
  56. #define F_SETLK64 13
  57. #define F_SETLKW64 14
  58. struct compat_flock64 {
  59. compat_short_t l_type;
  60. compat_short_t l_whence;
  61. compat_loff_t l_start;
  62. compat_loff_t l_len;
  63. compat_pid_t l_pid;
  64. /* No __ARCH_FLOCK64_PAD in riscv */
  65. };
  66. struct compat_statfs {
  67. compat_uint_t f_type;
  68. compat_uint_t f_bsize;
  69. compat_uint_t f_blocks;
  70. compat_uint_t f_bfree;
  71. compat_uint_t f_bavail;
  72. compat_uint_t f_files;
  73. compat_uint_t f_ffree;
  74. __kernel_fsid_t f_fsid;
  75. compat_uint_t f_namelen;
  76. compat_uint_t f_frsize;
  77. compat_uint_t f_flags;
  78. compat_uint_t f_spare[4];
  79. };
  80. #define COMPAT_RLIM_INFINITY 0x7fffffff
  81. #define COMPAT_OFF_T_MAX COMPAT_RLIM_INFINITY
  82. #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current)))
  83. static inline void __user *arch_compat_alloc_user_space(long len)
  84. {
  85. return (void __user *)compat_user_stack_pointer() - len;
  86. }
  87. struct compat_ipc64_perm {
  88. compat_key_t key;
  89. __compat_uid32_t uid;
  90. __compat_gid32_t gid;
  91. __compat_uid32_t cuid;
  92. __compat_gid32_t cgid;
  93. compat_mode_t mode;
  94. unsigned char __pad1[4 - sizeof(compat_mode_t)];
  95. compat_ushort_t seq;
  96. compat_ushort_t __pad2;
  97. compat_ulong_t unused1;
  98. compat_ulong_t unused2;
  99. };
  100. struct compat_semid64_ds {
  101. struct compat_ipc64_perm sem_perm;
  102. compat_ulong_t sem_otime;
  103. compat_ulong_t sem_otime_high;
  104. compat_ulong_t sem_ctime;
  105. compat_ulong_t sem_ctime_high;
  106. compat_ulong_t sem_nsems;
  107. compat_ulong_t __unused3;
  108. compat_ulong_t __unused4;
  109. };
  110. struct compat_msqid64_ds {
  111. struct compat_ipc64_perm msg_perm;
  112. compat_ulong_t msg_stime;
  113. compat_ulong_t msg_stime_high;
  114. compat_ulong_t msg_rtime;
  115. compat_ulong_t msg_rtime_high;
  116. compat_ulong_t msg_ctime;
  117. compat_ulong_t msg_ctime_high;
  118. compat_ulong_t msg_cbytes;
  119. compat_ulong_t msg_qnum;
  120. compat_ulong_t msg_qbytes;
  121. compat_pid_t msg_lspid;
  122. compat_pid_t msg_lrpid;
  123. compat_ulong_t __unused4;
  124. compat_ulong_t __unused5;
  125. };
  126. struct compat_shmid64_ds {
  127. struct compat_ipc64_perm shm_perm;
  128. compat_size_t shm_segsz;
  129. compat_ulong_t shm_atime;
  130. compat_ulong_t shm_atime_high;
  131. compat_ulong_t shm_dtime;
  132. compat_ulong_t shm_dtime_high;
  133. compat_ulong_t shm_ctime;
  134. compat_ulong_t shm_ctime_high;
  135. compat_pid_t shm_cpid;
  136. compat_pid_t shm_lpid;
  137. compat_ulong_t shm_nattch;
  138. compat_ulong_t __unused4;
  139. compat_ulong_t __unused5;
  140. };
  141. static inline int is_compat_task(void)
  142. {
  143. return test_thread_flag(TIF_32BIT);
  144. }
  145. struct compat_user_regs_struct {
  146. compat_ulong_t pc;
  147. compat_ulong_t ra;
  148. compat_ulong_t sp;
  149. compat_ulong_t gp;
  150. compat_ulong_t tp;
  151. compat_ulong_t t0;
  152. compat_ulong_t t1;
  153. compat_ulong_t t2;
  154. compat_ulong_t s0;
  155. compat_ulong_t s1;
  156. compat_ulong_t a0;
  157. compat_ulong_t a1;
  158. compat_ulong_t a2;
  159. compat_ulong_t a3;
  160. compat_ulong_t a4;
  161. compat_ulong_t a5;
  162. compat_ulong_t a6;
  163. compat_ulong_t a7;
  164. compat_ulong_t s2;
  165. compat_ulong_t s3;
  166. compat_ulong_t s4;
  167. compat_ulong_t s5;
  168. compat_ulong_t s6;
  169. compat_ulong_t s7;
  170. compat_ulong_t s8;
  171. compat_ulong_t s9;
  172. compat_ulong_t s10;
  173. compat_ulong_t s11;
  174. compat_ulong_t t3;
  175. compat_ulong_t t4;
  176. compat_ulong_t t5;
  177. compat_ulong_t t6;
  178. };
  179. static inline void regs_to_cregs(struct compat_user_regs_struct *cregs,
  180. struct pt_regs *regs)
  181. {
  182. cregs->pc = (compat_ulong_t) regs->epc;
  183. cregs->ra = (compat_ulong_t) regs->ra;
  184. cregs->sp = (compat_ulong_t) regs->sp;
  185. cregs->gp = (compat_ulong_t) regs->gp;
  186. cregs->tp = (compat_ulong_t) regs->tp;
  187. cregs->t0 = (compat_ulong_t) regs->t0;
  188. cregs->t1 = (compat_ulong_t) regs->t1;
  189. cregs->t2 = (compat_ulong_t) regs->t2;
  190. cregs->s0 = (compat_ulong_t) regs->s0;
  191. cregs->s1 = (compat_ulong_t) regs->s1;
  192. cregs->a0 = (compat_ulong_t) regs->a0;
  193. cregs->a1 = (compat_ulong_t) regs->a1;
  194. cregs->a2 = (compat_ulong_t) regs->a2;
  195. cregs->a3 = (compat_ulong_t) regs->a3;
  196. cregs->a4 = (compat_ulong_t) regs->a4;
  197. cregs->a5 = (compat_ulong_t) regs->a5;
  198. cregs->a6 = (compat_ulong_t) regs->a6;
  199. cregs->a7 = (compat_ulong_t) regs->a7;
  200. cregs->s2 = (compat_ulong_t) regs->s2;
  201. cregs->s3 = (compat_ulong_t) regs->s3;
  202. cregs->s4 = (compat_ulong_t) regs->s4;
  203. cregs->s5 = (compat_ulong_t) regs->s5;
  204. cregs->s6 = (compat_ulong_t) regs->s6;
  205. cregs->s7 = (compat_ulong_t) regs->s7;
  206. cregs->s8 = (compat_ulong_t) regs->s8;
  207. cregs->s9 = (compat_ulong_t) regs->s9;
  208. cregs->s10 = (compat_ulong_t) regs->s10;
  209. cregs->s11 = (compat_ulong_t) regs->s11;
  210. cregs->t3 = (compat_ulong_t) regs->t3;
  211. cregs->t4 = (compat_ulong_t) regs->t4;
  212. cregs->t5 = (compat_ulong_t) regs->t5;
  213. cregs->t6 = (compat_ulong_t) regs->t6;
  214. };
  215. static inline void cregs_to_regs(struct compat_user_regs_struct *cregs,
  216. struct pt_regs *regs)
  217. {
  218. regs->epc = (unsigned long) cregs->pc;
  219. regs->ra = (unsigned long) cregs->ra;
  220. regs->sp = (unsigned long) cregs->sp;
  221. regs->gp = (unsigned long) cregs->gp;
  222. regs->tp = (unsigned long) cregs->tp;
  223. regs->t0 = (unsigned long) cregs->t0;
  224. regs->t1 = (unsigned long) cregs->t1;
  225. regs->t2 = (unsigned long) cregs->t2;
  226. regs->s0 = (unsigned long) cregs->s0;
  227. regs->s1 = (unsigned long) cregs->s1;
  228. regs->a0 = (unsigned long) cregs->a0;
  229. regs->a1 = (unsigned long) cregs->a1;
  230. regs->a2 = (unsigned long) cregs->a2;
  231. regs->a3 = (unsigned long) cregs->a3;
  232. regs->a4 = (unsigned long) cregs->a4;
  233. regs->a5 = (unsigned long) cregs->a5;
  234. regs->a6 = (unsigned long) cregs->a6;
  235. regs->a7 = (unsigned long) cregs->a7;
  236. regs->s2 = (unsigned long) cregs->s2;
  237. regs->s3 = (unsigned long) cregs->s3;
  238. regs->s4 = (unsigned long) cregs->s4;
  239. regs->s5 = (unsigned long) cregs->s5;
  240. regs->s6 = (unsigned long) cregs->s6;
  241. regs->s7 = (unsigned long) cregs->s7;
  242. regs->s8 = (unsigned long) cregs->s8;
  243. regs->s9 = (unsigned long) cregs->s9;
  244. regs->s10 = (unsigned long) cregs->s10;
  245. regs->s11 = (unsigned long) cregs->s11;
  246. regs->t3 = (unsigned long) cregs->t3;
  247. regs->t4 = (unsigned long) cregs->t4;
  248. regs->t5 = (unsigned long) cregs->t5;
  249. regs->t6 = (unsigned long) cregs->t6;
  250. };
  251. #endif /* __ASM_COMPAT_H */