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