11965aae3c98397aad957412413c07e97b1bd4e64H. Peter Anvin#ifndef _ASM_X86_COMPAT_H 21965aae3c98397aad957412413c07e97b1bd4e64H. Peter Anvin#define _ASM_X86_COMPAT_H 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Architecture specific compatibility types 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h> 9d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#include <asm/processor.h> 1095d1b8f98138b1300bfecd8fbf3a93e10e74dc5fRoland McGrath#include <asm/user32.h> 11fca460f95e928bae373daa8295877b6905bc62b8H. Peter Anvin#include <asm/unistd.h> 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13e28cbf22933d0c0ccaf3c4c27a1a263b41f73859Christoph Hellwig#define COMPAT_USER_HZ 100 14e28cbf22933d0c0ccaf3c4c27a1a263b41f73859Christoph Hellwig#define COMPAT_UTS_MACHINE "i686\0\0" 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_size_t; 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_ssize_t; 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_time_t; 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_clock_t; 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_pid_t; 21202e5979af4d91c7ca05892641131dee22653259Stephen Rothwelltypedef u16 __compat_uid_t; 22202e5979af4d91c7ca05892641131dee22653259Stephen Rothwelltypedef u16 __compat_gid_t; 23202e5979af4d91c7ca05892641131dee22653259Stephen Rothwelltypedef u32 __compat_uid32_t; 24202e5979af4d91c7ca05892641131dee22653259Stephen Rothwelltypedef u32 __compat_gid32_t; 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u16 compat_mode_t; 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_ino_t; 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u16 compat_dev_t; 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_off_t; 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s64 compat_loff_t; 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u16 compat_nlink_t; 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u16 compat_ipc_pid_t; 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_daddr_t; 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_caddr_t; 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef __kernel_fsid_t compat_fsid_t; 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_timer_t; 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_key_t; 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_int_t; 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef s32 compat_long_t; 404b7775870b69129e640ed583c9b362d5cd66159dArnd Bergmanntypedef s64 __attribute__((aligned(4))) compat_s64; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_uint_t; 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_ulong_t; 434b7775870b69129e640ed583c9b362d5cd66159dArnd Bergmanntypedef u64 __attribute__((aligned(4))) compat_u64; 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_timespec { 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t tv_sec; 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s32 tv_nsec; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_timeval { 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t tv_sec; 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s32 tv_usec; 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_stat { 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_dev_t st_dev; 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 __pad1; 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ino_t st_ino; 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_mode_t st_mode; 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_nlink_t st_nlink; 61202e5979af4d91c7ca05892641131dee22653259Stephen Rothwell __compat_uid_t st_uid; 62202e5979af4d91c7ca05892641131dee22653259Stephen Rothwell __compat_gid_t st_gid; 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_dev_t st_rdev; 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 __pad2; 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_size; 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_blksize; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_blocks; 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_atime; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_atime_nsec; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_mtime; 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_mtime_nsec; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_ctime; 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 st_ctime_nsec; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 __unused4; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 __unused5; 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_flock { 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds short l_type; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds short l_whence; 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_off_t l_start; 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_off_t l_len; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_pid_t l_pid; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define F_GETLK64 12 /* using 'struct flock64' */ 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define F_SETLK64 13 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define F_SETLKW64 14 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IA32 uses 4 byte alignment for 64 bit quantities, 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so we need to pack this structure. 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_flock64 { 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds short l_type; 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds short l_whence; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_loff_t l_start; 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_loff_t l_len; 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_pid_t l_pid; 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __attribute__((packed)); 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_statfs { 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_type; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_bsize; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_blocks; 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_bfree; 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_bavail; 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_files; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_ffree; 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_fsid_t f_fsid; 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_namelen; /* SunOS ignores this field. */ 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int f_frsize; 1131448c721e4fa2faf742029a0403b4b787fccb7faEric W. Biederman int f_flags; 1141448c721e4fa2faf742029a0403b4b787fccb7faEric W. Biederman int f_spare[4]; 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMPAT_RLIM_INFINITY 0xffffffff 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_old_sigset_t; /* at least 32 bits */ 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPAT_NSIG 64 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPAT_NSIG_BPW 32 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_sigset_word; 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMPAT_OFF_T_MAX 0x7fffffff 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_ipc64_perm { 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_key_t key; 132202e5979af4d91c7ca05892641131dee22653259Stephen Rothwell __compat_uid32_t uid; 133202e5979af4d91c7ca05892641131dee22653259Stephen Rothwell __compat_gid32_t gid; 134202e5979af4d91c7ca05892641131dee22653259Stephen Rothwell __compat_uid32_t cuid; 135202e5979af4d91c7ca05892641131dee22653259Stephen Rothwell __compat_gid32_t cgid; 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short mode; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short __pad1; 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short seq; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short __pad2; 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t unused1; 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t unused2; 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_semid64_ds { 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct compat_ipc64_perm sem_perm; 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t sem_otime; 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused1; 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t sem_ctime; 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused2; 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t sem_nsems; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused3; 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused4; 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_msqid64_ds { 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct compat_ipc64_perm msg_perm; 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t msg_stime; 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused1; 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t msg_rtime; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused2; 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t msg_ctime; 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused3; 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t msg_cbytes; 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t msg_qnum; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t msg_qbytes; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_pid_t msg_lspid; 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_pid_t msg_lrpid; 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused4; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused5; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct compat_shmid64_ds { 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct compat_ipc64_perm shm_perm; 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_size_t shm_segsz; 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t shm_atime; 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused1; 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t shm_dtime; 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused2; 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_time_t shm_ctime; 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused3; 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_pid_t shm_cpid; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_pid_t shm_lpid; 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t shm_nattch; 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused4; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds compat_ulong_t __unused5; 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 18995d1b8f98138b1300bfecd8fbf3a93e10e74dc5fRoland McGrath * The type of struct elf_prstatus.pr_reg in compatible core dumps. 19095d1b8f98138b1300bfecd8fbf3a93e10e74dc5fRoland McGrath */ 191d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#ifdef CONFIG_X86_X32_ABI 192d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvintypedef struct user_regs_struct compat_elf_gregset_t; 193d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin 194d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#define PR_REG_SIZE(S) (test_thread_flag(TIF_IA32) ? 68 : 216) 195d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#define PRSTATUS_SIZE(S) (test_thread_flag(TIF_IA32) ? 144 : 296) 196d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#define SET_PR_FPVALID(S,V) \ 197d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0)) = (V); } \ 198d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin while (0) 199d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin 200d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#define COMPAT_USE_64BIT_TIME \ 201d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)) 202d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#else 20395d1b8f98138b1300bfecd8fbf3a93e10e74dc5fRoland McGrathtypedef struct user_regs_struct32 compat_elf_gregset_t; 204d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin#endif 20595d1b8f98138b1300bfecd8fbf3a93e10e74dc5fRoland McGrath 20695d1b8f98138b1300bfecd8fbf3a93e10e74dc5fRoland McGrath/* 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A pointer passed in from user mode. This should not 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * be used for syscall parameters, just declare them 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as pointers because the syscall entry code will have 2108b3de0df4eefc47ca2aa459b72dd8b2711f3640cMarcin Ĺšlusarz * appropriately converted them already. 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef u32 compat_uptr_t; 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void __user *compat_ptr(compat_uptr_t uptr) 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (void __user *)(unsigned long)uptr; 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline compat_uptr_t ptr_to_compat(void __user *uptr) 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (u32)(unsigned long)uptr; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 224c41d68a513c71e35a14f66d71782d27a79a81ea6H. Peter Anvinstatic inline void __user *arch_compat_alloc_user_space(long len) 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 226d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin compat_uptr_t sp; 227d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin 228d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin if (test_thread_flag(TIF_IA32)) { 229d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin sp = task_pt_regs(current)->sp; 230d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin } else { 231d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin /* -128 for the x32 ABI redzone */ 232d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin sp = percpu_read(old_rsp) - 128; 233d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin } 234d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin 235d1a797f388d6d30fa502915d1b9937ed758b7137H. Peter Anvin return (void __user *)round_down(sp - len, 16); 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 238a628b684d27d22631d1819890f13047ae9075241H. Peter Anvinstatic inline bool is_x32_task(void) 239a628b684d27d22631d1819890f13047ae9075241H. Peter Anvin{ 240fca460f95e928bae373daa8295877b6905bc62b8H. Peter Anvin#ifdef CONFIG_X86_X32_ABI 241fca460f95e928bae373daa8295877b6905bc62b8H. Peter Anvin if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) 242fca460f95e928bae373daa8295877b6905bc62b8H. Peter Anvin return true; 243fca460f95e928bae373daa8295877b6905bc62b8H. Peter Anvin#endif 244fca460f95e928bae373daa8295877b6905bc62b8H. Peter Anvin return false; 245bf2fcc6fdfe4f4e92bb74f062c0a1be189f3a561Andi Kleen} 246bf2fcc6fdfe4f4e92bb74f062c0a1be189f3a561Andi Kleen 247a628b684d27d22631d1819890f13047ae9075241H. Peter Anvinstatic inline bool is_compat_task(void) 248a628b684d27d22631d1819890f13047ae9075241H. Peter Anvin{ 249a628b684d27d22631d1819890f13047ae9075241H. Peter Anvin return is_ia32_task() || is_x32_task(); 250a628b684d27d22631d1819890f13047ae9075241H. Peter Anvin} 251a628b684d27d22631d1819890f13047ae9075241H. Peter Anvin 2521965aae3c98397aad957412413c07e97b1bd4e64H. Peter Anvin#endif /* _ASM_X86_COMPAT_H */ 253