1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_S390X_COMPAT_H 3*4882a593Smuzhiyun #define _ASM_S390X_COMPAT_H 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * Architecture specific compatibility types 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #include <linux/types.h> 8*4882a593Smuzhiyun #include <linux/sched.h> 9*4882a593Smuzhiyun #include <linux/sched/task_stack.h> 10*4882a593Smuzhiyun #include <linux/thread_info.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <asm-generic/compat.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p( \ 15*4882a593Smuzhiyun typeof(0?(__force t)0:0ULL), u64)) 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define __SC_DELOUSE(t,v) ({ \ 18*4882a593Smuzhiyun BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)); \ 19*4882a593Smuzhiyun (__force t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v)); \ 20*4882a593Smuzhiyun }) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define PSW32_MASK_PER 0x40000000UL 23*4882a593Smuzhiyun #define PSW32_MASK_DAT 0x04000000UL 24*4882a593Smuzhiyun #define PSW32_MASK_IO 0x02000000UL 25*4882a593Smuzhiyun #define PSW32_MASK_EXT 0x01000000UL 26*4882a593Smuzhiyun #define PSW32_MASK_KEY 0x00F00000UL 27*4882a593Smuzhiyun #define PSW32_MASK_BASE 0x00080000UL /* Always one */ 28*4882a593Smuzhiyun #define PSW32_MASK_MCHECK 0x00040000UL 29*4882a593Smuzhiyun #define PSW32_MASK_WAIT 0x00020000UL 30*4882a593Smuzhiyun #define PSW32_MASK_PSTATE 0x00010000UL 31*4882a593Smuzhiyun #define PSW32_MASK_ASC 0x0000C000UL 32*4882a593Smuzhiyun #define PSW32_MASK_CC 0x00003000UL 33*4882a593Smuzhiyun #define PSW32_MASK_PM 0x00000f00UL 34*4882a593Smuzhiyun #define PSW32_MASK_RI 0x00000080UL 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define PSW32_MASK_USER 0x0000FF00UL 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define PSW32_ADDR_AMODE 0x80000000UL 39*4882a593Smuzhiyun #define PSW32_ADDR_INSN 0x7FFFFFFFUL 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define PSW32_DEFAULT_KEY (((u32) PAGE_DEFAULT_ACC) << 20) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define PSW32_ASC_PRIMARY 0x00000000UL 44*4882a593Smuzhiyun #define PSW32_ASC_ACCREG 0x00004000UL 45*4882a593Smuzhiyun #define PSW32_ASC_SECONDARY 0x00008000UL 46*4882a593Smuzhiyun #define PSW32_ASC_HOME 0x0000C000UL 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define PSW32_USER_BITS (PSW32_MASK_DAT | PSW32_MASK_IO | PSW32_MASK_EXT | \ 49*4882a593Smuzhiyun PSW32_DEFAULT_KEY | PSW32_MASK_BASE | \ 50*4882a593Smuzhiyun PSW32_MASK_MCHECK | PSW32_MASK_PSTATE | \ 51*4882a593Smuzhiyun PSW32_ASC_PRIMARY) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define COMPAT_USER_HZ 100 54*4882a593Smuzhiyun #define COMPAT_UTS_MACHINE "s390\0\0\0\0" 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun typedef u16 __compat_uid_t; 57*4882a593Smuzhiyun typedef u16 __compat_gid_t; 58*4882a593Smuzhiyun typedef u32 __compat_uid32_t; 59*4882a593Smuzhiyun typedef u32 __compat_gid32_t; 60*4882a593Smuzhiyun typedef u16 compat_mode_t; 61*4882a593Smuzhiyun typedef u16 compat_dev_t; 62*4882a593Smuzhiyun typedef u16 compat_nlink_t; 63*4882a593Smuzhiyun typedef u16 compat_ipc_pid_t; 64*4882a593Smuzhiyun typedef u32 compat_caddr_t; 65*4882a593Smuzhiyun typedef __kernel_fsid_t compat_fsid_t; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun typedef struct { 68*4882a593Smuzhiyun u32 mask; 69*4882a593Smuzhiyun u32 addr; 70*4882a593Smuzhiyun } __aligned(8) psw_compat_t; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun typedef struct { 73*4882a593Smuzhiyun psw_compat_t psw; 74*4882a593Smuzhiyun u32 gprs[NUM_GPRS]; 75*4882a593Smuzhiyun u32 acrs[NUM_ACRS]; 76*4882a593Smuzhiyun u32 orig_gpr2; 77*4882a593Smuzhiyun } s390_compat_regs; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun typedef struct { 80*4882a593Smuzhiyun u32 gprs_high[NUM_GPRS]; 81*4882a593Smuzhiyun } s390_compat_regs_high; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct compat_stat { 84*4882a593Smuzhiyun compat_dev_t st_dev; 85*4882a593Smuzhiyun u16 __pad1; 86*4882a593Smuzhiyun compat_ino_t st_ino; 87*4882a593Smuzhiyun compat_mode_t st_mode; 88*4882a593Smuzhiyun compat_nlink_t st_nlink; 89*4882a593Smuzhiyun __compat_uid_t st_uid; 90*4882a593Smuzhiyun __compat_gid_t st_gid; 91*4882a593Smuzhiyun compat_dev_t st_rdev; 92*4882a593Smuzhiyun u16 __pad2; 93*4882a593Smuzhiyun u32 st_size; 94*4882a593Smuzhiyun u32 st_blksize; 95*4882a593Smuzhiyun u32 st_blocks; 96*4882a593Smuzhiyun u32 st_atime; 97*4882a593Smuzhiyun u32 st_atime_nsec; 98*4882a593Smuzhiyun u32 st_mtime; 99*4882a593Smuzhiyun u32 st_mtime_nsec; 100*4882a593Smuzhiyun u32 st_ctime; 101*4882a593Smuzhiyun u32 st_ctime_nsec; 102*4882a593Smuzhiyun u32 __unused4; 103*4882a593Smuzhiyun u32 __unused5; 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun struct compat_flock { 107*4882a593Smuzhiyun short l_type; 108*4882a593Smuzhiyun short l_whence; 109*4882a593Smuzhiyun compat_off_t l_start; 110*4882a593Smuzhiyun compat_off_t l_len; 111*4882a593Smuzhiyun compat_pid_t l_pid; 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define F_GETLK64 12 115*4882a593Smuzhiyun #define F_SETLK64 13 116*4882a593Smuzhiyun #define F_SETLKW64 14 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct compat_flock64 { 119*4882a593Smuzhiyun short l_type; 120*4882a593Smuzhiyun short l_whence; 121*4882a593Smuzhiyun compat_loff_t l_start; 122*4882a593Smuzhiyun compat_loff_t l_len; 123*4882a593Smuzhiyun compat_pid_t l_pid; 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun struct compat_statfs { 127*4882a593Smuzhiyun u32 f_type; 128*4882a593Smuzhiyun u32 f_bsize; 129*4882a593Smuzhiyun u32 f_blocks; 130*4882a593Smuzhiyun u32 f_bfree; 131*4882a593Smuzhiyun u32 f_bavail; 132*4882a593Smuzhiyun u32 f_files; 133*4882a593Smuzhiyun u32 f_ffree; 134*4882a593Smuzhiyun compat_fsid_t f_fsid; 135*4882a593Smuzhiyun u32 f_namelen; 136*4882a593Smuzhiyun u32 f_frsize; 137*4882a593Smuzhiyun u32 f_flags; 138*4882a593Smuzhiyun u32 f_spare[4]; 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun struct compat_statfs64 { 142*4882a593Smuzhiyun u32 f_type; 143*4882a593Smuzhiyun u32 f_bsize; 144*4882a593Smuzhiyun u64 f_blocks; 145*4882a593Smuzhiyun u64 f_bfree; 146*4882a593Smuzhiyun u64 f_bavail; 147*4882a593Smuzhiyun u64 f_files; 148*4882a593Smuzhiyun u64 f_ffree; 149*4882a593Smuzhiyun compat_fsid_t f_fsid; 150*4882a593Smuzhiyun u32 f_namelen; 151*4882a593Smuzhiyun u32 f_frsize; 152*4882a593Smuzhiyun u32 f_flags; 153*4882a593Smuzhiyun u32 f_spare[4]; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define COMPAT_RLIM_INFINITY 0xffffffff 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun typedef u32 compat_old_sigset_t; /* at least 32 bits */ 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define _COMPAT_NSIG 64 161*4882a593Smuzhiyun #define _COMPAT_NSIG_BPW 32 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun typedef u32 compat_sigset_word; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define COMPAT_OFF_T_MAX 0x7fffffff 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* 168*4882a593Smuzhiyun * A pointer passed in from user mode. This should not 169*4882a593Smuzhiyun * be used for syscall parameters, just declare them 170*4882a593Smuzhiyun * as pointers because the syscall entry code will have 171*4882a593Smuzhiyun * appropriately converted them already. 172*4882a593Smuzhiyun */ 173*4882a593Smuzhiyun compat_ptr(compat_uptr_t uptr)174*4882a593Smuzhiyunstatic inline void __user *compat_ptr(compat_uptr_t uptr) 175*4882a593Smuzhiyun { 176*4882a593Smuzhiyun return (void __user *)(unsigned long)(uptr & 0x7fffffffUL); 177*4882a593Smuzhiyun } 178*4882a593Smuzhiyun #define compat_ptr(uptr) compat_ptr(uptr) 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #ifdef CONFIG_COMPAT 181*4882a593Smuzhiyun is_compat_task(void)182*4882a593Smuzhiyunstatic inline int is_compat_task(void) 183*4882a593Smuzhiyun { 184*4882a593Smuzhiyun return test_thread_flag(TIF_31BIT); 185*4882a593Smuzhiyun } 186*4882a593Smuzhiyun arch_compat_alloc_user_space(long len)187*4882a593Smuzhiyunstatic inline void __user *arch_compat_alloc_user_space(long len) 188*4882a593Smuzhiyun { 189*4882a593Smuzhiyun unsigned long stack; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun stack = KSTK_ESP(current); 192*4882a593Smuzhiyun if (is_compat_task()) 193*4882a593Smuzhiyun stack &= 0x7fffffffUL; 194*4882a593Smuzhiyun return (void __user *) (stack - len); 195*4882a593Smuzhiyun } 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #endif 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun struct compat_ipc64_perm { 200*4882a593Smuzhiyun compat_key_t key; 201*4882a593Smuzhiyun __compat_uid32_t uid; 202*4882a593Smuzhiyun __compat_gid32_t gid; 203*4882a593Smuzhiyun __compat_uid32_t cuid; 204*4882a593Smuzhiyun __compat_gid32_t cgid; 205*4882a593Smuzhiyun compat_mode_t mode; 206*4882a593Smuzhiyun unsigned short __pad1; 207*4882a593Smuzhiyun unsigned short seq; 208*4882a593Smuzhiyun unsigned short __pad2; 209*4882a593Smuzhiyun unsigned int __unused1; 210*4882a593Smuzhiyun unsigned int __unused2; 211*4882a593Smuzhiyun }; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun struct compat_semid64_ds { 214*4882a593Smuzhiyun struct compat_ipc64_perm sem_perm; 215*4882a593Smuzhiyun compat_ulong_t sem_otime; 216*4882a593Smuzhiyun compat_ulong_t sem_otime_high; 217*4882a593Smuzhiyun compat_ulong_t sem_ctime; 218*4882a593Smuzhiyun compat_ulong_t sem_ctime_high; 219*4882a593Smuzhiyun compat_ulong_t sem_nsems; 220*4882a593Smuzhiyun compat_ulong_t __unused1; 221*4882a593Smuzhiyun compat_ulong_t __unused2; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun struct compat_msqid64_ds { 225*4882a593Smuzhiyun struct compat_ipc64_perm msg_perm; 226*4882a593Smuzhiyun compat_ulong_t msg_stime; 227*4882a593Smuzhiyun compat_ulong_t msg_stime_high; 228*4882a593Smuzhiyun compat_ulong_t msg_rtime; 229*4882a593Smuzhiyun compat_ulong_t msg_rtime_high; 230*4882a593Smuzhiyun compat_ulong_t msg_ctime; 231*4882a593Smuzhiyun compat_ulong_t msg_ctime_high; 232*4882a593Smuzhiyun compat_ulong_t msg_cbytes; 233*4882a593Smuzhiyun compat_ulong_t msg_qnum; 234*4882a593Smuzhiyun compat_ulong_t msg_qbytes; 235*4882a593Smuzhiyun compat_pid_t msg_lspid; 236*4882a593Smuzhiyun compat_pid_t msg_lrpid; 237*4882a593Smuzhiyun compat_ulong_t __unused1; 238*4882a593Smuzhiyun compat_ulong_t __unused2; 239*4882a593Smuzhiyun }; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun struct compat_shmid64_ds { 242*4882a593Smuzhiyun struct compat_ipc64_perm shm_perm; 243*4882a593Smuzhiyun compat_size_t shm_segsz; 244*4882a593Smuzhiyun compat_ulong_t shm_atime; 245*4882a593Smuzhiyun compat_ulong_t shm_atime_high; 246*4882a593Smuzhiyun compat_ulong_t shm_dtime; 247*4882a593Smuzhiyun compat_ulong_t shm_dtime_high; 248*4882a593Smuzhiyun compat_ulong_t shm_ctime; 249*4882a593Smuzhiyun compat_ulong_t shm_ctime_high; 250*4882a593Smuzhiyun compat_pid_t shm_cpid; 251*4882a593Smuzhiyun compat_pid_t shm_lpid; 252*4882a593Smuzhiyun compat_ulong_t shm_nattch; 253*4882a593Smuzhiyun compat_ulong_t __unused1; 254*4882a593Smuzhiyun compat_ulong_t __unused2; 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun #endif /* _ASM_S390X_COMPAT_H */ 257