1#ifndef _ASM_POWERPC_COMPAT_H
2#define _ASM_POWERPC_COMPAT_H
3#ifdef __KERNEL__
4/*
5 * Architecture specific compatibility types
6 */
7#include <linux/types.h>
8#include <linux/sched.h>
9
10#define COMPAT_USER_HZ		100
11#ifdef __BIG_ENDIAN__
12#define COMPAT_UTS_MACHINE	"ppc\0\0"
13#else
14#define COMPAT_UTS_MACHINE	"ppcle\0\0"
15#endif
16
17typedef u32		compat_size_t;
18typedef s32		compat_ssize_t;
19typedef s32		compat_time_t;
20typedef s32		compat_clock_t;
21typedef s32		compat_pid_t;
22typedef u32		__compat_uid_t;
23typedef u32		__compat_gid_t;
24typedef u32		__compat_uid32_t;
25typedef u32		__compat_gid32_t;
26typedef u32		compat_mode_t;
27typedef u32		compat_ino_t;
28typedef u32		compat_dev_t;
29typedef s32		compat_off_t;
30typedef s64		compat_loff_t;
31typedef s16		compat_nlink_t;
32typedef u16		compat_ipc_pid_t;
33typedef s32		compat_daddr_t;
34typedef u32		compat_caddr_t;
35typedef __kernel_fsid_t	compat_fsid_t;
36typedef s32		compat_key_t;
37typedef s32		compat_timer_t;
38
39typedef s32		compat_int_t;
40typedef s32		compat_long_t;
41typedef s64		compat_s64;
42typedef u32		compat_uint_t;
43typedef u32		compat_ulong_t;
44typedef u64		compat_u64;
45typedef u32		compat_uptr_t;
46
47struct compat_timespec {
48	compat_time_t	tv_sec;
49	s32		tv_nsec;
50};
51
52struct compat_timeval {
53	compat_time_t	tv_sec;
54	s32		tv_usec;
55};
56
57struct compat_stat {
58	compat_dev_t	st_dev;
59	compat_ino_t	st_ino;
60	compat_mode_t	st_mode;
61	compat_nlink_t	st_nlink;
62	__compat_uid32_t	st_uid;
63	__compat_gid32_t	st_gid;
64	compat_dev_t	st_rdev;
65	compat_off_t	st_size;
66	compat_off_t	st_blksize;
67	compat_off_t	st_blocks;
68	compat_time_t	st_atime;
69	u32		st_atime_nsec;
70	compat_time_t	st_mtime;
71	u32		st_mtime_nsec;
72	compat_time_t	st_ctime;
73	u32		st_ctime_nsec;
74	u32		__unused4[2];
75};
76
77struct compat_flock {
78	short		l_type;
79	short		l_whence;
80	compat_off_t	l_start;
81	compat_off_t	l_len;
82	compat_pid_t	l_pid;
83};
84
85#define F_GETLK64	12	/*  using 'struct flock64' */
86#define F_SETLK64	13
87#define F_SETLKW64	14
88
89struct compat_flock64 {
90	short		l_type;
91	short		l_whence;
92	compat_loff_t	l_start;
93	compat_loff_t	l_len;
94	compat_pid_t	l_pid;
95};
96
97struct compat_statfs {
98	int		f_type;
99	int		f_bsize;
100	int		f_blocks;
101	int		f_bfree;
102	int		f_bavail;
103	int		f_files;
104	int		f_ffree;
105	compat_fsid_t	f_fsid;
106	int		f_namelen;	/* SunOS ignores this field. */
107	int		f_frsize;
108	int		f_flags;
109	int		f_spare[4];
110};
111
112#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
113#define COMPAT_RLIM_INFINITY		0xffffffff
114
115typedef u32		compat_old_sigset_t;
116
117#define _COMPAT_NSIG		64
118#define _COMPAT_NSIG_BPW	32
119
120typedef u32		compat_sigset_word;
121
122typedef union compat_sigval {
123	compat_int_t	sival_int;
124	compat_uptr_t	sival_ptr;
125} compat_sigval_t;
126
127#define SI_PAD_SIZE32	(128/sizeof(int) - 3)
128
129typedef struct compat_siginfo {
130	int si_signo;
131	int si_errno;
132	int si_code;
133
134	union {
135		int _pad[SI_PAD_SIZE32];
136
137		/* kill() */
138		struct {
139			compat_pid_t _pid;		/* sender's pid */
140			__compat_uid_t _uid;		/* sender's uid */
141		} _kill;
142
143		/* POSIX.1b timers */
144		struct {
145			compat_timer_t _tid;		/* timer id */
146			int _overrun;			/* overrun count */
147			compat_sigval_t _sigval;	/* same as below */
148			int _sys_private;	/* not to be passed to user */
149		} _timer;
150
151		/* POSIX.1b signals */
152		struct {
153			compat_pid_t _pid;		/* sender's pid */
154			__compat_uid_t _uid;		/* sender's uid */
155			compat_sigval_t _sigval;
156		} _rt;
157
158		/* SIGCHLD */
159		struct {
160			compat_pid_t _pid;		/* which child */
161			__compat_uid_t _uid;		/* sender's uid */
162			int _status;			/* exit code */
163			compat_clock_t _utime;
164			compat_clock_t _stime;
165		} _sigchld;
166
167		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */
168		struct {
169			unsigned int _addr; /* faulting insn/memory ref. */
170		} _sigfault;
171
172		/* SIGPOLL */
173		struct {
174			int _band;	/* POLL_IN, POLL_OUT, POLL_MSG */
175			int _fd;
176		} _sigpoll;
177	} _sifields;
178} compat_siginfo_t;
179
180#define COMPAT_OFF_T_MAX	0x7fffffff
181#define COMPAT_LOFF_T_MAX	0x7fffffffffffffffL
182
183/*
184 * A pointer passed in from user mode. This should not
185 * be used for syscall parameters, just declare them
186 * as pointers because the syscall entry code will have
187 * appropriately converted them already.
188 */
189
190static inline void __user *compat_ptr(compat_uptr_t uptr)
191{
192	return (void __user *)(unsigned long)uptr;
193}
194
195static inline compat_uptr_t ptr_to_compat(void __user *uptr)
196{
197	return (u32)(unsigned long)uptr;
198}
199
200static inline void __user *arch_compat_alloc_user_space(long len)
201{
202	struct pt_regs *regs = current->thread.regs;
203	unsigned long usp = regs->gpr[1];
204
205	/*
206	 * We can't access below the stack pointer in the 32bit ABI and
207	 * can access 288 bytes in the 64bit big-endian ABI,
208	 * or 512 bytes with the new ELFv2 little-endian ABI.
209	 */
210	if (!is_32bit_task())
211		usp -= USER_REDZONE_SIZE;
212
213	return (void __user *) (usp - len);
214}
215
216/*
217 * ipc64_perm is actually 32/64bit clean but since the compat layer refers to
218 * it we may as well define it.
219 */
220struct compat_ipc64_perm {
221	compat_key_t key;
222	__compat_uid_t uid;
223	__compat_gid_t gid;
224	__compat_uid_t cuid;
225	__compat_gid_t cgid;
226	compat_mode_t mode;
227	unsigned int seq;
228	unsigned int __pad2;
229	unsigned long __unused1;	/* yes they really are 64bit pads */
230	unsigned long __unused2;
231};
232
233struct compat_semid64_ds {
234	struct compat_ipc64_perm sem_perm;
235	unsigned int __unused1;
236	compat_time_t sem_otime;
237	unsigned int __unused2;
238	compat_time_t sem_ctime;
239	compat_ulong_t sem_nsems;
240	compat_ulong_t __unused3;
241	compat_ulong_t __unused4;
242};
243
244struct compat_msqid64_ds {
245	struct compat_ipc64_perm msg_perm;
246	unsigned int __unused1;
247	compat_time_t msg_stime;
248	unsigned int __unused2;
249	compat_time_t msg_rtime;
250	unsigned int __unused3;
251	compat_time_t msg_ctime;
252	compat_ulong_t msg_cbytes;
253	compat_ulong_t msg_qnum;
254	compat_ulong_t msg_qbytes;
255	compat_pid_t msg_lspid;
256	compat_pid_t msg_lrpid;
257	compat_ulong_t __unused4;
258	compat_ulong_t __unused5;
259};
260
261struct compat_shmid64_ds {
262	struct compat_ipc64_perm shm_perm;
263	unsigned int __unused1;
264	compat_time_t shm_atime;
265	unsigned int __unused2;
266	compat_time_t shm_dtime;
267	unsigned int __unused3;
268	compat_time_t shm_ctime;
269	unsigned int __unused4;
270	compat_size_t shm_segsz;
271	compat_pid_t shm_cpid;
272	compat_pid_t shm_lpid;
273	compat_ulong_t shm_nattch;
274	compat_ulong_t __unused5;
275	compat_ulong_t __unused6;
276};
277
278static inline int is_compat_task(void)
279{
280	return is_32bit_task();
281}
282
283#endif /* __KERNEL__ */
284#endif /* _ASM_POWERPC_COMPAT_H */
285