xref: /openbmc/linux/arch/arm64/include/asm/compat.h (revision 556d687a)
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 
8556d687aSArnd Bergmann #include <asm-generic/compat.h>
9556d687aSArnd Bergmann 
103dd681d9SWill Deacon #ifdef CONFIG_COMPAT
113dd681d9SWill Deacon 
123dd681d9SWill Deacon /*
133dd681d9SWill Deacon  * Architecture specific compatibility types
143dd681d9SWill Deacon  */
153dd681d9SWill Deacon #include <linux/types.h>
163dd681d9SWill Deacon #include <linux/sched.h>
1768db0cf1SIngo Molnar #include <linux/sched/task_stack.h>
183dd681d9SWill Deacon 
193dd681d9SWill Deacon #define COMPAT_USER_HZ		100
20a795a38eSWill Deacon #ifdef __AARCH64EB__
21a795a38eSWill Deacon #define COMPAT_UTS_MACHINE	"armv8b\0\0"
22a795a38eSWill Deacon #else
233dd681d9SWill Deacon #define COMPAT_UTS_MACHINE	"armv8l\0\0"
24a795a38eSWill Deacon #endif
253dd681d9SWill Deacon 
26971a5b6fSVictor Kamensky typedef u16		__compat_uid_t;
27971a5b6fSVictor Kamensky typedef u16		__compat_gid_t;
28f15a2a12SCatalin Marinas typedef u16		__compat_uid16_t;
29f15a2a12SCatalin Marinas typedef u16		__compat_gid16_t;
303dd681d9SWill Deacon typedef u32		__compat_uid32_t;
313dd681d9SWill Deacon typedef u32		__compat_gid32_t;
32f15a2a12SCatalin Marinas typedef u16		compat_mode_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 u32		compat_caddr_t;
373dd681d9SWill Deacon typedef __kernel_fsid_t	compat_fsid_t;
383dd681d9SWill Deacon typedef s64		compat_s64;
393dd681d9SWill Deacon typedef u64		compat_u64;
403dd681d9SWill Deacon 
413dd681d9SWill Deacon struct compat_stat {
42a795a38eSWill Deacon #ifdef __AARCH64EB__
43a795a38eSWill Deacon 	short		st_dev;
44a795a38eSWill Deacon 	short		__pad1;
45a795a38eSWill Deacon #else
463dd681d9SWill Deacon 	compat_dev_t	st_dev;
47a795a38eSWill Deacon #endif
483dd681d9SWill Deacon 	compat_ino_t	st_ino;
493dd681d9SWill Deacon 	compat_mode_t	st_mode;
50f15a2a12SCatalin Marinas 	compat_ushort_t	st_nlink;
51f15a2a12SCatalin Marinas 	__compat_uid16_t	st_uid;
52f15a2a12SCatalin Marinas 	__compat_gid16_t	st_gid;
53a795a38eSWill Deacon #ifdef __AARCH64EB__
54a795a38eSWill Deacon 	short		st_rdev;
55a795a38eSWill Deacon 	short		__pad2;
56a795a38eSWill Deacon #else
573dd681d9SWill Deacon 	compat_dev_t	st_rdev;
58a795a38eSWill Deacon #endif
593dd681d9SWill Deacon 	compat_off_t	st_size;
603dd681d9SWill Deacon 	compat_off_t	st_blksize;
613dd681d9SWill Deacon 	compat_off_t	st_blocks;
629afc5eeeSArnd Bergmann 	old_time32_t	st_atime;
63f15a2a12SCatalin Marinas 	compat_ulong_t	st_atime_nsec;
649afc5eeeSArnd Bergmann 	old_time32_t	st_mtime;
65f15a2a12SCatalin Marinas 	compat_ulong_t	st_mtime_nsec;
669afc5eeeSArnd Bergmann 	old_time32_t	st_ctime;
67f15a2a12SCatalin Marinas 	compat_ulong_t	st_ctime_nsec;
68f15a2a12SCatalin Marinas 	compat_ulong_t	__unused4[2];
693dd681d9SWill Deacon };
703dd681d9SWill Deacon 
713dd681d9SWill Deacon struct compat_flock {
723dd681d9SWill Deacon 	short		l_type;
733dd681d9SWill Deacon 	short		l_whence;
743dd681d9SWill Deacon 	compat_off_t	l_start;
753dd681d9SWill Deacon 	compat_off_t	l_len;
763dd681d9SWill Deacon 	compat_pid_t	l_pid;
773dd681d9SWill Deacon };
783dd681d9SWill Deacon 
793dd681d9SWill Deacon #define F_GETLK64	12	/*  using 'struct flock64' */
803dd681d9SWill Deacon #define F_SETLK64	13
813dd681d9SWill Deacon #define F_SETLKW64	14
823dd681d9SWill Deacon 
833dd681d9SWill Deacon struct compat_flock64 {
843dd681d9SWill Deacon 	short		l_type;
853dd681d9SWill Deacon 	short		l_whence;
863dd681d9SWill Deacon 	compat_loff_t	l_start;
873dd681d9SWill Deacon 	compat_loff_t	l_len;
883dd681d9SWill Deacon 	compat_pid_t	l_pid;
893dd681d9SWill Deacon };
903dd681d9SWill Deacon 
913dd681d9SWill Deacon struct compat_statfs {
923dd681d9SWill Deacon 	int		f_type;
933dd681d9SWill Deacon 	int		f_bsize;
943dd681d9SWill Deacon 	int		f_blocks;
953dd681d9SWill Deacon 	int		f_bfree;
963dd681d9SWill Deacon 	int		f_bavail;
973dd681d9SWill Deacon 	int		f_files;
983dd681d9SWill Deacon 	int		f_ffree;
993dd681d9SWill Deacon 	compat_fsid_t	f_fsid;
1003dd681d9SWill Deacon 	int		f_namelen;	/* SunOS ignores this field. */
1013dd681d9SWill Deacon 	int		f_frsize;
1023dd681d9SWill Deacon 	int		f_flags;
1033dd681d9SWill Deacon 	int		f_spare[4];
1043dd681d9SWill Deacon };
1053dd681d9SWill Deacon 
1063dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY		0xffffffff
1073dd681d9SWill Deacon 
1083dd681d9SWill Deacon typedef u32		compat_old_sigset_t;
1093dd681d9SWill Deacon 
1103dd681d9SWill Deacon #define _COMPAT_NSIG		64
1113dd681d9SWill Deacon #define _COMPAT_NSIG_BPW	32
1123dd681d9SWill Deacon 
1133dd681d9SWill Deacon typedef u32		compat_sigset_word;
1143dd681d9SWill Deacon 
1153dd681d9SWill Deacon #define COMPAT_OFF_T_MAX	0x7fffffff
1163dd681d9SWill Deacon 
1173dd681d9SWill Deacon /*
1183dd681d9SWill Deacon  * A pointer passed in from user mode. This should not
1193dd681d9SWill Deacon  * be used for syscall parameters, just declare them
1203dd681d9SWill Deacon  * as pointers because the syscall entry code will have
1213dd681d9SWill Deacon  * appropriately converted them already.
1223dd681d9SWill Deacon  */
1233dd681d9SWill Deacon 
1243dd681d9SWill Deacon static inline void __user *compat_ptr(compat_uptr_t uptr)
1253dd681d9SWill Deacon {
1263dd681d9SWill Deacon 	return (void __user *)(unsigned long)uptr;
1273dd681d9SWill Deacon }
1283dd681d9SWill Deacon 
1293dd681d9SWill Deacon static inline compat_uptr_t ptr_to_compat(void __user *uptr)
1303dd681d9SWill Deacon {
1313dd681d9SWill Deacon 	return (u32)(unsigned long)uptr;
1323dd681d9SWill Deacon }
1333dd681d9SWill Deacon 
134adc235afSArnd Bergmann #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current)))
13524951465SWill Deacon #define COMPAT_MINSIGSTKSZ	2048
1369b064fc3SAl Viro 
1373dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len)
1383dd681d9SWill Deacon {
1399b064fc3SAl Viro 	return (void __user *)compat_user_stack_pointer() - len;
1403dd681d9SWill Deacon }
1413dd681d9SWill Deacon 
1423dd681d9SWill Deacon struct compat_ipc64_perm {
1433dd681d9SWill Deacon 	compat_key_t key;
1443dd681d9SWill Deacon 	__compat_uid32_t uid;
1453dd681d9SWill Deacon 	__compat_gid32_t gid;
1463dd681d9SWill Deacon 	__compat_uid32_t cuid;
1473dd681d9SWill Deacon 	__compat_gid32_t cgid;
1483dd681d9SWill Deacon 	unsigned short mode;
1493dd681d9SWill Deacon 	unsigned short __pad1;
1503dd681d9SWill Deacon 	unsigned short seq;
1513dd681d9SWill Deacon 	unsigned short __pad2;
1523dd681d9SWill Deacon 	compat_ulong_t unused1;
1533dd681d9SWill Deacon 	compat_ulong_t unused2;
1543dd681d9SWill Deacon };
1553dd681d9SWill Deacon 
1563dd681d9SWill Deacon struct compat_semid64_ds {
1573dd681d9SWill Deacon 	struct compat_ipc64_perm sem_perm;
15883335eb4SArnd Bergmann 	compat_ulong_t sem_otime;
15983335eb4SArnd Bergmann 	compat_ulong_t sem_otime_high;
16083335eb4SArnd Bergmann 	compat_ulong_t sem_ctime;
16183335eb4SArnd Bergmann 	compat_ulong_t sem_ctime_high;
1623dd681d9SWill Deacon 	compat_ulong_t sem_nsems;
1633dd681d9SWill Deacon 	compat_ulong_t __unused3;
1643dd681d9SWill Deacon 	compat_ulong_t __unused4;
1653dd681d9SWill Deacon };
1663dd681d9SWill Deacon 
1673dd681d9SWill Deacon struct compat_msqid64_ds {
1683dd681d9SWill Deacon 	struct compat_ipc64_perm msg_perm;
16983335eb4SArnd Bergmann 	compat_ulong_t msg_stime;
17083335eb4SArnd Bergmann 	compat_ulong_t msg_stime_high;
17183335eb4SArnd Bergmann 	compat_ulong_t msg_rtime;
17283335eb4SArnd Bergmann 	compat_ulong_t msg_rtime_high;
17383335eb4SArnd Bergmann 	compat_ulong_t msg_ctime;
17483335eb4SArnd Bergmann 	compat_ulong_t msg_ctime_high;
1753dd681d9SWill Deacon 	compat_ulong_t msg_cbytes;
1763dd681d9SWill Deacon 	compat_ulong_t msg_qnum;
1773dd681d9SWill Deacon 	compat_ulong_t msg_qbytes;
1783dd681d9SWill Deacon 	compat_pid_t   msg_lspid;
1793dd681d9SWill Deacon 	compat_pid_t   msg_lrpid;
1803dd681d9SWill Deacon 	compat_ulong_t __unused4;
1813dd681d9SWill Deacon 	compat_ulong_t __unused5;
1823dd681d9SWill Deacon };
1833dd681d9SWill Deacon 
1843dd681d9SWill Deacon struct compat_shmid64_ds {
1853dd681d9SWill Deacon 	struct compat_ipc64_perm shm_perm;
1863dd681d9SWill Deacon 	compat_size_t  shm_segsz;
18783335eb4SArnd Bergmann 	compat_ulong_t shm_atime;
18883335eb4SArnd Bergmann 	compat_ulong_t shm_atime_high;
18983335eb4SArnd Bergmann 	compat_ulong_t shm_dtime;
19083335eb4SArnd Bergmann 	compat_ulong_t shm_dtime_high;
19183335eb4SArnd Bergmann 	compat_ulong_t shm_ctime;
19283335eb4SArnd Bergmann 	compat_ulong_t shm_ctime_high;
1933dd681d9SWill Deacon 	compat_pid_t   shm_cpid;
1943dd681d9SWill Deacon 	compat_pid_t   shm_lpid;
1953dd681d9SWill Deacon 	compat_ulong_t shm_nattch;
1963dd681d9SWill Deacon 	compat_ulong_t __unused4;
1973dd681d9SWill Deacon 	compat_ulong_t __unused5;
1983dd681d9SWill Deacon };
1993dd681d9SWill Deacon 
2003dd681d9SWill Deacon static inline int is_compat_task(void)
2013dd681d9SWill Deacon {
2023dd681d9SWill Deacon 	return test_thread_flag(TIF_32BIT);
2033dd681d9SWill Deacon }
2043dd681d9SWill Deacon 
2053dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread)
2063dd681d9SWill Deacon {
2073dd681d9SWill Deacon 	return test_ti_thread_flag(thread, TIF_32BIT);
2083dd681d9SWill Deacon }
2093dd681d9SWill Deacon 
2103dd681d9SWill Deacon #else /* !CONFIG_COMPAT */
2113dd681d9SWill Deacon 
2123dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread)
2133dd681d9SWill Deacon {
2143dd681d9SWill Deacon 	return 0;
2153dd681d9SWill Deacon }
2163dd681d9SWill Deacon 
2173dd681d9SWill Deacon #endif /* CONFIG_COMPAT */
2183dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */
219