linux/arch/powerpc/include/asm/compat.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ASM_POWERPC_COMPAT_H
   3#define _ASM_POWERPC_COMPAT_H
   4#ifdef __KERNEL__
   5/*
   6 * Architecture specific compatibility types
   7 */
   8#include <linux/types.h>
   9#include <linux/sched.h>
  10
  11#include <asm-generic/compat.h>
  12
  13#define COMPAT_USER_HZ          100
  14#ifdef __BIG_ENDIAN__
  15#define COMPAT_UTS_MACHINE      "ppc\0\0"
  16#else
  17#define COMPAT_UTS_MACHINE      "ppcle\0\0"
  18#endif
  19
  20typedef u32             __compat_uid_t;
  21typedef u32             __compat_gid_t;
  22typedef u32             __compat_uid32_t;
  23typedef u32             __compat_gid32_t;
  24typedef u32             compat_mode_t;
  25typedef u32             compat_dev_t;
  26typedef s16             compat_nlink_t;
  27typedef u16             compat_ipc_pid_t;
  28typedef u32             compat_caddr_t;
  29typedef __kernel_fsid_t compat_fsid_t;
  30typedef s64             compat_s64;
  31typedef u64             compat_u64;
  32
  33struct compat_stat {
  34        compat_dev_t    st_dev;
  35        compat_ino_t    st_ino;
  36        compat_mode_t   st_mode;
  37        compat_nlink_t  st_nlink;
  38        __compat_uid32_t        st_uid;
  39        __compat_gid32_t        st_gid;
  40        compat_dev_t    st_rdev;
  41        compat_off_t    st_size;
  42        compat_off_t    st_blksize;
  43        compat_off_t    st_blocks;
  44        old_time32_t    st_atime;
  45        u32             st_atime_nsec;
  46        old_time32_t    st_mtime;
  47        u32             st_mtime_nsec;
  48        old_time32_t    st_ctime;
  49        u32             st_ctime_nsec;
  50        u32             __unused4[2];
  51};
  52
  53struct compat_flock {
  54        short           l_type;
  55        short           l_whence;
  56        compat_off_t    l_start;
  57        compat_off_t    l_len;
  58        compat_pid_t    l_pid;
  59};
  60
  61#define F_GETLK64       12      /*  using 'struct flock64' */
  62#define F_SETLK64       13
  63#define F_SETLKW64      14
  64
  65struct compat_flock64 {
  66        short           l_type;
  67        short           l_whence;
  68        compat_loff_t   l_start;
  69        compat_loff_t   l_len;
  70        compat_pid_t    l_pid;
  71};
  72
  73struct compat_statfs {
  74        int             f_type;
  75        int             f_bsize;
  76        int             f_blocks;
  77        int             f_bfree;
  78        int             f_bavail;
  79        int             f_files;
  80        int             f_ffree;
  81        compat_fsid_t   f_fsid;
  82        int             f_namelen;      /* SunOS ignores this field. */
  83        int             f_frsize;
  84        int             f_flags;
  85        int             f_spare[4];
  86};
  87
  88#define COMPAT_RLIM_INFINITY            0xffffffff
  89
  90typedef u32             compat_old_sigset_t;
  91
  92#define _COMPAT_NSIG            64
  93#define _COMPAT_NSIG_BPW        32
  94
  95typedef u32             compat_sigset_word;
  96
  97#define COMPAT_OFF_T_MAX        0x7fffffff
  98
  99/*
 100 * A pointer passed in from user mode. This should not
 101 * be used for syscall parameters, just declare them
 102 * as pointers because the syscall entry code will have
 103 * appropriately converted them already.
 104 */
 105
 106static inline void __user *compat_ptr(compat_uptr_t uptr)
 107{
 108        return (void __user *)(unsigned long)uptr;
 109}
 110
 111static inline compat_uptr_t ptr_to_compat(void __user *uptr)
 112{
 113        return (u32)(unsigned long)uptr;
 114}
 115
 116static inline void __user *arch_compat_alloc_user_space(long len)
 117{
 118        struct pt_regs *regs = current->thread.regs;
 119        unsigned long usp = regs->gpr[1];
 120
 121        /*
 122         * We can't access below the stack pointer in the 32bit ABI and
 123         * can access 288 bytes in the 64bit big-endian ABI,
 124         * or 512 bytes with the new ELFv2 little-endian ABI.
 125         */
 126        if (!is_32bit_task())
 127                usp -= USER_REDZONE_SIZE;
 128
 129        return (void __user *) (usp - len);
 130}
 131
 132/*
 133 * ipc64_perm is actually 32/64bit clean but since the compat layer refers to
 134 * it we may as well define it.
 135 */
 136struct compat_ipc64_perm {
 137        compat_key_t key;
 138        __compat_uid_t uid;
 139        __compat_gid_t gid;
 140        __compat_uid_t cuid;
 141        __compat_gid_t cgid;
 142        compat_mode_t mode;
 143        unsigned int seq;
 144        unsigned int __pad2;
 145        unsigned long __unused1;        /* yes they really are 64bit pads */
 146        unsigned long __unused2;
 147};
 148
 149struct compat_semid64_ds {
 150        struct compat_ipc64_perm sem_perm;
 151        unsigned int sem_otime_high;
 152        unsigned int sem_otime;
 153        unsigned int sem_ctime_high;
 154        unsigned int sem_ctime;
 155        compat_ulong_t sem_nsems;
 156        compat_ulong_t __unused3;
 157        compat_ulong_t __unused4;
 158};
 159
 160struct compat_msqid64_ds {
 161        struct compat_ipc64_perm msg_perm;
 162        unsigned int msg_stime_high;
 163        unsigned int msg_stime;
 164        unsigned int msg_rtime_high;
 165        unsigned int msg_rtime;
 166        unsigned int msg_ctime_high;
 167        unsigned int msg_ctime;
 168        compat_ulong_t msg_cbytes;
 169        compat_ulong_t msg_qnum;
 170        compat_ulong_t msg_qbytes;
 171        compat_pid_t msg_lspid;
 172        compat_pid_t msg_lrpid;
 173        compat_ulong_t __unused4;
 174        compat_ulong_t __unused5;
 175};
 176
 177struct compat_shmid64_ds {
 178        struct compat_ipc64_perm shm_perm;
 179        unsigned int shm_atime_high;
 180        unsigned int shm_atime;
 181        unsigned int shm_dtime_high;
 182        unsigned int shm_dtime;
 183        unsigned int shm_ctime_high;
 184        unsigned int shm_ctime;
 185        unsigned int __unused4;
 186        compat_size_t shm_segsz;
 187        compat_pid_t shm_cpid;
 188        compat_pid_t shm_lpid;
 189        compat_ulong_t shm_nattch;
 190        compat_ulong_t __unused5;
 191        compat_ulong_t __unused6;
 192};
 193
 194static inline int is_compat_task(void)
 195{
 196        return is_32bit_task();
 197}
 198
 199#endif /* __KERNEL__ */
 200#endif /* _ASM_POWERPC_COMPAT_H */
 201