xref: /openbmc/linux/arch/arm64/include/asm/compat.h (revision 1a33b18b)
1caab277bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
23dd681d9SWill Deacon /*
33dd681d9SWill Deacon  * Copyright (C) 2012 ARM Ltd.
43dd681d9SWill Deacon  */
53dd681d9SWill Deacon #ifndef __ASM_COMPAT_H
63dd681d9SWill Deacon #define __ASM_COMPAT_H
7556d687aSArnd Bergmann 
8*1a33b18bSArnd Bergmann #define compat_mode_t compat_mode_t
9*1a33b18bSArnd Bergmann typedef u16		compat_mode_t;
10*1a33b18bSArnd Bergmann 
11556d687aSArnd Bergmann #include <asm-generic/compat.h>
12556d687aSArnd Bergmann 
133dd681d9SWill Deacon #ifdef CONFIG_COMPAT
143dd681d9SWill Deacon 
153dd681d9SWill Deacon /*
163dd681d9SWill Deacon  * Architecture specific compatibility types
173dd681d9SWill Deacon  */
183dd681d9SWill Deacon #include <linux/types.h>
193dd681d9SWill Deacon #include <linux/sched.h>
2068db0cf1SIngo Molnar #include <linux/sched/task_stack.h>
213dd681d9SWill Deacon 
223dd681d9SWill Deacon #define COMPAT_USER_HZ		100
23a795a38eSWill Deacon #ifdef __AARCH64EB__
24a795a38eSWill Deacon #define COMPAT_UTS_MACHINE	"armv8b\0\0"
25a795a38eSWill Deacon #else
263dd681d9SWill Deacon #define COMPAT_UTS_MACHINE	"armv8l\0\0"
27a795a38eSWill Deacon #endif
283dd681d9SWill Deacon 
29971a5b6fSVictor Kamensky typedef u16		__compat_uid_t;
30971a5b6fSVictor Kamensky typedef u16		__compat_gid_t;
31f15a2a12SCatalin Marinas typedef u16		__compat_uid16_t;
32f15a2a12SCatalin Marinas typedef u16		__compat_gid16_t;
333dd681d9SWill Deacon typedef u32		compat_dev_t;
34f15a2a12SCatalin Marinas typedef s32		compat_nlink_t;
353dd681d9SWill Deacon typedef u16		compat_ipc_pid_t;
363dd681d9SWill Deacon typedef __kernel_fsid_t	compat_fsid_t;
373dd681d9SWill Deacon 
383dd681d9SWill Deacon struct compat_stat {
39a795a38eSWill Deacon #ifdef __AARCH64EB__
40a795a38eSWill Deacon 	short		st_dev;
41a795a38eSWill Deacon 	short		__pad1;
42a795a38eSWill Deacon #else
433dd681d9SWill Deacon 	compat_dev_t	st_dev;
44a795a38eSWill Deacon #endif
453dd681d9SWill Deacon 	compat_ino_t	st_ino;
463dd681d9SWill Deacon 	compat_mode_t	st_mode;
47f15a2a12SCatalin Marinas 	compat_ushort_t	st_nlink;
48f15a2a12SCatalin Marinas 	__compat_uid16_t	st_uid;
49f15a2a12SCatalin Marinas 	__compat_gid16_t	st_gid;
50a795a38eSWill Deacon #ifdef __AARCH64EB__
51a795a38eSWill Deacon 	short		st_rdev;
52a795a38eSWill Deacon 	short		__pad2;
53a795a38eSWill Deacon #else
543dd681d9SWill Deacon 	compat_dev_t	st_rdev;
55a795a38eSWill Deacon #endif
563dd681d9SWill Deacon 	compat_off_t	st_size;
573dd681d9SWill Deacon 	compat_off_t	st_blksize;
583dd681d9SWill Deacon 	compat_off_t	st_blocks;
599afc5eeeSArnd Bergmann 	old_time32_t	st_atime;
60f15a2a12SCatalin Marinas 	compat_ulong_t	st_atime_nsec;
619afc5eeeSArnd Bergmann 	old_time32_t	st_mtime;
62f15a2a12SCatalin Marinas 	compat_ulong_t	st_mtime_nsec;
639afc5eeeSArnd Bergmann 	old_time32_t	st_ctime;
64f15a2a12SCatalin Marinas 	compat_ulong_t	st_ctime_nsec;
65f15a2a12SCatalin Marinas 	compat_ulong_t	__unused4[2];
663dd681d9SWill Deacon };
673dd681d9SWill Deacon 
683dd681d9SWill Deacon struct compat_flock {
693dd681d9SWill Deacon 	short		l_type;
703dd681d9SWill Deacon 	short		l_whence;
713dd681d9SWill Deacon 	compat_off_t	l_start;
723dd681d9SWill Deacon 	compat_off_t	l_len;
733dd681d9SWill Deacon 	compat_pid_t	l_pid;
743dd681d9SWill Deacon };
753dd681d9SWill Deacon 
763dd681d9SWill Deacon #define F_GETLK64	12	/*  using 'struct flock64' */
773dd681d9SWill Deacon #define F_SETLK64	13
783dd681d9SWill Deacon #define F_SETLKW64	14
793dd681d9SWill Deacon 
803dd681d9SWill Deacon struct compat_flock64 {
813dd681d9SWill Deacon 	short		l_type;
823dd681d9SWill Deacon 	short		l_whence;
833dd681d9SWill Deacon 	compat_loff_t	l_start;
843dd681d9SWill Deacon 	compat_loff_t	l_len;
853dd681d9SWill Deacon 	compat_pid_t	l_pid;
863dd681d9SWill Deacon };
873dd681d9SWill Deacon 
883dd681d9SWill Deacon struct compat_statfs {
893dd681d9SWill Deacon 	int		f_type;
903dd681d9SWill Deacon 	int		f_bsize;
913dd681d9SWill Deacon 	int		f_blocks;
923dd681d9SWill Deacon 	int		f_bfree;
933dd681d9SWill Deacon 	int		f_bavail;
943dd681d9SWill Deacon 	int		f_files;
953dd681d9SWill Deacon 	int		f_ffree;
963dd681d9SWill Deacon 	compat_fsid_t	f_fsid;
973dd681d9SWill Deacon 	int		f_namelen;	/* SunOS ignores this field. */
983dd681d9SWill Deacon 	int		f_frsize;
993dd681d9SWill Deacon 	int		f_flags;
1003dd681d9SWill Deacon 	int		f_spare[4];
1013dd681d9SWill Deacon };
1023dd681d9SWill Deacon 
1033dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY		0xffffffff
1043dd681d9SWill Deacon 
1053dd681d9SWill Deacon #define COMPAT_OFF_T_MAX	0x7fffffff
1063dd681d9SWill Deacon 
107adc235afSArnd Bergmann #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current)))
10824951465SWill Deacon #define COMPAT_MINSIGSTKSZ	2048
1099b064fc3SAl Viro 
1103dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len)
1113dd681d9SWill Deacon {
1129b064fc3SAl Viro 	return (void __user *)compat_user_stack_pointer() - len;
1133dd681d9SWill Deacon }
1143dd681d9SWill Deacon 
1153dd681d9SWill Deacon struct compat_ipc64_perm {
1163dd681d9SWill Deacon 	compat_key_t key;
1173dd681d9SWill Deacon 	__compat_uid32_t uid;
1183dd681d9SWill Deacon 	__compat_gid32_t gid;
1193dd681d9SWill Deacon 	__compat_uid32_t cuid;
1203dd681d9SWill Deacon 	__compat_gid32_t cgid;
1213dd681d9SWill Deacon 	unsigned short mode;
1223dd681d9SWill Deacon 	unsigned short __pad1;
1233dd681d9SWill Deacon 	unsigned short seq;
1243dd681d9SWill Deacon 	unsigned short __pad2;
1253dd681d9SWill Deacon 	compat_ulong_t unused1;
1263dd681d9SWill Deacon 	compat_ulong_t unused2;
1273dd681d9SWill Deacon };
1283dd681d9SWill Deacon 
1293dd681d9SWill Deacon struct compat_semid64_ds {
1303dd681d9SWill Deacon 	struct compat_ipc64_perm sem_perm;
13183335eb4SArnd Bergmann 	compat_ulong_t sem_otime;
13283335eb4SArnd Bergmann 	compat_ulong_t sem_otime_high;
13383335eb4SArnd Bergmann 	compat_ulong_t sem_ctime;
13483335eb4SArnd Bergmann 	compat_ulong_t sem_ctime_high;
1353dd681d9SWill Deacon 	compat_ulong_t sem_nsems;
1363dd681d9SWill Deacon 	compat_ulong_t __unused3;
1373dd681d9SWill Deacon 	compat_ulong_t __unused4;
1383dd681d9SWill Deacon };
1393dd681d9SWill Deacon 
1403dd681d9SWill Deacon struct compat_msqid64_ds {
1413dd681d9SWill Deacon 	struct compat_ipc64_perm msg_perm;
14283335eb4SArnd Bergmann 	compat_ulong_t msg_stime;
14383335eb4SArnd Bergmann 	compat_ulong_t msg_stime_high;
14483335eb4SArnd Bergmann 	compat_ulong_t msg_rtime;
14583335eb4SArnd Bergmann 	compat_ulong_t msg_rtime_high;
14683335eb4SArnd Bergmann 	compat_ulong_t msg_ctime;
14783335eb4SArnd Bergmann 	compat_ulong_t msg_ctime_high;
1483dd681d9SWill Deacon 	compat_ulong_t msg_cbytes;
1493dd681d9SWill Deacon 	compat_ulong_t msg_qnum;
1503dd681d9SWill Deacon 	compat_ulong_t msg_qbytes;
1513dd681d9SWill Deacon 	compat_pid_t   msg_lspid;
1523dd681d9SWill Deacon 	compat_pid_t   msg_lrpid;
1533dd681d9SWill Deacon 	compat_ulong_t __unused4;
1543dd681d9SWill Deacon 	compat_ulong_t __unused5;
1553dd681d9SWill Deacon };
1563dd681d9SWill Deacon 
1573dd681d9SWill Deacon struct compat_shmid64_ds {
1583dd681d9SWill Deacon 	struct compat_ipc64_perm shm_perm;
1593dd681d9SWill Deacon 	compat_size_t  shm_segsz;
16083335eb4SArnd Bergmann 	compat_ulong_t shm_atime;
16183335eb4SArnd Bergmann 	compat_ulong_t shm_atime_high;
16283335eb4SArnd Bergmann 	compat_ulong_t shm_dtime;
16383335eb4SArnd Bergmann 	compat_ulong_t shm_dtime_high;
16483335eb4SArnd Bergmann 	compat_ulong_t shm_ctime;
16583335eb4SArnd Bergmann 	compat_ulong_t shm_ctime_high;
1663dd681d9SWill Deacon 	compat_pid_t   shm_cpid;
1673dd681d9SWill Deacon 	compat_pid_t   shm_lpid;
1683dd681d9SWill Deacon 	compat_ulong_t shm_nattch;
1693dd681d9SWill Deacon 	compat_ulong_t __unused4;
1703dd681d9SWill Deacon 	compat_ulong_t __unused5;
1713dd681d9SWill Deacon };
1723dd681d9SWill Deacon 
1733dd681d9SWill Deacon static inline int is_compat_task(void)
1743dd681d9SWill Deacon {
1753dd681d9SWill Deacon 	return test_thread_flag(TIF_32BIT);
1763dd681d9SWill Deacon }
1773dd681d9SWill Deacon 
1783dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread)
1793dd681d9SWill Deacon {
1803dd681d9SWill Deacon 	return test_ti_thread_flag(thread, TIF_32BIT);
1813dd681d9SWill Deacon }
1823dd681d9SWill Deacon 
1833dd681d9SWill Deacon #else /* !CONFIG_COMPAT */
1843dd681d9SWill Deacon 
1853dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread)
1863dd681d9SWill Deacon {
1873dd681d9SWill Deacon 	return 0;
1883dd681d9SWill Deacon }
1893dd681d9SWill Deacon 
1903dd681d9SWill Deacon #endif /* CONFIG_COMPAT */
1913dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */
192