compat.h (2405B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _ASM_X86_COMPAT_H 3#define _ASM_X86_COMPAT_H 4 5/* 6 * Architecture specific compatibility types 7 */ 8#include <linux/types.h> 9#include <linux/sched.h> 10#include <linux/sched/task_stack.h> 11#include <asm/processor.h> 12#include <asm/user32.h> 13#include <asm/unistd.h> 14 15#define compat_mode_t compat_mode_t 16typedef u16 compat_mode_t; 17 18#define __compat_uid_t __compat_uid_t 19typedef u16 __compat_uid_t; 20typedef u16 __compat_gid_t; 21 22#define compat_dev_t compat_dev_t 23typedef u16 compat_dev_t; 24 25#define compat_ipc_pid_t compat_ipc_pid_t 26typedef u16 compat_ipc_pid_t; 27 28#define compat_statfs compat_statfs 29 30#include <asm-generic/compat.h> 31 32#define COMPAT_UTS_MACHINE "i686\0\0" 33 34typedef u16 compat_nlink_t; 35 36struct compat_stat { 37 u32 st_dev; 38 compat_ino_t st_ino; 39 compat_mode_t st_mode; 40 compat_nlink_t st_nlink; 41 __compat_uid_t st_uid; 42 __compat_gid_t st_gid; 43 u32 st_rdev; 44 u32 st_size; 45 u32 st_blksize; 46 u32 st_blocks; 47 u32 st_atime; 48 u32 st_atime_nsec; 49 u32 st_mtime; 50 u32 st_mtime_nsec; 51 u32 st_ctime; 52 u32 st_ctime_nsec; 53 u32 __unused4; 54 u32 __unused5; 55}; 56 57/* 58 * IA32 uses 4 byte alignment for 64 bit quantities, so we need to pack the 59 * compat flock64 structure. 60 */ 61#define __ARCH_NEED_COMPAT_FLOCK64_PACKED 62 63struct compat_statfs { 64 int f_type; 65 int f_bsize; 66 int f_blocks; 67 int f_bfree; 68 int f_bavail; 69 int f_files; 70 int f_ffree; 71 compat_fsid_t f_fsid; 72 int f_namelen; /* SunOS ignores this field. */ 73 int f_frsize; 74 int f_flags; 75 int f_spare[4]; 76}; 77 78#ifdef CONFIG_X86_X32_ABI 79#define COMPAT_USE_64BIT_TIME \ 80 (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)) 81#endif 82 83static inline bool in_x32_syscall(void) 84{ 85#ifdef CONFIG_X86_X32_ABI 86 if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) 87 return true; 88#endif 89 return false; 90} 91 92static inline bool in_32bit_syscall(void) 93{ 94 return in_ia32_syscall() || in_x32_syscall(); 95} 96 97#ifdef CONFIG_COMPAT 98static inline bool in_compat_syscall(void) 99{ 100 return in_32bit_syscall(); 101} 102#define in_compat_syscall in_compat_syscall /* override the generic impl */ 103#define compat_need_64bit_alignment_fixup in_ia32_syscall 104#endif 105 106struct compat_siginfo; 107 108#ifdef CONFIG_X86_X32_ABI 109int copy_siginfo_to_user32(struct compat_siginfo __user *to, 110 const kernel_siginfo_t *from); 111#define copy_siginfo_to_user32 copy_siginfo_to_user32 112#endif /* CONFIG_X86_X32_ABI */ 113 114#endif /* _ASM_X86_COMPAT_H */