1#ifndef _ASM_X86_64_COMPAT_H
2#define _ASM_X86_64_COMPAT_H
3
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
12typedef u32		compat_size_t;
13typedef s32		compat_ssize_t;
14typedef s32		compat_time_t;
15typedef s32		compat_clock_t;
16typedef s32		compat_pid_t;
17typedef u16		__compat_uid_t;
18typedef u16		__compat_gid_t;
19typedef u32		__compat_uid32_t;
20typedef u32		__compat_gid32_t;
21typedef u16		compat_mode_t;
22typedef u32		compat_ino_t;
23typedef u16		compat_dev_t;
24typedef s32		compat_off_t;
25typedef s64		compat_loff_t;
26typedef u16		compat_nlink_t;
27typedef u16		compat_ipc_pid_t;
28typedef s32		compat_daddr_t;
29typedef u32		compat_caddr_t;
30typedef __kernel_fsid_t	compat_fsid_t;
31typedef s32		compat_timer_t;
32typedef s32		compat_key_t;
33
34typedef s32		compat_int_t;
35typedef s32		compat_long_t;
36typedef u32		compat_uint_t;
37typedef u32		compat_ulong_t;
38
39struct compat_timespec {
40	compat_time_t	tv_sec;
41	s32		tv_nsec;
42};
43
44struct compat_timeval {
45	compat_time_t	tv_sec;
46	s32		tv_usec;
47};
48
49struct compat_stat {
50	compat_dev_t	st_dev;
51	u16		__pad1;
52	compat_ino_t	st_ino;
53	compat_mode_t	st_mode;
54	compat_nlink_t	st_nlink;
55	__compat_uid_t	st_uid;
56	__compat_gid_t	st_gid;
57	compat_dev_t	st_rdev;
58	u16		__pad2;
59	u32		st_size;
60	u32		st_blksize;
61	u32		st_blocks;
62	u32		st_atime;
63	u32		st_atime_nsec;
64	u32		st_mtime;
65	u32		st_mtime_nsec;
66	u32		st_ctime;
67	u32		st_ctime_nsec;
68	u32		__unused4;
69	u32		__unused5;
70};
71
72struct compat_flock {
73	short		l_type;
74	short		l_whence;
75	compat_off_t	l_start;
76	compat_off_t	l_len;
77	compat_pid_t	l_pid;
78};
79
80#define F_GETLK64	12	/*  using 'struct flock64' */
81#define F_SETLK64	13
82#define F_SETLKW64	14
83
84/*
85 * IA32 uses 4 byte alignment for 64 bit quantities,
86 * so we need to pack this structure.
87 */
88struct compat_flock64 {
89	short		l_type;
90	short		l_whence;
91	compat_loff_t	l_start;
92	compat_loff_t	l_len;
93	compat_pid_t	l_pid;
94} __attribute__((packed));
95
96struct compat_statfs {
97	int		f_type;
98	int		f_bsize;
99	int		f_blocks;
100	int		f_bfree;
101	int		f_bavail;
102	int		f_files;
103	int		f_ffree;
104	compat_fsid_t	f_fsid;
105	int		f_namelen;	/* SunOS ignores this field. */
106	int		f_frsize;
107	int		f_spare[5];
108};
109
110#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
111#define COMPAT_RLIM_INFINITY		0xffffffff
112
113typedef u32		compat_old_sigset_t;	/* at least 32 bits */
114
115#define _COMPAT_NSIG		64
116#define _COMPAT_NSIG_BPW	32
117
118typedef u32               compat_sigset_word;
119
120#define COMPAT_OFF_T_MAX	0x7fffffff
121#define COMPAT_LOFF_T_MAX	0x7fffffffffffffffL
122
123struct compat_ipc64_perm {
124	compat_key_t key;
125	__compat_uid32_t uid;
126	__compat_gid32_t gid;
127	__compat_uid32_t cuid;
128	__compat_gid32_t cgid;
129	unsigned short mode;
130	unsigned short __pad1;
131	unsigned short seq;
132	unsigned short __pad2;
133	compat_ulong_t unused1;
134	compat_ulong_t unused2;
135};
136
137struct compat_semid64_ds {
138	struct compat_ipc64_perm sem_perm;
139	compat_time_t  sem_otime;
140	compat_ulong_t __unused1;
141	compat_time_t  sem_ctime;
142	compat_ulong_t __unused2;
143	compat_ulong_t sem_nsems;
144	compat_ulong_t __unused3;
145	compat_ulong_t __unused4;
146};
147
148struct compat_msqid64_ds {
149	struct compat_ipc64_perm msg_perm;
150	compat_time_t  msg_stime;
151	compat_ulong_t __unused1;
152	compat_time_t  msg_rtime;
153	compat_ulong_t __unused2;
154	compat_time_t  msg_ctime;
155	compat_ulong_t __unused3;
156	compat_ulong_t msg_cbytes;
157	compat_ulong_t msg_qnum;
158	compat_ulong_t msg_qbytes;
159	compat_pid_t   msg_lspid;
160	compat_pid_t   msg_lrpid;
161	compat_ulong_t __unused4;
162	compat_ulong_t __unused5;
163};
164
165struct compat_shmid64_ds {
166	struct compat_ipc64_perm shm_perm;
167	compat_size_t  shm_segsz;
168	compat_time_t  shm_atime;
169	compat_ulong_t __unused1;
170	compat_time_t  shm_dtime;
171	compat_ulong_t __unused2;
172	compat_time_t  shm_ctime;
173	compat_ulong_t __unused3;
174	compat_pid_t   shm_cpid;
175	compat_pid_t   shm_lpid;
176	compat_ulong_t shm_nattch;
177	compat_ulong_t __unused4;
178	compat_ulong_t __unused5;
179};
180
181/*
182 * A pointer passed in from user mode. This should not
183 * be used for syscall parameters, just declare them
184 * as pointers because the syscall entry code will have
185 * appropriately comverted them already.
186 */
187typedef	u32		compat_uptr_t;
188
189static inline void __user *compat_ptr(compat_uptr_t uptr)
190{
191	return (void __user *)(unsigned long)uptr;
192}
193
194static inline compat_uptr_t ptr_to_compat(void __user *uptr)
195{
196	return (u32)(unsigned long)uptr;
197}
198
199static __inline__ void __user *compat_alloc_user_space(long len)
200{
201	struct pt_regs *regs = task_pt_regs(current);
202	return (void __user *)regs->rsp - len;
203}
204
205static inline int is_compat_task(void)
206{
207	return current_thread_info()->status & TS_COMPAT;
208}
209
210#endif /* _ASM_X86_64_COMPAT_H */
211