linux/arch/sparc/include/asm/compat.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ASM_SPARC64_COMPAT_H
   3#define _ASM_SPARC64_COMPAT_H
   4/*
   5 * Architecture specific compatibility types
   6 */
   7#include <linux/types.h>
   8
   9#include <asm-generic/compat.h>
  10
  11#define COMPAT_USER_HZ          100
  12#define COMPAT_UTS_MACHINE      "sparc\0\0"
  13
  14typedef u16             __compat_uid_t;
  15typedef u16             __compat_gid_t;
  16typedef u32             __compat_uid32_t;
  17typedef u32             __compat_gid32_t;
  18typedef u16             compat_mode_t;
  19typedef u16             compat_dev_t;
  20typedef s16             compat_nlink_t;
  21typedef u16             compat_ipc_pid_t;
  22typedef u32             compat_caddr_t;
  23typedef __kernel_fsid_t compat_fsid_t;
  24typedef s64             compat_s64;
  25typedef u64             compat_u64;
  26struct compat_stat {
  27        compat_dev_t    st_dev;
  28        compat_ino_t    st_ino;
  29        compat_mode_t   st_mode;
  30        compat_nlink_t  st_nlink;
  31        __compat_uid_t  st_uid;
  32        __compat_gid_t  st_gid;
  33        compat_dev_t    st_rdev;
  34        compat_off_t    st_size;
  35        old_time32_t    st_atime;
  36        compat_ulong_t  st_atime_nsec;
  37        old_time32_t    st_mtime;
  38        compat_ulong_t  st_mtime_nsec;
  39        old_time32_t    st_ctime;
  40        compat_ulong_t  st_ctime_nsec;
  41        compat_off_t    st_blksize;
  42        compat_off_t    st_blocks;
  43        u32             __unused4[2];
  44};
  45
  46struct compat_stat64 {
  47        unsigned long long      st_dev;
  48
  49        unsigned long long      st_ino;
  50
  51        unsigned int    st_mode;
  52        unsigned int    st_nlink;
  53
  54        unsigned int    st_uid;
  55        unsigned int    st_gid;
  56
  57        unsigned long long      st_rdev;
  58
  59        unsigned char   __pad3[8];
  60
  61        long long       st_size;
  62        unsigned int    st_blksize;
  63
  64        unsigned char   __pad4[8];
  65        unsigned int    st_blocks;
  66
  67        unsigned int    st_atime;
  68        unsigned int    st_atime_nsec;
  69
  70        unsigned int    st_mtime;
  71        unsigned int    st_mtime_nsec;
  72
  73        unsigned int    st_ctime;
  74        unsigned int    st_ctime_nsec;
  75
  76        unsigned int    __unused4;
  77        unsigned int    __unused5;
  78};
  79
  80struct compat_flock {
  81        short           l_type;
  82        short           l_whence;
  83        compat_off_t    l_start;
  84        compat_off_t    l_len;
  85        compat_pid_t    l_pid;
  86        short           __unused;
  87};
  88
  89#define F_GETLK64       12
  90#define F_SETLK64       13
  91#define F_SETLKW64      14
  92
  93struct compat_flock64 {
  94        short           l_type;
  95        short           l_whence;
  96        compat_loff_t   l_start;
  97        compat_loff_t   l_len;
  98        compat_pid_t    l_pid;
  99        short           __unused;
 100};
 101
 102struct compat_statfs {
 103        int             f_type;
 104        int             f_bsize;
 105        int             f_blocks;
 106        int             f_bfree;
 107        int             f_bavail;
 108        int             f_files;
 109        int             f_ffree;
 110        compat_fsid_t   f_fsid;
 111        int             f_namelen;      /* SunOS ignores this field. */
 112        int             f_frsize;
 113        int             f_flags;
 114        int             f_spare[4];
 115};
 116
 117#define COMPAT_RLIM_INFINITY 0x7fffffff
 118
 119typedef u32             compat_old_sigset_t;
 120
 121#define _COMPAT_NSIG            64
 122#define _COMPAT_NSIG_BPW        32
 123
 124typedef u32             compat_sigset_word;
 125
 126#define COMPAT_OFF_T_MAX        0x7fffffff
 127
 128/*
 129 * A pointer passed in from user mode. This should not
 130 * be used for syscall parameters, just declare them
 131 * as pointers because the syscall entry code will have
 132 * appropriately converted them already.
 133 */
 134
 135static inline void __user *compat_ptr(compat_uptr_t uptr)
 136{
 137        return (void __user *)(unsigned long)uptr;
 138}
 139
 140static inline compat_uptr_t ptr_to_compat(void __user *uptr)
 141{
 142        return (u32)(unsigned long)uptr;
 143}
 144
 145#ifdef CONFIG_COMPAT
 146static inline void __user *arch_compat_alloc_user_space(long len)
 147{
 148        struct pt_regs *regs = current_thread_info()->kregs;
 149        unsigned long usp = regs->u_regs[UREG_I6];
 150
 151        if (test_thread_64bit_stack(usp))
 152                usp += STACK_BIAS;
 153
 154        if (test_thread_flag(TIF_32BIT))
 155                usp &= 0xffffffffUL;
 156
 157        usp -= len;
 158        usp &= ~0x7UL;
 159
 160        return (void __user *) usp;
 161}
 162#endif
 163
 164struct compat_ipc64_perm {
 165        compat_key_t key;
 166        __compat_uid32_t uid;
 167        __compat_gid32_t gid;
 168        __compat_uid32_t cuid;
 169        __compat_gid32_t cgid;
 170        unsigned short __pad1;
 171        compat_mode_t mode;
 172        unsigned short __pad2;
 173        unsigned short seq;
 174        unsigned long __unused1;        /* yes they really are 64bit pads */
 175        unsigned long __unused2;
 176};
 177
 178struct compat_semid64_ds {
 179        struct compat_ipc64_perm sem_perm;
 180        unsigned int    sem_otime_high;
 181        unsigned int    sem_otime;
 182        unsigned int    sem_ctime_high;
 183        unsigned int    sem_ctime;
 184        u32             sem_nsems;
 185        u32             __unused1;
 186        u32             __unused2;
 187};
 188
 189struct compat_msqid64_ds {
 190        struct compat_ipc64_perm msg_perm;
 191        unsigned int    msg_stime_high;
 192        unsigned int    msg_stime;
 193        unsigned int    msg_rtime_high;
 194        unsigned int    msg_rtime;
 195        unsigned int    msg_ctime_high;
 196        unsigned int    msg_ctime;
 197        unsigned int    msg_cbytes;
 198        unsigned int    msg_qnum;
 199        unsigned int    msg_qbytes;
 200        compat_pid_t    msg_lspid;
 201        compat_pid_t    msg_lrpid;
 202        unsigned int    __unused1;
 203        unsigned int    __unused2;
 204};
 205
 206struct compat_shmid64_ds {
 207        struct compat_ipc64_perm shm_perm;
 208        unsigned int    shm_atime_high;
 209        unsigned int    shm_atime;
 210        unsigned int    shm_dtime_high;
 211        unsigned int    shm_dtime;
 212        unsigned int    shm_ctime_high;
 213        unsigned int    shm_ctime;
 214        compat_size_t   shm_segsz;
 215        compat_pid_t    shm_cpid;
 216        compat_pid_t    shm_lpid;
 217        unsigned int    shm_nattch;
 218        unsigned int    __unused1;
 219        unsigned int    __unused2;
 220};
 221
 222#ifdef CONFIG_COMPAT
 223static inline int is_compat_task(void)
 224{
 225        return test_thread_flag(TIF_32BIT);
 226}
 227
 228static inline bool in_compat_syscall(void)
 229{
 230        /* Vector 0x110 is LINUX_32BIT_SYSCALL_TRAP */
 231        return pt_regs_trap_type(current_pt_regs()) == 0x110;
 232}
 233#define in_compat_syscall in_compat_syscall
 234#endif
 235
 236#endif /* _ASM_SPARC64_COMPAT_H */
 237