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