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 121a33b18bSArnd Bergmann #define compat_mode_t compat_mode_t 131a33b18bSArnd Bergmann typedef u16 compat_mode_t; 141a33b18bSArnd Bergmann 15*84a0c977SGuo Ren #define __compat_uid_t __compat_uid_t 16*84a0c977SGuo Ren typedef u16 __compat_uid_t; 17*84a0c977SGuo Ren typedef u16 __compat_gid_t; 18*84a0c977SGuo Ren 19*84a0c977SGuo Ren #define compat_dev_t compat_dev_t 20*84a0c977SGuo Ren typedef u16 compat_dev_t; 21*84a0c977SGuo Ren 22*84a0c977SGuo Ren #define compat_ipc_pid_t compat_ipc_pid_t 23*84a0c977SGuo Ren typedef u16 compat_ipc_pid_t; 24*84a0c977SGuo Ren 25*84a0c977SGuo Ren #define compat_statfs compat_statfs 26*84a0c977SGuo Ren 27fb373975SArnd Bergmann #include <asm-generic/compat.h> 28fb373975SArnd Bergmann 294f59c718SAl Viro #define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p( \ 304f59c718SAl Viro typeof(0?(__force t)0:0ULL), u64)) 319a205286SHeiko Carstens 329a205286SHeiko Carstens #define __SC_DELOUSE(t,v) ({ \ 339a205286SHeiko Carstens BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)); \ 344f59c718SAl Viro (__force t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v)); \ 359a205286SHeiko Carstens }) 3646836613SAl Viro 37c6557e7fSMartin Schwidefsky #define PSW32_MASK_PER 0x40000000UL 38c6557e7fSMartin Schwidefsky #define PSW32_MASK_DAT 0x04000000UL 39c6557e7fSMartin Schwidefsky #define PSW32_MASK_IO 0x02000000UL 40c6557e7fSMartin Schwidefsky #define PSW32_MASK_EXT 0x01000000UL 41c6557e7fSMartin Schwidefsky #define PSW32_MASK_KEY 0x00F00000UL 42b50511e4SMartin Schwidefsky #define PSW32_MASK_BASE 0x00080000UL /* Always one */ 43c6557e7fSMartin Schwidefsky #define PSW32_MASK_MCHECK 0x00040000UL 44c6557e7fSMartin Schwidefsky #define PSW32_MASK_WAIT 0x00020000UL 45c6557e7fSMartin Schwidefsky #define PSW32_MASK_PSTATE 0x00010000UL 46c6557e7fSMartin Schwidefsky #define PSW32_MASK_ASC 0x0000C000UL 47c6557e7fSMartin Schwidefsky #define PSW32_MASK_CC 0x00003000UL 48c6557e7fSMartin Schwidefsky #define PSW32_MASK_PM 0x00000f00UL 495ebf250dSHeiko Carstens #define PSW32_MASK_RI 0x00000080UL 50c6557e7fSMartin Schwidefsky 51fa968ee2SMartin Schwidefsky #define PSW32_MASK_USER 0x0000FF00UL 52b50511e4SMartin Schwidefsky 53b50511e4SMartin Schwidefsky #define PSW32_ADDR_AMODE 0x80000000UL 54c6557e7fSMartin Schwidefsky #define PSW32_ADDR_INSN 0x7FFFFFFFUL 55c6557e7fSMartin Schwidefsky 56b50511e4SMartin Schwidefsky #define PSW32_DEFAULT_KEY (((u32) PAGE_DEFAULT_ACC) << 20) 57c6557e7fSMartin Schwidefsky 58c6557e7fSMartin Schwidefsky #define PSW32_ASC_PRIMARY 0x00000000UL 59c6557e7fSMartin Schwidefsky #define PSW32_ASC_ACCREG 0x00004000UL 60c6557e7fSMartin Schwidefsky #define PSW32_ASC_SECONDARY 0x00008000UL 61c6557e7fSMartin Schwidefsky #define PSW32_ASC_HOME 0x0000C000UL 62c6557e7fSMartin Schwidefsky 63f26946d7SHeiko Carstens #define PSW32_USER_BITS (PSW32_MASK_DAT | PSW32_MASK_IO | PSW32_MASK_EXT | \ 64f26946d7SHeiko Carstens PSW32_DEFAULT_KEY | PSW32_MASK_BASE | \ 65075dfd82SHeiko Carstens PSW32_MASK_MCHECK | PSW32_MASK_PSTATE | \ 66075dfd82SHeiko Carstens PSW32_ASC_PRIMARY) 67c6557e7fSMartin Schwidefsky 68e28cbf22SChristoph Hellwig #define COMPAT_UTS_MACHINE "s390\0\0\0\0" 69c6557e7fSMartin Schwidefsky 70c6557e7fSMartin Schwidefsky typedef u16 compat_nlink_t; 71c6557e7fSMartin Schwidefsky 72e4371f60SHeiko Carstens typedef struct { 73e4371f60SHeiko Carstens u32 mask; 74e4371f60SHeiko Carstens u32 addr; 75e4371f60SHeiko Carstens } __aligned(8) psw_compat_t; 76e4371f60SHeiko Carstens 77e4371f60SHeiko Carstens typedef struct { 78e4371f60SHeiko Carstens psw_compat_t psw; 79e4371f60SHeiko Carstens u32 gprs[NUM_GPRS]; 80e4371f60SHeiko Carstens u32 acrs[NUM_ACRS]; 81e4371f60SHeiko Carstens u32 orig_gpr2; 82e4371f60SHeiko Carstens } s390_compat_regs; 83e4371f60SHeiko Carstens 84e4371f60SHeiko Carstens typedef struct { 85e4371f60SHeiko Carstens u32 gprs_high[NUM_GPRS]; 86e4371f60SHeiko Carstens } s390_compat_regs_high; 87e4371f60SHeiko Carstens 88c6557e7fSMartin Schwidefsky struct compat_stat { 89c6557e7fSMartin Schwidefsky compat_dev_t st_dev; 90c6557e7fSMartin Schwidefsky u16 __pad1; 91c6557e7fSMartin Schwidefsky compat_ino_t st_ino; 92c6557e7fSMartin Schwidefsky compat_mode_t st_mode; 93c6557e7fSMartin Schwidefsky compat_nlink_t st_nlink; 94c6557e7fSMartin Schwidefsky __compat_uid_t st_uid; 95c6557e7fSMartin Schwidefsky __compat_gid_t st_gid; 96c6557e7fSMartin Schwidefsky compat_dev_t st_rdev; 97c6557e7fSMartin Schwidefsky u16 __pad2; 98c6557e7fSMartin Schwidefsky u32 st_size; 99c6557e7fSMartin Schwidefsky u32 st_blksize; 100c6557e7fSMartin Schwidefsky u32 st_blocks; 101c6557e7fSMartin Schwidefsky u32 st_atime; 102c6557e7fSMartin Schwidefsky u32 st_atime_nsec; 103c6557e7fSMartin Schwidefsky u32 st_mtime; 104c6557e7fSMartin Schwidefsky u32 st_mtime_nsec; 105c6557e7fSMartin Schwidefsky u32 st_ctime; 106c6557e7fSMartin Schwidefsky u32 st_ctime_nsec; 107c6557e7fSMartin Schwidefsky u32 __unused4; 108c6557e7fSMartin Schwidefsky u32 __unused5; 109c6557e7fSMartin Schwidefsky }; 110c6557e7fSMartin Schwidefsky 111c6557e7fSMartin Schwidefsky struct compat_statfs { 112b8668fd0SHeiko Carstens u32 f_type; 113b8668fd0SHeiko Carstens u32 f_bsize; 114b8668fd0SHeiko Carstens u32 f_blocks; 115b8668fd0SHeiko Carstens u32 f_bfree; 116b8668fd0SHeiko Carstens u32 f_bavail; 117b8668fd0SHeiko Carstens u32 f_files; 118b8668fd0SHeiko Carstens u32 f_ffree; 119c6557e7fSMartin Schwidefsky compat_fsid_t f_fsid; 120b8668fd0SHeiko Carstens u32 f_namelen; 121b8668fd0SHeiko Carstens u32 f_frsize; 122b8668fd0SHeiko Carstens u32 f_flags; 123b8668fd0SHeiko Carstens u32 f_spare[4]; 124b8668fd0SHeiko Carstens }; 125b8668fd0SHeiko Carstens 126b8668fd0SHeiko Carstens struct compat_statfs64 { 127b8668fd0SHeiko Carstens u32 f_type; 128b8668fd0SHeiko Carstens u32 f_bsize; 129b8668fd0SHeiko Carstens u64 f_blocks; 130b8668fd0SHeiko Carstens u64 f_bfree; 131b8668fd0SHeiko Carstens u64 f_bavail; 132b8668fd0SHeiko Carstens u64 f_files; 133b8668fd0SHeiko Carstens u64 f_ffree; 134b8668fd0SHeiko Carstens compat_fsid_t f_fsid; 135b8668fd0SHeiko Carstens u32 f_namelen; 136b8668fd0SHeiko Carstens u32 f_frsize; 137b8668fd0SHeiko Carstens u32 f_flags; 138b8668fd0SHeiko Carstens u32 f_spare[4]; 139c6557e7fSMartin Schwidefsky }; 140c6557e7fSMartin Schwidefsky 141c6557e7fSMartin Schwidefsky /* 142c6557e7fSMartin Schwidefsky * A pointer passed in from user mode. This should not 143c6557e7fSMartin Schwidefsky * be used for syscall parameters, just declare them 144c6557e7fSMartin Schwidefsky * as pointers because the syscall entry code will have 145c6557e7fSMartin Schwidefsky * appropriately converted them already. 146c6557e7fSMartin Schwidefsky */ 147c6557e7fSMartin Schwidefsky 148c6557e7fSMartin Schwidefsky static inline void __user *compat_ptr(compat_uptr_t uptr) 149c6557e7fSMartin Schwidefsky { 150c6557e7fSMartin Schwidefsky return (void __user *)(unsigned long)(uptr & 0x7fffffffUL); 151c6557e7fSMartin Schwidefsky } 152202bf8d7SArnd Bergmann #define compat_ptr(uptr) compat_ptr(uptr) 153c6557e7fSMartin Schwidefsky 1547757591aSHeiko Carstens #ifdef CONFIG_COMPAT 1557757591aSHeiko Carstens 1567757591aSHeiko Carstens static inline int is_compat_task(void) 1577757591aSHeiko Carstens { 1589eb31be3SHeiko Carstens return test_thread_flag(TIF_31BIT); 1597757591aSHeiko Carstens } 1607757591aSHeiko Carstens 1610f58104cSHeiko Carstens #endif 1620f58104cSHeiko Carstens 163c6557e7fSMartin Schwidefsky #endif /* _ASM_S390X_COMPAT_H */ 164