162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2012 ARM Ltd.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef __ASM_COMPAT_H
662306a36Sopenharmony_ci#define __ASM_COMPAT_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define compat_mode_t compat_mode_t
962306a36Sopenharmony_citypedef u16		compat_mode_t;
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define __compat_uid_t	__compat_uid_t
1262306a36Sopenharmony_citypedef u16		__compat_uid_t;
1362306a36Sopenharmony_citypedef u16		__compat_gid_t;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define compat_ipc_pid_t compat_ipc_pid_t
1662306a36Sopenharmony_citypedef u16		compat_ipc_pid_t;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define compat_statfs	compat_statfs
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <asm-generic/compat.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#ifdef CONFIG_COMPAT
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/*
2562306a36Sopenharmony_ci * Architecture specific compatibility types
2662306a36Sopenharmony_ci */
2762306a36Sopenharmony_ci#include <linux/types.h>
2862306a36Sopenharmony_ci#include <linux/sched.h>
2962306a36Sopenharmony_ci#include <linux/sched/task_stack.h>
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#ifdef __AARCH64EB__
3262306a36Sopenharmony_ci#define COMPAT_UTS_MACHINE	"armv8b\0\0"
3362306a36Sopenharmony_ci#else
3462306a36Sopenharmony_ci#define COMPAT_UTS_MACHINE	"armv8l\0\0"
3562306a36Sopenharmony_ci#endif
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_citypedef u16		__compat_uid16_t;
3862306a36Sopenharmony_citypedef u16		__compat_gid16_t;
3962306a36Sopenharmony_citypedef s32		compat_nlink_t;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct compat_stat {
4262306a36Sopenharmony_ci#ifdef __AARCH64EB__
4362306a36Sopenharmony_ci	short		st_dev;
4462306a36Sopenharmony_ci	short		__pad1;
4562306a36Sopenharmony_ci#else
4662306a36Sopenharmony_ci	compat_dev_t	st_dev;
4762306a36Sopenharmony_ci#endif
4862306a36Sopenharmony_ci	compat_ino_t	st_ino;
4962306a36Sopenharmony_ci	compat_mode_t	st_mode;
5062306a36Sopenharmony_ci	compat_ushort_t	st_nlink;
5162306a36Sopenharmony_ci	__compat_uid16_t	st_uid;
5262306a36Sopenharmony_ci	__compat_gid16_t	st_gid;
5362306a36Sopenharmony_ci#ifdef __AARCH64EB__
5462306a36Sopenharmony_ci	short		st_rdev;
5562306a36Sopenharmony_ci	short		__pad2;
5662306a36Sopenharmony_ci#else
5762306a36Sopenharmony_ci	compat_dev_t	st_rdev;
5862306a36Sopenharmony_ci#endif
5962306a36Sopenharmony_ci	compat_off_t	st_size;
6062306a36Sopenharmony_ci	compat_off_t	st_blksize;
6162306a36Sopenharmony_ci	compat_off_t	st_blocks;
6262306a36Sopenharmony_ci	old_time32_t	st_atime;
6362306a36Sopenharmony_ci	compat_ulong_t	st_atime_nsec;
6462306a36Sopenharmony_ci	old_time32_t	st_mtime;
6562306a36Sopenharmony_ci	compat_ulong_t	st_mtime_nsec;
6662306a36Sopenharmony_ci	old_time32_t	st_ctime;
6762306a36Sopenharmony_ci	compat_ulong_t	st_ctime_nsec;
6862306a36Sopenharmony_ci	compat_ulong_t	__unused4[2];
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct compat_statfs {
7262306a36Sopenharmony_ci	int		f_type;
7362306a36Sopenharmony_ci	int		f_bsize;
7462306a36Sopenharmony_ci	int		f_blocks;
7562306a36Sopenharmony_ci	int		f_bfree;
7662306a36Sopenharmony_ci	int		f_bavail;
7762306a36Sopenharmony_ci	int		f_files;
7862306a36Sopenharmony_ci	int		f_ffree;
7962306a36Sopenharmony_ci	compat_fsid_t	f_fsid;
8062306a36Sopenharmony_ci	int		f_namelen;	/* SunOS ignores this field. */
8162306a36Sopenharmony_ci	int		f_frsize;
8262306a36Sopenharmony_ci	int		f_flags;
8362306a36Sopenharmony_ci	int		f_spare[4];
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current)))
8762306a36Sopenharmony_ci#define COMPAT_MINSIGSTKSZ	2048
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistatic inline int is_compat_task(void)
9062306a36Sopenharmony_ci{
9162306a36Sopenharmony_ci	return test_thread_flag(TIF_32BIT);
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic inline int is_compat_thread(struct thread_info *thread)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	return test_ti_thread_flag(thread, TIF_32BIT);
9762306a36Sopenharmony_ci}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cilong compat_arm_syscall(struct pt_regs *regs, int scno);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#else /* !CONFIG_COMPAT */
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistatic inline int is_compat_thread(struct thread_info *thread)
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci	return 0;
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#endif /* CONFIG_COMPAT */
10962306a36Sopenharmony_ci#endif /* __ASM_COMPAT_H */
110