1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_POWERPC_COMPAT_H
3#define _ASM_POWERPC_COMPAT_H
4#ifdef __KERNEL__
5/*
6 * Architecture specific compatibility types
7 */
8#include <linux/types.h>
9#include <linux/sched.h>
10
11#include <asm-generic/compat.h>
12
13#define COMPAT_USER_HZ		100
14#ifdef __BIG_ENDIAN__
15#define COMPAT_UTS_MACHINE	"ppc\0\0"
16#else
17#define COMPAT_UTS_MACHINE	"ppcle\0\0"
18#endif
19
20typedef u32		__compat_uid_t;
21typedef u32		__compat_gid_t;
22typedef u32		__compat_uid32_t;
23typedef u32		__compat_gid32_t;
24typedef u32		compat_mode_t;
25typedef u32		compat_dev_t;
26typedef s16		compat_nlink_t;
27typedef u16		compat_ipc_pid_t;
28typedef u32		compat_caddr_t;
29typedef __kernel_fsid_t	compat_fsid_t;
30
31struct compat_stat {
32	compat_dev_t	st_dev;
33	compat_ino_t	st_ino;
34	compat_mode_t	st_mode;
35	compat_nlink_t	st_nlink;
36	__compat_uid32_t	st_uid;
37	__compat_gid32_t	st_gid;
38	compat_dev_t	st_rdev;
39	compat_off_t	st_size;
40	compat_off_t	st_blksize;
41	compat_off_t	st_blocks;
42	old_time32_t	st_atime;
43	u32		st_atime_nsec;
44	old_time32_t	st_mtime;
45	u32		st_mtime_nsec;
46	old_time32_t	st_ctime;
47	u32		st_ctime_nsec;
48	u32		__unused4[2];
49};
50
51struct compat_flock {
52	short		l_type;
53	short		l_whence;
54	compat_off_t	l_start;
55	compat_off_t	l_len;
56	compat_pid_t	l_pid;
57};
58
59#define F_GETLK64	12	/*  using 'struct flock64' */
60#define F_SETLK64	13
61#define F_SETLKW64	14
62
63struct compat_flock64 {
64	short		l_type;
65	short		l_whence;
66	compat_loff_t	l_start;
67	compat_loff_t	l_len;
68	compat_pid_t	l_pid;
69};
70
71struct compat_statfs {
72	int		f_type;
73	int		f_bsize;
74	int		f_blocks;
75	int		f_bfree;
76	int		f_bavail;
77	int		f_files;
78	int		f_ffree;
79	compat_fsid_t	f_fsid;
80	int		f_namelen;	/* SunOS ignores this field. */
81	int		f_frsize;
82	int		f_flags;
83	int		f_spare[4];
84};
85
86#define COMPAT_RLIM_INFINITY		0xffffffff
87
88typedef u32		compat_old_sigset_t;
89
90#define _COMPAT_NSIG		64
91#define _COMPAT_NSIG_BPW	32
92
93typedef u32		compat_sigset_word;
94
95#define COMPAT_OFF_T_MAX	0x7fffffff
96
97static inline void __user *arch_compat_alloc_user_space(long len)
98{
99	struct pt_regs *regs = current->thread.regs;
100	unsigned long usp = regs->gpr[1];
101
102	/*
103	 * We can't access below the stack pointer in the 32bit ABI and
104	 * can access 288 bytes in the 64bit big-endian ABI,
105	 * or 512 bytes with the new ELFv2 little-endian ABI.
106	 */
107	if (!is_32bit_task())
108		usp -= USER_REDZONE_SIZE;
109
110	return (void __user *) (usp - len);
111}
112
113/*
114 * ipc64_perm is actually 32/64bit clean but since the compat layer refers to
115 * it we may as well define it.
116 */
117struct compat_ipc64_perm {
118	compat_key_t key;
119	__compat_uid_t uid;
120	__compat_gid_t gid;
121	__compat_uid_t cuid;
122	__compat_gid_t cgid;
123	compat_mode_t mode;
124	unsigned int seq;
125	unsigned int __pad2;
126	unsigned long __unused1;	/* yes they really are 64bit pads */
127	unsigned long __unused2;
128};
129
130struct compat_semid64_ds {
131	struct compat_ipc64_perm sem_perm;
132	unsigned int sem_otime_high;
133	unsigned int sem_otime;
134	unsigned int sem_ctime_high;
135	unsigned int sem_ctime;
136	compat_ulong_t sem_nsems;
137	compat_ulong_t __unused3;
138	compat_ulong_t __unused4;
139};
140
141struct compat_msqid64_ds {
142	struct compat_ipc64_perm msg_perm;
143	unsigned int msg_stime_high;
144	unsigned int msg_stime;
145	unsigned int msg_rtime_high;
146	unsigned int msg_rtime;
147	unsigned int msg_ctime_high;
148	unsigned int msg_ctime;
149	compat_ulong_t msg_cbytes;
150	compat_ulong_t msg_qnum;
151	compat_ulong_t msg_qbytes;
152	compat_pid_t msg_lspid;
153	compat_pid_t msg_lrpid;
154	compat_ulong_t __unused4;
155	compat_ulong_t __unused5;
156};
157
158struct compat_shmid64_ds {
159	struct compat_ipc64_perm shm_perm;
160	unsigned int shm_atime_high;
161	unsigned int shm_atime;
162	unsigned int shm_dtime_high;
163	unsigned int shm_dtime;
164	unsigned int shm_ctime_high;
165	unsigned int shm_ctime;
166	unsigned int __unused4;
167	compat_size_t shm_segsz;
168	compat_pid_t shm_cpid;
169	compat_pid_t shm_lpid;
170	compat_ulong_t shm_nattch;
171	compat_ulong_t __unused5;
172	compat_ulong_t __unused6;
173};
174
175static inline int is_compat_task(void)
176{
177	return is_32bit_task();
178}
179
180#endif /* __KERNEL__ */
181#endif /* _ASM_POWERPC_COMPAT_H */
182