xref: /linux/arch/sparc/include/asm/compat.h (revision 26fbb4c8c7c3ee9a4c3b4de555a8587b5a19154e)
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 */
219