Merge branches 'x86/early-printk', 'x86/microcode' and 'core/objtool' into x86/urgent...
[sfrench/cifs-2.6.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 typedef s64             compat_s64;
25 typedef u64             compat_u64;
26 struct 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
46 struct 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
80 struct 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
93 struct 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
102 struct 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
119 typedef u32             compat_old_sigset_t;
120
121 #define _COMPAT_NSIG            64
122 #define _COMPAT_NSIG_BPW        32
123
124 typedef 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
135 static inline void __user *compat_ptr(compat_uptr_t uptr)
136 {
137         return (void __user *)(unsigned long)uptr;
138 }
139
140 static inline compat_uptr_t ptr_to_compat(void __user *uptr)
141 {
142         return (u32)(unsigned long)uptr;
143 }
144
145 #ifdef CONFIG_COMPAT
146 static 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
164 struct 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
178 struct 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
189 struct 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
206 struct 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
223 static inline int is_compat_task(void)
224 {
225         return test_thread_flag(TIF_32BIT);
226 }
227
228 static 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 */