1c6557e7fSMartin Schwidefsky #ifndef _ASM_S390X_COMPAT_H 2c6557e7fSMartin Schwidefsky #define _ASM_S390X_COMPAT_H 3c6557e7fSMartin Schwidefsky /* 4c6557e7fSMartin Schwidefsky * Architecture specific compatibility types 5c6557e7fSMartin Schwidefsky */ 6c6557e7fSMartin Schwidefsky #include <linux/types.h> 7c6557e7fSMartin Schwidefsky #include <linux/sched.h> 87757591aSHeiko Carstens #include <linux/thread_info.h> 9c6557e7fSMartin Schwidefsky 10c6557e7fSMartin Schwidefsky #define PSW32_MASK_PER 0x40000000UL 11c6557e7fSMartin Schwidefsky #define PSW32_MASK_DAT 0x04000000UL 12c6557e7fSMartin Schwidefsky #define PSW32_MASK_IO 0x02000000UL 13c6557e7fSMartin Schwidefsky #define PSW32_MASK_EXT 0x01000000UL 14c6557e7fSMartin Schwidefsky #define PSW32_MASK_KEY 0x00F00000UL 15c6557e7fSMartin Schwidefsky #define PSW32_MASK_MCHECK 0x00040000UL 16c6557e7fSMartin Schwidefsky #define PSW32_MASK_WAIT 0x00020000UL 17c6557e7fSMartin Schwidefsky #define PSW32_MASK_PSTATE 0x00010000UL 18c6557e7fSMartin Schwidefsky #define PSW32_MASK_ASC 0x0000C000UL 19c6557e7fSMartin Schwidefsky #define PSW32_MASK_CC 0x00003000UL 20c6557e7fSMartin Schwidefsky #define PSW32_MASK_PM 0x00000f00UL 21c6557e7fSMartin Schwidefsky 22c6557e7fSMartin Schwidefsky #define PSW32_ADDR_AMODE31 0x80000000UL 23c6557e7fSMartin Schwidefsky #define PSW32_ADDR_INSN 0x7FFFFFFFUL 24c6557e7fSMartin Schwidefsky 25c6557e7fSMartin Schwidefsky #define PSW32_BASE_BITS 0x00080000UL 26c6557e7fSMartin Schwidefsky 27c6557e7fSMartin Schwidefsky #define PSW32_ASC_PRIMARY 0x00000000UL 28c6557e7fSMartin Schwidefsky #define PSW32_ASC_ACCREG 0x00004000UL 29c6557e7fSMartin Schwidefsky #define PSW32_ASC_SECONDARY 0x00008000UL 30c6557e7fSMartin Schwidefsky #define PSW32_ASC_HOME 0x0000C000UL 31c6557e7fSMartin Schwidefsky 32c6557e7fSMartin Schwidefsky #define PSW32_MASK_MERGE(CURRENT,NEW) \ 33c6557e7fSMartin Schwidefsky (((CURRENT) & ~(PSW32_MASK_CC|PSW32_MASK_PM)) | \ 34c6557e7fSMartin Schwidefsky ((NEW) & (PSW32_MASK_CC|PSW32_MASK_PM))) 35c6557e7fSMartin Schwidefsky 36c6557e7fSMartin Schwidefsky extern long psw32_user_bits; 37c6557e7fSMartin Schwidefsky 38c6557e7fSMartin Schwidefsky #define COMPAT_USER_HZ 100 39c6557e7fSMartin Schwidefsky 40c6557e7fSMartin Schwidefsky typedef u32 compat_size_t; 41c6557e7fSMartin Schwidefsky typedef s32 compat_ssize_t; 42c6557e7fSMartin Schwidefsky typedef s32 compat_time_t; 43c6557e7fSMartin Schwidefsky typedef s32 compat_clock_t; 44c6557e7fSMartin Schwidefsky typedef s32 compat_pid_t; 45c6557e7fSMartin Schwidefsky typedef u16 __compat_uid_t; 46c6557e7fSMartin Schwidefsky typedef u16 __compat_gid_t; 47c6557e7fSMartin Schwidefsky typedef u32 __compat_uid32_t; 48c6557e7fSMartin Schwidefsky typedef u32 __compat_gid32_t; 49c6557e7fSMartin Schwidefsky typedef u16 compat_mode_t; 50c6557e7fSMartin Schwidefsky typedef u32 compat_ino_t; 51c6557e7fSMartin Schwidefsky typedef u16 compat_dev_t; 52c6557e7fSMartin Schwidefsky typedef s32 compat_off_t; 53c6557e7fSMartin Schwidefsky typedef s64 compat_loff_t; 54c6557e7fSMartin Schwidefsky typedef u16 compat_nlink_t; 55c6557e7fSMartin Schwidefsky typedef u16 compat_ipc_pid_t; 56c6557e7fSMartin Schwidefsky typedef s32 compat_daddr_t; 57c6557e7fSMartin Schwidefsky typedef u32 compat_caddr_t; 58c6557e7fSMartin Schwidefsky typedef __kernel_fsid_t compat_fsid_t; 59c6557e7fSMartin Schwidefsky typedef s32 compat_key_t; 60c6557e7fSMartin Schwidefsky typedef s32 compat_timer_t; 61c6557e7fSMartin Schwidefsky 62c6557e7fSMartin Schwidefsky typedef s32 compat_int_t; 63c6557e7fSMartin Schwidefsky typedef s32 compat_long_t; 64c6557e7fSMartin Schwidefsky typedef s64 compat_s64; 65c6557e7fSMartin Schwidefsky typedef u32 compat_uint_t; 66c6557e7fSMartin Schwidefsky typedef u32 compat_ulong_t; 67c6557e7fSMartin Schwidefsky typedef u64 compat_u64; 68c6557e7fSMartin Schwidefsky 69c6557e7fSMartin Schwidefsky struct compat_timespec { 70c6557e7fSMartin Schwidefsky compat_time_t tv_sec; 71c6557e7fSMartin Schwidefsky s32 tv_nsec; 72c6557e7fSMartin Schwidefsky }; 73c6557e7fSMartin Schwidefsky 74c6557e7fSMartin Schwidefsky struct compat_timeval { 75c6557e7fSMartin Schwidefsky compat_time_t tv_sec; 76c6557e7fSMartin Schwidefsky s32 tv_usec; 77c6557e7fSMartin Schwidefsky }; 78c6557e7fSMartin Schwidefsky 79c6557e7fSMartin Schwidefsky struct compat_stat { 80c6557e7fSMartin Schwidefsky compat_dev_t st_dev; 81c6557e7fSMartin Schwidefsky u16 __pad1; 82c6557e7fSMartin Schwidefsky compat_ino_t st_ino; 83c6557e7fSMartin Schwidefsky compat_mode_t st_mode; 84c6557e7fSMartin Schwidefsky compat_nlink_t st_nlink; 85c6557e7fSMartin Schwidefsky __compat_uid_t st_uid; 86c6557e7fSMartin Schwidefsky __compat_gid_t st_gid; 87c6557e7fSMartin Schwidefsky compat_dev_t st_rdev; 88c6557e7fSMartin Schwidefsky u16 __pad2; 89c6557e7fSMartin Schwidefsky u32 st_size; 90c6557e7fSMartin Schwidefsky u32 st_blksize; 91c6557e7fSMartin Schwidefsky u32 st_blocks; 92c6557e7fSMartin Schwidefsky u32 st_atime; 93c6557e7fSMartin Schwidefsky u32 st_atime_nsec; 94c6557e7fSMartin Schwidefsky u32 st_mtime; 95c6557e7fSMartin Schwidefsky u32 st_mtime_nsec; 96c6557e7fSMartin Schwidefsky u32 st_ctime; 97c6557e7fSMartin Schwidefsky u32 st_ctime_nsec; 98c6557e7fSMartin Schwidefsky u32 __unused4; 99c6557e7fSMartin Schwidefsky u32 __unused5; 100c6557e7fSMartin Schwidefsky }; 101c6557e7fSMartin Schwidefsky 102c6557e7fSMartin Schwidefsky struct compat_flock { 103c6557e7fSMartin Schwidefsky short l_type; 104c6557e7fSMartin Schwidefsky short l_whence; 105c6557e7fSMartin Schwidefsky compat_off_t l_start; 106c6557e7fSMartin Schwidefsky compat_off_t l_len; 107c6557e7fSMartin Schwidefsky compat_pid_t l_pid; 108c6557e7fSMartin Schwidefsky }; 109c6557e7fSMartin Schwidefsky 110c6557e7fSMartin Schwidefsky #define F_GETLK64 12 111c6557e7fSMartin Schwidefsky #define F_SETLK64 13 112c6557e7fSMartin Schwidefsky #define F_SETLKW64 14 113c6557e7fSMartin Schwidefsky 114c6557e7fSMartin Schwidefsky struct compat_flock64 { 115c6557e7fSMartin Schwidefsky short l_type; 116c6557e7fSMartin Schwidefsky short l_whence; 117c6557e7fSMartin Schwidefsky compat_loff_t l_start; 118c6557e7fSMartin Schwidefsky compat_loff_t l_len; 119c6557e7fSMartin Schwidefsky compat_pid_t l_pid; 120c6557e7fSMartin Schwidefsky }; 121c6557e7fSMartin Schwidefsky 122c6557e7fSMartin Schwidefsky struct compat_statfs { 123c6557e7fSMartin Schwidefsky s32 f_type; 124c6557e7fSMartin Schwidefsky s32 f_bsize; 125c6557e7fSMartin Schwidefsky s32 f_blocks; 126c6557e7fSMartin Schwidefsky s32 f_bfree; 127c6557e7fSMartin Schwidefsky s32 f_bavail; 128c6557e7fSMartin Schwidefsky s32 f_files; 129c6557e7fSMartin Schwidefsky s32 f_ffree; 130c6557e7fSMartin Schwidefsky compat_fsid_t f_fsid; 131c6557e7fSMartin Schwidefsky s32 f_namelen; 132c6557e7fSMartin Schwidefsky s32 f_frsize; 133c6557e7fSMartin Schwidefsky s32 f_spare[6]; 134c6557e7fSMartin Schwidefsky }; 135c6557e7fSMartin Schwidefsky 136c6557e7fSMartin Schwidefsky #define COMPAT_RLIM_OLD_INFINITY 0x7fffffff 137c6557e7fSMartin Schwidefsky #define COMPAT_RLIM_INFINITY 0xffffffff 138c6557e7fSMartin Schwidefsky 139c6557e7fSMartin Schwidefsky typedef u32 compat_old_sigset_t; /* at least 32 bits */ 140c6557e7fSMartin Schwidefsky 141c6557e7fSMartin Schwidefsky #define _COMPAT_NSIG 64 142c6557e7fSMartin Schwidefsky #define _COMPAT_NSIG_BPW 32 143c6557e7fSMartin Schwidefsky 144c6557e7fSMartin Schwidefsky typedef u32 compat_sigset_word; 145c6557e7fSMartin Schwidefsky 146c6557e7fSMartin Schwidefsky #define COMPAT_OFF_T_MAX 0x7fffffff 147c6557e7fSMartin Schwidefsky #define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 148c6557e7fSMartin Schwidefsky 149c6557e7fSMartin Schwidefsky /* 150c6557e7fSMartin Schwidefsky * A pointer passed in from user mode. This should not 151c6557e7fSMartin Schwidefsky * be used for syscall parameters, just declare them 152c6557e7fSMartin Schwidefsky * as pointers because the syscall entry code will have 153c6557e7fSMartin Schwidefsky * appropriately converted them already. 154c6557e7fSMartin Schwidefsky */ 155c6557e7fSMartin Schwidefsky typedef u32 compat_uptr_t; 156c6557e7fSMartin Schwidefsky 157c6557e7fSMartin Schwidefsky static inline void __user *compat_ptr(compat_uptr_t uptr) 158c6557e7fSMartin Schwidefsky { 159c6557e7fSMartin Schwidefsky return (void __user *)(unsigned long)(uptr & 0x7fffffffUL); 160c6557e7fSMartin Schwidefsky } 161c6557e7fSMartin Schwidefsky 162c6557e7fSMartin Schwidefsky static inline compat_uptr_t ptr_to_compat(void __user *uptr) 163c6557e7fSMartin Schwidefsky { 164c6557e7fSMartin Schwidefsky return (u32)(unsigned long)uptr; 165c6557e7fSMartin Schwidefsky } 166c6557e7fSMartin Schwidefsky 1677757591aSHeiko Carstens #ifdef CONFIG_COMPAT 1687757591aSHeiko Carstens 1697757591aSHeiko Carstens static inline int is_compat_task(void) 1707757591aSHeiko Carstens { 1717757591aSHeiko Carstens return test_thread_flag(TIF_31BIT); 1727757591aSHeiko Carstens } 1737757591aSHeiko Carstens 1747757591aSHeiko Carstens #else 1757757591aSHeiko Carstens 1767757591aSHeiko Carstens static inline int is_compat_task(void) 1777757591aSHeiko Carstens { 1787757591aSHeiko Carstens return 0; 1797757591aSHeiko Carstens } 1807757591aSHeiko Carstens 1817757591aSHeiko Carstens #endif 1827757591aSHeiko Carstens 183c6557e7fSMartin Schwidefsky static inline void __user *compat_alloc_user_space(long len) 184c6557e7fSMartin Schwidefsky { 185c6557e7fSMartin Schwidefsky unsigned long stack; 186c6557e7fSMartin Schwidefsky 187c6557e7fSMartin Schwidefsky stack = KSTK_ESP(current); 1887757591aSHeiko Carstens if (is_compat_task()) 189c6557e7fSMartin Schwidefsky stack &= 0x7fffffffUL; 190c6557e7fSMartin Schwidefsky return (void __user *) (stack - len); 191c6557e7fSMartin Schwidefsky } 192c6557e7fSMartin Schwidefsky 193c6557e7fSMartin Schwidefsky struct compat_ipc64_perm { 194c6557e7fSMartin Schwidefsky compat_key_t key; 195c6557e7fSMartin Schwidefsky __compat_uid32_t uid; 196c6557e7fSMartin Schwidefsky __compat_gid32_t gid; 197c6557e7fSMartin Schwidefsky __compat_uid32_t cuid; 198c6557e7fSMartin Schwidefsky __compat_gid32_t cgid; 199c6557e7fSMartin Schwidefsky compat_mode_t mode; 200c6557e7fSMartin Schwidefsky unsigned short __pad1; 201c6557e7fSMartin Schwidefsky unsigned short seq; 202c6557e7fSMartin Schwidefsky unsigned short __pad2; 203c6557e7fSMartin Schwidefsky unsigned int __unused1; 204c6557e7fSMartin Schwidefsky unsigned int __unused2; 205c6557e7fSMartin Schwidefsky }; 206c6557e7fSMartin Schwidefsky 207c6557e7fSMartin Schwidefsky struct compat_semid64_ds { 208c6557e7fSMartin Schwidefsky struct compat_ipc64_perm sem_perm; 209c6557e7fSMartin Schwidefsky compat_time_t sem_otime; 210c6557e7fSMartin Schwidefsky compat_ulong_t __pad1; 211c6557e7fSMartin Schwidefsky compat_time_t sem_ctime; 212c6557e7fSMartin Schwidefsky compat_ulong_t __pad2; 213c6557e7fSMartin Schwidefsky compat_ulong_t sem_nsems; 214c6557e7fSMartin Schwidefsky compat_ulong_t __unused1; 215c6557e7fSMartin Schwidefsky compat_ulong_t __unused2; 216c6557e7fSMartin Schwidefsky }; 217c6557e7fSMartin Schwidefsky 218c6557e7fSMartin Schwidefsky struct compat_msqid64_ds { 219c6557e7fSMartin Schwidefsky struct compat_ipc64_perm msg_perm; 220c6557e7fSMartin Schwidefsky compat_time_t msg_stime; 221c6557e7fSMartin Schwidefsky compat_ulong_t __pad1; 222c6557e7fSMartin Schwidefsky compat_time_t msg_rtime; 223c6557e7fSMartin Schwidefsky compat_ulong_t __pad2; 224c6557e7fSMartin Schwidefsky compat_time_t msg_ctime; 225c6557e7fSMartin Schwidefsky compat_ulong_t __pad3; 226c6557e7fSMartin Schwidefsky compat_ulong_t msg_cbytes; 227c6557e7fSMartin Schwidefsky compat_ulong_t msg_qnum; 228c6557e7fSMartin Schwidefsky compat_ulong_t msg_qbytes; 229c6557e7fSMartin Schwidefsky compat_pid_t msg_lspid; 230c6557e7fSMartin Schwidefsky compat_pid_t msg_lrpid; 231c6557e7fSMartin Schwidefsky compat_ulong_t __unused1; 232c6557e7fSMartin Schwidefsky compat_ulong_t __unused2; 233c6557e7fSMartin Schwidefsky }; 234c6557e7fSMartin Schwidefsky 235c6557e7fSMartin Schwidefsky struct compat_shmid64_ds { 236c6557e7fSMartin Schwidefsky struct compat_ipc64_perm shm_perm; 237c6557e7fSMartin Schwidefsky compat_size_t shm_segsz; 238c6557e7fSMartin Schwidefsky compat_time_t shm_atime; 239c6557e7fSMartin Schwidefsky compat_ulong_t __pad1; 240c6557e7fSMartin Schwidefsky compat_time_t shm_dtime; 241c6557e7fSMartin Schwidefsky compat_ulong_t __pad2; 242c6557e7fSMartin Schwidefsky compat_time_t shm_ctime; 243c6557e7fSMartin Schwidefsky compat_ulong_t __pad3; 244c6557e7fSMartin Schwidefsky compat_pid_t shm_cpid; 245c6557e7fSMartin Schwidefsky compat_pid_t shm_lpid; 246c6557e7fSMartin Schwidefsky compat_ulong_t shm_nattch; 247c6557e7fSMartin Schwidefsky compat_ulong_t __unused1; 248c6557e7fSMartin Schwidefsky compat_ulong_t __unused2; 249c6557e7fSMartin Schwidefsky }; 250c6557e7fSMartin Schwidefsky #endif /* _ASM_S390X_COMPAT_H */ 251