diff options
Diffstat (limited to 'arch/x86/include')
-rw-r--r-- | arch/x86/include/asm/Kbuild | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/compat.h | 49 | ||||
-rw-r--r-- | arch/x86/include/asm/elf.h | 31 | ||||
-rw-r--r-- | arch/x86/include/asm/ia32.h | 18 | ||||
-rw-r--r-- | arch/x86/include/asm/mtrr.h | 28 | ||||
-rw-r--r-- | arch/x86/include/asm/posix_types.h | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/posix_types_32.h | 75 | ||||
-rw-r--r-- | arch/x86/include/asm/posix_types_64.h | 106 | ||||
-rw-r--r-- | arch/x86/include/asm/posix_types_x32.h | 19 | ||||
-rw-r--r-- | arch/x86/include/asm/processor.h | 10 | ||||
-rw-r--r-- | arch/x86/include/asm/ptrace.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/sigcontext.h | 57 | ||||
-rw-r--r-- | arch/x86/include/asm/sigframe.h | 13 | ||||
-rw-r--r-- | arch/x86/include/asm/sighandling.h | 24 | ||||
-rw-r--r-- | arch/x86/include/asm/sys_ia32.h | 7 | ||||
-rw-r--r-- | arch/x86/include/asm/syscall.h | 5 | ||||
-rw-r--r-- | arch/x86/include/asm/thread_info.h | 6 | ||||
-rw-r--r-- | arch/x86/include/asm/unistd.h | 15 |
18 files changed, 244 insertions, 226 deletions
diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild index b57e6a43a37a..f9c0d3ba9e84 100644 --- a/arch/x86/include/asm/Kbuild +++ b/arch/x86/include/asm/Kbuild | |||
@@ -14,6 +14,7 @@ header-y += msr.h | |||
14 | header-y += mtrr.h | 14 | header-y += mtrr.h |
15 | header-y += posix_types_32.h | 15 | header-y += posix_types_32.h |
16 | header-y += posix_types_64.h | 16 | header-y += posix_types_64.h |
17 | header-y += posix_types_x32.h | ||
17 | header-y += prctl.h | 18 | header-y += prctl.h |
18 | header-y += processor-flags.h | 19 | header-y += processor-flags.h |
19 | header-y += ptrace-abi.h | 20 | header-y += ptrace-abi.h |
@@ -24,3 +25,4 @@ header-y += vsyscall.h | |||
24 | 25 | ||
25 | genhdr-y += unistd_32.h | 26 | genhdr-y += unistd_32.h |
26 | genhdr-y += unistd_64.h | 27 | genhdr-y += unistd_64.h |
28 | genhdr-y += unistd_x32.h | ||
diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h index 30d737ef2a42..355edc091604 100644 --- a/arch/x86/include/asm/compat.h +++ b/arch/x86/include/asm/compat.h | |||
@@ -6,7 +6,9 @@ | |||
6 | */ | 6 | */ |
7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
8 | #include <linux/sched.h> | 8 | #include <linux/sched.h> |
9 | #include <asm/processor.h> | ||
9 | #include <asm/user32.h> | 10 | #include <asm/user32.h> |
11 | #include <asm/unistd.h> | ||
10 | 12 | ||
11 | #define COMPAT_USER_HZ 100 | 13 | #define COMPAT_USER_HZ 100 |
12 | #define COMPAT_UTS_MACHINE "i686\0\0" | 14 | #define COMPAT_UTS_MACHINE "i686\0\0" |
@@ -186,7 +188,20 @@ struct compat_shmid64_ds { | |||
186 | /* | 188 | /* |
187 | * The type of struct elf_prstatus.pr_reg in compatible core dumps. | 189 | * The type of struct elf_prstatus.pr_reg in compatible core dumps. |
188 | */ | 190 | */ |
191 | #ifdef CONFIG_X86_X32_ABI | ||
192 | typedef struct user_regs_struct compat_elf_gregset_t; | ||
193 | |||
194 | #define PR_REG_SIZE(S) (test_thread_flag(TIF_IA32) ? 68 : 216) | ||
195 | #define PRSTATUS_SIZE(S) (test_thread_flag(TIF_IA32) ? 144 : 296) | ||
196 | #define SET_PR_FPVALID(S,V) \ | ||
197 | do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0)) = (V); } \ | ||
198 | while (0) | ||
199 | |||
200 | #define COMPAT_USE_64BIT_TIME \ | ||
201 | (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)) | ||
202 | #else | ||
189 | typedef struct user_regs_struct32 compat_elf_gregset_t; | 203 | typedef struct user_regs_struct32 compat_elf_gregset_t; |
204 | #endif | ||
190 | 205 | ||
191 | /* | 206 | /* |
192 | * A pointer passed in from user mode. This should not | 207 | * A pointer passed in from user mode. This should not |
@@ -208,13 +223,39 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) | |||
208 | 223 | ||
209 | static inline void __user *arch_compat_alloc_user_space(long len) | 224 | static inline void __user *arch_compat_alloc_user_space(long len) |
210 | { | 225 | { |
211 | struct pt_regs *regs = task_pt_regs(current); | 226 | compat_uptr_t sp; |
212 | return (void __user *)regs->sp - len; | 227 | |
228 | if (test_thread_flag(TIF_IA32)) { | ||
229 | sp = task_pt_regs(current)->sp; | ||
230 | } else { | ||
231 | /* -128 for the x32 ABI redzone */ | ||
232 | sp = percpu_read(old_rsp) - 128; | ||
233 | } | ||
234 | |||
235 | return (void __user *)round_down(sp - len, 16); | ||
236 | } | ||
237 | |||
238 | static inline bool is_ia32_task(void) | ||
239 | { | ||
240 | #ifdef CONFIG_IA32_EMULATION | ||
241 | if (current_thread_info()->status & TS_COMPAT) | ||
242 | return true; | ||
243 | #endif | ||
244 | return false; | ||
245 | } | ||
246 | |||
247 | static inline bool is_x32_task(void) | ||
248 | { | ||
249 | #ifdef CONFIG_X86_X32_ABI | ||
250 | if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) | ||
251 | return true; | ||
252 | #endif | ||
253 | return false; | ||
213 | } | 254 | } |
214 | 255 | ||
215 | static inline int is_compat_task(void) | 256 | static inline bool is_compat_task(void) |
216 | { | 257 | { |
217 | return current_thread_info()->status & TS_COMPAT; | 258 | return is_ia32_task() || is_x32_task(); |
218 | } | 259 | } |
219 | 260 | ||
220 | #endif /* _ASM_X86_COMPAT_H */ | 261 | #endif /* _ASM_X86_COMPAT_H */ |
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index f27f79abe021..5939f44fe0c0 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h | |||
@@ -155,7 +155,12 @@ do { \ | |||
155 | #define elf_check_arch(x) \ | 155 | #define elf_check_arch(x) \ |
156 | ((x)->e_machine == EM_X86_64) | 156 | ((x)->e_machine == EM_X86_64) |
157 | 157 | ||
158 | #define compat_elf_check_arch(x) elf_check_arch_ia32(x) | 158 | #define compat_elf_check_arch(x) \ |
159 | (elf_check_arch_ia32(x) || (x)->e_machine == EM_X86_64) | ||
160 | |||
161 | #if __USER32_DS != __USER_DS | ||
162 | # error "The following code assumes __USER32_DS == __USER_DS" | ||
163 | #endif | ||
159 | 164 | ||
160 | static inline void elf_common_init(struct thread_struct *t, | 165 | static inline void elf_common_init(struct thread_struct *t, |
161 | struct pt_regs *regs, const u16 ds) | 166 | struct pt_regs *regs, const u16 ds) |
@@ -178,8 +183,9 @@ static inline void elf_common_init(struct thread_struct *t, | |||
178 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); | 183 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); |
179 | #define compat_start_thread start_thread_ia32 | 184 | #define compat_start_thread start_thread_ia32 |
180 | 185 | ||
181 | void set_personality_ia32(void); | 186 | void set_personality_ia32(bool); |
182 | #define COMPAT_SET_PERSONALITY(ex) set_personality_ia32() | 187 | #define COMPAT_SET_PERSONALITY(ex) \ |
188 | set_personality_ia32((ex).e_machine == EM_X86_64) | ||
183 | 189 | ||
184 | #define COMPAT_ELF_PLATFORM ("i686") | 190 | #define COMPAT_ELF_PLATFORM ("i686") |
185 | 191 | ||
@@ -286,7 +292,7 @@ do { \ | |||
286 | #define VDSO_HIGH_BASE 0xffffe000U /* CONFIG_COMPAT_VDSO address */ | 292 | #define VDSO_HIGH_BASE 0xffffe000U /* CONFIG_COMPAT_VDSO address */ |
287 | 293 | ||
288 | /* 1GB for 64bit, 8MB for 32bit */ | 294 | /* 1GB for 64bit, 8MB for 32bit */ |
289 | #define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff) | 295 | #define STACK_RND_MASK (test_thread_flag(TIF_ADDR32) ? 0x7ff : 0x3fffff) |
290 | 296 | ||
291 | #define ARCH_DLINFO \ | 297 | #define ARCH_DLINFO \ |
292 | do { \ | 298 | do { \ |
@@ -295,9 +301,20 @@ do { \ | |||
295 | (unsigned long)current->mm->context.vdso); \ | 301 | (unsigned long)current->mm->context.vdso); \ |
296 | } while (0) | 302 | } while (0) |
297 | 303 | ||
304 | #define ARCH_DLINFO_X32 \ | ||
305 | do { \ | ||
306 | if (vdso_enabled) \ | ||
307 | NEW_AUX_ENT(AT_SYSINFO_EHDR, \ | ||
308 | (unsigned long)current->mm->context.vdso); \ | ||
309 | } while (0) | ||
310 | |||
298 | #define AT_SYSINFO 32 | 311 | #define AT_SYSINFO 32 |
299 | 312 | ||
300 | #define COMPAT_ARCH_DLINFO ARCH_DLINFO_IA32(sysctl_vsyscall32) | 313 | #define COMPAT_ARCH_DLINFO \ |
314 | if (test_thread_flag(TIF_X32)) \ | ||
315 | ARCH_DLINFO_X32; \ | ||
316 | else \ | ||
317 | ARCH_DLINFO_IA32(sysctl_vsyscall32) | ||
301 | 318 | ||
302 | #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) | 319 | #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) |
303 | 320 | ||
@@ -313,6 +330,8 @@ struct linux_binprm; | |||
313 | #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 | 330 | #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 |
314 | extern int arch_setup_additional_pages(struct linux_binprm *bprm, | 331 | extern int arch_setup_additional_pages(struct linux_binprm *bprm, |
315 | int uses_interp); | 332 | int uses_interp); |
333 | extern int x32_setup_additional_pages(struct linux_binprm *bprm, | ||
334 | int uses_interp); | ||
316 | 335 | ||
317 | extern int syscall32_setup_pages(struct linux_binprm *, int exstack); | 336 | extern int syscall32_setup_pages(struct linux_binprm *, int exstack); |
318 | #define compat_arch_setup_additional_pages syscall32_setup_pages | 337 | #define compat_arch_setup_additional_pages syscall32_setup_pages |
@@ -329,7 +348,7 @@ static inline int mmap_is_ia32(void) | |||
329 | return 1; | 348 | return 1; |
330 | #endif | 349 | #endif |
331 | #ifdef CONFIG_IA32_EMULATION | 350 | #ifdef CONFIG_IA32_EMULATION |
332 | if (test_thread_flag(TIF_IA32)) | 351 | if (test_thread_flag(TIF_ADDR32)) |
333 | return 1; | 352 | return 1; |
334 | #endif | 353 | #endif |
335 | return 0; | 354 | return 0; |
diff --git a/arch/x86/include/asm/ia32.h b/arch/x86/include/asm/ia32.h index 1f7e62517284..ee52760549f0 100644 --- a/arch/x86/include/asm/ia32.h +++ b/arch/x86/include/asm/ia32.h | |||
@@ -43,6 +43,15 @@ struct ucontext_ia32 { | |||
43 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | 43 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ |
44 | }; | 44 | }; |
45 | 45 | ||
46 | struct ucontext_x32 { | ||
47 | unsigned int uc_flags; | ||
48 | unsigned int uc_link; | ||
49 | stack_ia32_t uc_stack; | ||
50 | unsigned int uc__pad0; /* needed for alignment */ | ||
51 | struct sigcontext uc_mcontext; /* the 64-bit sigcontext type */ | ||
52 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | ||
53 | }; | ||
54 | |||
46 | /* This matches struct stat64 in glibc2.2, hence the absolutely | 55 | /* This matches struct stat64 in glibc2.2, hence the absolutely |
47 | * insane amounts of padding around dev_t's. | 56 | * insane amounts of padding around dev_t's. |
48 | */ | 57 | */ |
@@ -116,6 +125,15 @@ typedef struct compat_siginfo { | |||
116 | compat_clock_t _stime; | 125 | compat_clock_t _stime; |
117 | } _sigchld; | 126 | } _sigchld; |
118 | 127 | ||
128 | /* SIGCHLD (x32 version) */ | ||
129 | struct { | ||
130 | unsigned int _pid; /* which child */ | ||
131 | unsigned int _uid; /* sender's uid */ | ||
132 | int _status; /* exit code */ | ||
133 | compat_s64 _utime; | ||
134 | compat_s64 _stime; | ||
135 | } _sigchld_x32; | ||
136 | |||
119 | /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ | 137 | /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ |
120 | struct { | 138 | struct { |
121 | unsigned int _addr; /* faulting insn/memory ref. */ | 139 | unsigned int _addr; /* faulting insn/memory ref. */ |
diff --git a/arch/x86/include/asm/mtrr.h b/arch/x86/include/asm/mtrr.h index 4365ffdb461f..7e3f17f92c66 100644 --- a/arch/x86/include/asm/mtrr.h +++ b/arch/x86/include/asm/mtrr.h | |||
@@ -29,18 +29,18 @@ | |||
29 | 29 | ||
30 | #define MTRR_IOCTL_BASE 'M' | 30 | #define MTRR_IOCTL_BASE 'M' |
31 | 31 | ||
32 | struct mtrr_sentry { | ||
33 | unsigned long base; /* Base address */ | ||
34 | unsigned int size; /* Size of region */ | ||
35 | unsigned int type; /* Type of region */ | ||
36 | }; | ||
37 | |||
38 | /* Warning: this structure has a different order from i386 | 32 | /* Warning: this structure has a different order from i386 |
39 | on x86-64. The 32bit emulation code takes care of that. | 33 | on x86-64. The 32bit emulation code takes care of that. |
40 | But you need to use this for 64bit, otherwise your X server | 34 | But you need to use this for 64bit, otherwise your X server |
41 | will break. */ | 35 | will break. */ |
42 | 36 | ||
43 | #ifdef __i386__ | 37 | #ifdef __i386__ |
38 | struct mtrr_sentry { | ||
39 | unsigned long base; /* Base address */ | ||
40 | unsigned int size; /* Size of region */ | ||
41 | unsigned int type; /* Type of region */ | ||
42 | }; | ||
43 | |||
44 | struct mtrr_gentry { | 44 | struct mtrr_gentry { |
45 | unsigned int regnum; /* Register number */ | 45 | unsigned int regnum; /* Register number */ |
46 | unsigned long base; /* Base address */ | 46 | unsigned long base; /* Base address */ |
@@ -50,12 +50,20 @@ struct mtrr_gentry { | |||
50 | 50 | ||
51 | #else /* __i386__ */ | 51 | #else /* __i386__ */ |
52 | 52 | ||
53 | struct mtrr_sentry { | ||
54 | __u64 base; /* Base address */ | ||
55 | __u32 size; /* Size of region */ | ||
56 | __u32 type; /* Type of region */ | ||
57 | }; | ||
58 | |||
53 | struct mtrr_gentry { | 59 | struct mtrr_gentry { |
54 | unsigned long base; /* Base address */ | 60 | __u64 base; /* Base address */ |
55 | unsigned int size; /* Size of region */ | 61 | __u32 size; /* Size of region */ |
56 | unsigned int regnum; /* Register number */ | 62 | __u32 regnum; /* Register number */ |
57 | unsigned int type; /* Type of region */ | 63 | __u32 type; /* Type of region */ |
64 | __u32 _pad; /* Unused */ | ||
58 | }; | 65 | }; |
66 | |||
59 | #endif /* !__i386__ */ | 67 | #endif /* !__i386__ */ |
60 | 68 | ||
61 | struct mtrr_var_range { | 69 | struct mtrr_var_range { |
diff --git a/arch/x86/include/asm/posix_types.h b/arch/x86/include/asm/posix_types.h index bb7133dc155d..3427b7798dbc 100644 --- a/arch/x86/include/asm/posix_types.h +++ b/arch/x86/include/asm/posix_types.h | |||
@@ -7,7 +7,9 @@ | |||
7 | #else | 7 | #else |
8 | # ifdef __i386__ | 8 | # ifdef __i386__ |
9 | # include "posix_types_32.h" | 9 | # include "posix_types_32.h" |
10 | # else | 10 | # elif defined(__LP64__) |
11 | # include "posix_types_64.h" | 11 | # include "posix_types_64.h" |
12 | # else | ||
13 | # include "posix_types_x32.h" | ||
12 | # endif | 14 | # endif |
13 | #endif | 15 | #endif |
diff --git a/arch/x86/include/asm/posix_types_32.h b/arch/x86/include/asm/posix_types_32.h index f7d9adf82e53..99f262e04b91 100644 --- a/arch/x86/include/asm/posix_types_32.h +++ b/arch/x86/include/asm/posix_types_32.h | |||
@@ -7,79 +7,22 @@ | |||
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | 10 | typedef unsigned short __kernel_mode_t; |
11 | #define __kernel_mode_t __kernel_mode_t | ||
12 | |||
12 | typedef unsigned short __kernel_nlink_t; | 13 | typedef unsigned short __kernel_nlink_t; |
13 | typedef long __kernel_off_t; | 14 | #define __kernel_nlink_t __kernel_nlink_t |
14 | typedef int __kernel_pid_t; | 15 | |
15 | typedef unsigned short __kernel_ipc_pid_t; | 16 | typedef unsigned short __kernel_ipc_pid_t; |
17 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
18 | |||
16 | typedef unsigned short __kernel_uid_t; | 19 | typedef unsigned short __kernel_uid_t; |
17 | typedef unsigned short __kernel_gid_t; | 20 | typedef unsigned short __kernel_gid_t; |
18 | typedef unsigned int __kernel_size_t; | 21 | #define __kernel_uid_t __kernel_uid_t |
19 | typedef int __kernel_ssize_t; | ||
20 | typedef int __kernel_ptrdiff_t; | ||
21 | typedef long __kernel_time_t; | ||
22 | typedef long __kernel_suseconds_t; | ||
23 | typedef long __kernel_clock_t; | ||
24 | typedef int __kernel_timer_t; | ||
25 | typedef int __kernel_clockid_t; | ||
26 | typedef int __kernel_daddr_t; | ||
27 | typedef char * __kernel_caddr_t; | ||
28 | typedef unsigned short __kernel_uid16_t; | ||
29 | typedef unsigned short __kernel_gid16_t; | ||
30 | typedef unsigned int __kernel_uid32_t; | ||
31 | typedef unsigned int __kernel_gid32_t; | ||
32 | 22 | ||
33 | typedef unsigned short __kernel_old_uid_t; | ||
34 | typedef unsigned short __kernel_old_gid_t; | ||
35 | typedef unsigned short __kernel_old_dev_t; | 23 | typedef unsigned short __kernel_old_dev_t; |
24 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
36 | 25 | ||
37 | #ifdef __GNUC__ | 26 | #include <asm-generic/posix_types.h> |
38 | typedef long long __kernel_loff_t; | ||
39 | #endif | ||
40 | |||
41 | typedef struct { | ||
42 | int val[2]; | ||
43 | } __kernel_fsid_t; | ||
44 | |||
45 | #if defined(__KERNEL__) | ||
46 | |||
47 | #undef __FD_SET | ||
48 | #define __FD_SET(fd,fdsetp) \ | ||
49 | asm volatile("btsl %1,%0": \ | ||
50 | "+m" (*(__kernel_fd_set *)(fdsetp)) \ | ||
51 | : "r" ((int)(fd))) | ||
52 | |||
53 | #undef __FD_CLR | ||
54 | #define __FD_CLR(fd,fdsetp) \ | ||
55 | asm volatile("btrl %1,%0": \ | ||
56 | "+m" (*(__kernel_fd_set *)(fdsetp)) \ | ||
57 | : "r" ((int) (fd))) | ||
58 | |||
59 | #undef __FD_ISSET | ||
60 | #define __FD_ISSET(fd,fdsetp) \ | ||
61 | (__extension__ \ | ||
62 | ({ \ | ||
63 | unsigned char __result; \ | ||
64 | asm volatile("btl %1,%2 ; setb %0" \ | ||
65 | : "=q" (__result) \ | ||
66 | : "r" ((int)(fd)), \ | ||
67 | "m" (*(__kernel_fd_set *)(fdsetp))); \ | ||
68 | __result; \ | ||
69 | })) | ||
70 | |||
71 | #undef __FD_ZERO | ||
72 | #define __FD_ZERO(fdsetp) \ | ||
73 | do { \ | ||
74 | int __d0, __d1; \ | ||
75 | asm volatile("cld ; rep ; stosl" \ | ||
76 | : "=m" (*(__kernel_fd_set *)(fdsetp)), \ | ||
77 | "=&c" (__d0), "=&D" (__d1) \ | ||
78 | : "a" (0), "1" (__FDSET_LONGS), \ | ||
79 | "2" ((__kernel_fd_set *)(fdsetp)) \ | ||
80 | : "memory"); \ | ||
81 | } while (0) | ||
82 | |||
83 | #endif /* defined(__KERNEL__) */ | ||
84 | 27 | ||
85 | #endif /* _ASM_X86_POSIX_TYPES_32_H */ | 28 | #endif /* _ASM_X86_POSIX_TYPES_32_H */ |
diff --git a/arch/x86/include/asm/posix_types_64.h b/arch/x86/include/asm/posix_types_64.h index eb8d2d92b63e..cba0c1ead162 100644 --- a/arch/x86/include/asm/posix_types_64.h +++ b/arch/x86/include/asm/posix_types_64.h | |||
@@ -7,113 +7,13 @@ | |||
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned int __kernel_mode_t; | ||
12 | typedef unsigned long __kernel_nlink_t; | ||
13 | typedef long __kernel_off_t; | ||
14 | typedef int __kernel_pid_t; | ||
15 | typedef int __kernel_ipc_pid_t; | ||
16 | typedef unsigned int __kernel_uid_t; | ||
17 | typedef unsigned int __kernel_gid_t; | ||
18 | typedef unsigned long __kernel_size_t; | ||
19 | typedef long __kernel_ssize_t; | ||
20 | typedef long __kernel_ptrdiff_t; | ||
21 | typedef long __kernel_time_t; | ||
22 | typedef long __kernel_suseconds_t; | ||
23 | typedef long __kernel_clock_t; | ||
24 | typedef int __kernel_timer_t; | ||
25 | typedef int __kernel_clockid_t; | ||
26 | typedef int __kernel_daddr_t; | ||
27 | typedef char * __kernel_caddr_t; | ||
28 | typedef unsigned short __kernel_uid16_t; | ||
29 | typedef unsigned short __kernel_gid16_t; | ||
30 | |||
31 | #ifdef __GNUC__ | ||
32 | typedef long long __kernel_loff_t; | ||
33 | #endif | ||
34 | |||
35 | typedef struct { | ||
36 | int val[2]; | ||
37 | } __kernel_fsid_t; | ||
38 | |||
39 | typedef unsigned short __kernel_old_uid_t; | 10 | typedef unsigned short __kernel_old_uid_t; |
40 | typedef unsigned short __kernel_old_gid_t; | 11 | typedef unsigned short __kernel_old_gid_t; |
41 | typedef __kernel_uid_t __kernel_uid32_t; | 12 | #define __kernel_old_uid_t __kernel_old_uid_t |
42 | typedef __kernel_gid_t __kernel_gid32_t; | ||
43 | 13 | ||
44 | typedef unsigned long __kernel_old_dev_t; | 14 | typedef unsigned long __kernel_old_dev_t; |
15 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
45 | 16 | ||
46 | #ifdef __KERNEL__ | 17 | #include <asm-generic/posix_types.h> |
47 | |||
48 | #undef __FD_SET | ||
49 | static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) | ||
50 | { | ||
51 | unsigned long _tmp = fd / __NFDBITS; | ||
52 | unsigned long _rem = fd % __NFDBITS; | ||
53 | fdsetp->fds_bits[_tmp] |= (1UL<<_rem); | ||
54 | } | ||
55 | |||
56 | #undef __FD_CLR | ||
57 | static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) | ||
58 | { | ||
59 | unsigned long _tmp = fd / __NFDBITS; | ||
60 | unsigned long _rem = fd % __NFDBITS; | ||
61 | fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); | ||
62 | } | ||
63 | |||
64 | #undef __FD_ISSET | ||
65 | static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p) | ||
66 | { | ||
67 | unsigned long _tmp = fd / __NFDBITS; | ||
68 | unsigned long _rem = fd % __NFDBITS; | ||
69 | return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; | ||
70 | } | ||
71 | |||
72 | /* | ||
73 | * This will unroll the loop for the normal constant cases (8 or 32 longs, | ||
74 | * for 256 and 1024-bit fd_sets respectively) | ||
75 | */ | ||
76 | #undef __FD_ZERO | ||
77 | static inline void __FD_ZERO(__kernel_fd_set *p) | ||
78 | { | ||
79 | unsigned long *tmp = p->fds_bits; | ||
80 | int i; | ||
81 | |||
82 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
83 | switch (__FDSET_LONGS) { | ||
84 | case 32: | ||
85 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
86 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
87 | tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; | ||
88 | tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; | ||
89 | tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0; | ||
90 | tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0; | ||
91 | tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0; | ||
92 | tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0; | ||
93 | return; | ||
94 | case 16: | ||
95 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
96 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
97 | tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; | ||
98 | tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; | ||
99 | return; | ||
100 | case 8: | ||
101 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
102 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
103 | return; | ||
104 | case 4: | ||
105 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
106 | return; | ||
107 | } | ||
108 | } | ||
109 | i = __FDSET_LONGS; | ||
110 | while (i) { | ||
111 | i--; | ||
112 | *tmp = 0; | ||
113 | tmp++; | ||
114 | } | ||
115 | } | ||
116 | |||
117 | #endif /* defined(__KERNEL__) */ | ||
118 | 18 | ||
119 | #endif /* _ASM_X86_POSIX_TYPES_64_H */ | 19 | #endif /* _ASM_X86_POSIX_TYPES_64_H */ |
diff --git a/arch/x86/include/asm/posix_types_x32.h b/arch/x86/include/asm/posix_types_x32.h new file mode 100644 index 000000000000..85f9bdafa93c --- /dev/null +++ b/arch/x86/include/asm/posix_types_x32.h | |||
@@ -0,0 +1,19 @@ | |||
1 | #ifndef _ASM_X86_POSIX_TYPES_X32_H | ||
2 | #define _ASM_X86_POSIX_TYPES_X32_H | ||
3 | |||
4 | /* | ||
5 | * This file is only used by user-level software, so you need to | ||
6 | * be a little careful about namespace pollution etc. Also, we cannot | ||
7 | * assume GCC is being used. | ||
8 | * | ||
9 | * These types should generally match the ones used by the 64-bit kernel, | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | typedef long long __kernel_long_t; | ||
14 | typedef unsigned long long __kernel_ulong_t; | ||
15 | #define __kernel_long_t __kernel_long_t | ||
16 | |||
17 | #include <asm/posix_types_64.h> | ||
18 | |||
19 | #endif /* _ASM_X86_POSIX_TYPES_X32_H */ | ||
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index a19542c1685e..f302ef6bb200 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -873,9 +873,9 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
873 | #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ | 873 | #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ |
874 | 0xc0000000 : 0xFFFFe000) | 874 | 0xc0000000 : 0xFFFFe000) |
875 | 875 | ||
876 | #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ | 876 | #define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \ |
877 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) | 877 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) |
878 | #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_IA32)) ? \ | 878 | #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_ADDR32)) ? \ |
879 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) | 879 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) |
880 | 880 | ||
881 | #define STACK_TOP TASK_SIZE | 881 | #define STACK_TOP TASK_SIZE |
@@ -897,6 +897,12 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
897 | 897 | ||
898 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) | 898 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) |
899 | extern unsigned long KSTK_ESP(struct task_struct *task); | 899 | extern unsigned long KSTK_ESP(struct task_struct *task); |
900 | |||
901 | /* | ||
902 | * User space RSP while inside the SYSCALL fast path | ||
903 | */ | ||
904 | DECLARE_PER_CPU(unsigned long, old_rsp); | ||
905 | |||
900 | #endif /* CONFIG_X86_64 */ | 906 | #endif /* CONFIG_X86_64 */ |
901 | 907 | ||
902 | extern void start_thread(struct pt_regs *regs, unsigned long new_ip, | 908 | extern void start_thread(struct pt_regs *regs, unsigned long new_ip, |
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 35664547125b..dcfde52979c3 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
@@ -145,7 +145,6 @@ extern unsigned long | |||
145 | convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); | 145 | convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); |
146 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, | 146 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, |
147 | int error_code, int si_code); | 147 | int error_code, int si_code); |
148 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | ||
149 | 148 | ||
150 | extern long syscall_trace_enter(struct pt_regs *); | 149 | extern long syscall_trace_enter(struct pt_regs *); |
151 | extern void syscall_trace_leave(struct pt_regs *); | 150 | extern void syscall_trace_leave(struct pt_regs *); |
diff --git a/arch/x86/include/asm/sigcontext.h b/arch/x86/include/asm/sigcontext.h index 04459d25e66e..4a085383af27 100644 --- a/arch/x86/include/asm/sigcontext.h +++ b/arch/x86/include/asm/sigcontext.h | |||
@@ -230,34 +230,37 @@ struct sigcontext { | |||
230 | * User-space might still rely on the old definition: | 230 | * User-space might still rely on the old definition: |
231 | */ | 231 | */ |
232 | struct sigcontext { | 232 | struct sigcontext { |
233 | unsigned long r8; | 233 | __u64 r8; |
234 | unsigned long r9; | 234 | __u64 r9; |
235 | unsigned long r10; | 235 | __u64 r10; |
236 | unsigned long r11; | 236 | __u64 r11; |
237 | unsigned long r12; | 237 | __u64 r12; |
238 | unsigned long r13; | 238 | __u64 r13; |
239 | unsigned long r14; | 239 | __u64 r14; |
240 | unsigned long r15; | 240 | __u64 r15; |
241 | unsigned long rdi; | 241 | __u64 rdi; |
242 | unsigned long rsi; | 242 | __u64 rsi; |
243 | unsigned long rbp; | 243 | __u64 rbp; |
244 | unsigned long rbx; | 244 | __u64 rbx; |
245 | unsigned long rdx; | 245 | __u64 rdx; |
246 | unsigned long rax; | 246 | __u64 rax; |
247 | unsigned long rcx; | 247 | __u64 rcx; |
248 | unsigned long rsp; | 248 | __u64 rsp; |
249 | unsigned long rip; | 249 | __u64 rip; |
250 | unsigned long eflags; /* RFLAGS */ | 250 | __u64 eflags; /* RFLAGS */ |
251 | unsigned short cs; | 251 | __u16 cs; |
252 | unsigned short gs; | 252 | __u16 gs; |
253 | unsigned short fs; | 253 | __u16 fs; |
254 | unsigned short __pad0; | 254 | __u16 __pad0; |
255 | unsigned long err; | 255 | __u64 err; |
256 | unsigned long trapno; | 256 | __u64 trapno; |
257 | unsigned long oldmask; | 257 | __u64 oldmask; |
258 | unsigned long cr2; | 258 | __u64 cr2; |
259 | struct _fpstate __user *fpstate; /* zero when no FPU context */ | 259 | struct _fpstate __user *fpstate; /* zero when no FPU context */ |
260 | unsigned long reserved1[8]; | 260 | #ifndef __LP64__ |
261 | __u32 __fpstate_pad; | ||
262 | #endif | ||
263 | __u64 reserved1[8]; | ||
261 | }; | 264 | }; |
262 | #endif /* !__KERNEL__ */ | 265 | #endif /* !__KERNEL__ */ |
263 | 266 | ||
diff --git a/arch/x86/include/asm/sigframe.h b/arch/x86/include/asm/sigframe.h index 4e0fe26d27d3..7c7c27c97daa 100644 --- a/arch/x86/include/asm/sigframe.h +++ b/arch/x86/include/asm/sigframe.h | |||
@@ -59,12 +59,25 @@ struct rt_sigframe_ia32 { | |||
59 | #endif /* defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) */ | 59 | #endif /* defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) */ |
60 | 60 | ||
61 | #ifdef CONFIG_X86_64 | 61 | #ifdef CONFIG_X86_64 |
62 | |||
62 | struct rt_sigframe { | 63 | struct rt_sigframe { |
63 | char __user *pretcode; | 64 | char __user *pretcode; |
64 | struct ucontext uc; | 65 | struct ucontext uc; |
65 | struct siginfo info; | 66 | struct siginfo info; |
66 | /* fp state follows here */ | 67 | /* fp state follows here */ |
67 | }; | 68 | }; |
69 | |||
70 | #ifdef CONFIG_X86_X32_ABI | ||
71 | |||
72 | struct rt_sigframe_x32 { | ||
73 | u64 pretcode; | ||
74 | struct ucontext_x32 uc; | ||
75 | compat_siginfo_t info; | ||
76 | /* fp state follows here */ | ||
77 | }; | ||
78 | |||
79 | #endif /* CONFIG_X86_X32_ABI */ | ||
80 | |||
68 | #endif /* CONFIG_X86_64 */ | 81 | #endif /* CONFIG_X86_64 */ |
69 | 82 | ||
70 | #endif /* _ASM_X86_SIGFRAME_H */ | 83 | #endif /* _ASM_X86_SIGFRAME_H */ |
diff --git a/arch/x86/include/asm/sighandling.h b/arch/x86/include/asm/sighandling.h new file mode 100644 index 000000000000..ada93b3b8c66 --- /dev/null +++ b/arch/x86/include/asm/sighandling.h | |||
@@ -0,0 +1,24 @@ | |||
1 | #ifndef _ASM_X86_SIGHANDLING_H | ||
2 | #define _ASM_X86_SIGHANDLING_H | ||
3 | |||
4 | #include <linux/compiler.h> | ||
5 | #include <linux/ptrace.h> | ||
6 | #include <linux/signal.h> | ||
7 | |||
8 | #include <asm/processor-flags.h> | ||
9 | |||
10 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | ||
11 | |||
12 | #define __FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \ | ||
13 | X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \ | ||
14 | X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \ | ||
15 | X86_EFLAGS_CF) | ||
16 | |||
17 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | ||
18 | |||
19 | int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | ||
20 | unsigned long *pax); | ||
21 | int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, | ||
22 | struct pt_regs *regs, unsigned long mask); | ||
23 | |||
24 | #endif /* _ASM_X86_SIGHANDLING_H */ | ||
diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index cb238526a9f1..3fda9db48819 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h | |||
@@ -10,6 +10,8 @@ | |||
10 | #ifndef _ASM_X86_SYS_IA32_H | 10 | #ifndef _ASM_X86_SYS_IA32_H |
11 | #define _ASM_X86_SYS_IA32_H | 11 | #define _ASM_X86_SYS_IA32_H |
12 | 12 | ||
13 | #ifdef CONFIG_COMPAT | ||
14 | |||
13 | #include <linux/compiler.h> | 15 | #include <linux/compiler.h> |
14 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
15 | #include <linux/types.h> | 17 | #include <linux/types.h> |
@@ -36,8 +38,6 @@ asmlinkage long sys32_rt_sigaction(int, struct sigaction32 __user *, | |||
36 | struct sigaction32 __user *, unsigned int); | 38 | struct sigaction32 __user *, unsigned int); |
37 | asmlinkage long sys32_sigaction(int, struct old_sigaction32 __user *, | 39 | asmlinkage long sys32_sigaction(int, struct old_sigaction32 __user *, |
38 | struct old_sigaction32 __user *); | 40 | struct old_sigaction32 __user *); |
39 | asmlinkage long sys32_rt_sigprocmask(int, compat_sigset_t __user *, | ||
40 | compat_sigset_t __user *, unsigned int); | ||
41 | asmlinkage long sys32_alarm(unsigned int); | 41 | asmlinkage long sys32_alarm(unsigned int); |
42 | 42 | ||
43 | asmlinkage long sys32_waitpid(compat_pid_t, unsigned int *, int); | 43 | asmlinkage long sys32_waitpid(compat_pid_t, unsigned int *, int); |
@@ -83,4 +83,7 @@ asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32); | |||
83 | 83 | ||
84 | asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int, | 84 | asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int, |
85 | const char __user *); | 85 | const char __user *); |
86 | |||
87 | #endif /* CONFIG_COMPAT */ | ||
88 | |||
86 | #endif /* _ASM_X86_SYS_IA32_H */ | 89 | #endif /* _ASM_X86_SYS_IA32_H */ |
diff --git a/arch/x86/include/asm/syscall.h b/arch/x86/include/asm/syscall.h index d962e5652a73..386b78686c4d 100644 --- a/arch/x86/include/asm/syscall.h +++ b/arch/x86/include/asm/syscall.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <asm/asm-offsets.h> /* For NR_syscalls */ | 18 | #include <asm/asm-offsets.h> /* For NR_syscalls */ |
19 | #include <asm/unistd.h> | ||
19 | 20 | ||
20 | extern const unsigned long sys_call_table[]; | 21 | extern const unsigned long sys_call_table[]; |
21 | 22 | ||
@@ -26,13 +27,13 @@ extern const unsigned long sys_call_table[]; | |||
26 | */ | 27 | */ |
27 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) | 28 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) |
28 | { | 29 | { |
29 | return regs->orig_ax; | 30 | return regs->orig_ax & __SYSCALL_MASK; |
30 | } | 31 | } |
31 | 32 | ||
32 | static inline void syscall_rollback(struct task_struct *task, | 33 | static inline void syscall_rollback(struct task_struct *task, |
33 | struct pt_regs *regs) | 34 | struct pt_regs *regs) |
34 | { | 35 | { |
35 | regs->ax = regs->orig_ax; | 36 | regs->ax = regs->orig_ax & __SYSCALL_MASK; |
36 | } | 37 | } |
37 | 38 | ||
38 | static inline long syscall_get_error(struct task_struct *task, | 39 | static inline long syscall_get_error(struct task_struct *task, |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index cfd8144d5527..af1db7e722f4 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
@@ -86,7 +86,7 @@ struct thread_info { | |||
86 | #define TIF_MCE_NOTIFY 10 /* notify userspace of an MCE */ | 86 | #define TIF_MCE_NOTIFY 10 /* notify userspace of an MCE */ |
87 | #define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */ | 87 | #define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */ |
88 | #define TIF_NOTSC 16 /* TSC is not accessible in userland */ | 88 | #define TIF_NOTSC 16 /* TSC is not accessible in userland */ |
89 | #define TIF_IA32 17 /* 32bit process */ | 89 | #define TIF_IA32 17 /* IA32 compatibility process */ |
90 | #define TIF_FORK 18 /* ret_from_fork */ | 90 | #define TIF_FORK 18 /* ret_from_fork */ |
91 | #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ | 91 | #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ |
92 | #define TIF_DEBUG 21 /* uses debug registers */ | 92 | #define TIF_DEBUG 21 /* uses debug registers */ |
@@ -95,6 +95,8 @@ struct thread_info { | |||
95 | #define TIF_BLOCKSTEP 25 /* set when we want DEBUGCTLMSR_BTF */ | 95 | #define TIF_BLOCKSTEP 25 /* set when we want DEBUGCTLMSR_BTF */ |
96 | #define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */ | 96 | #define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */ |
97 | #define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */ | 97 | #define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */ |
98 | #define TIF_ADDR32 29 /* 32-bit address space on 64 bits */ | ||
99 | #define TIF_X32 30 /* 32-bit native x86-64 binary */ | ||
98 | 100 | ||
99 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 101 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
100 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | 102 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) |
@@ -116,6 +118,8 @@ struct thread_info { | |||
116 | #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) | 118 | #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) |
117 | #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) | 119 | #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) |
118 | #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) | 120 | #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) |
121 | #define _TIF_ADDR32 (1 << TIF_ADDR32) | ||
122 | #define _TIF_X32 (1 << TIF_X32) | ||
119 | 123 | ||
120 | /* work to do in syscall_trace_enter() */ | 124 | /* work to do in syscall_trace_enter() */ |
121 | #define _TIF_WORK_SYSCALL_ENTRY \ | 125 | #define _TIF_WORK_SYSCALL_ENTRY \ |
diff --git a/arch/x86/include/asm/unistd.h b/arch/x86/include/asm/unistd.h index 21f77b89e47a..37cdc9d99bb1 100644 --- a/arch/x86/include/asm/unistd.h +++ b/arch/x86/include/asm/unistd.h | |||
@@ -1,7 +1,17 @@ | |||
1 | #ifndef _ASM_X86_UNISTD_H | 1 | #ifndef _ASM_X86_UNISTD_H |
2 | #define _ASM_X86_UNISTD_H 1 | 2 | #define _ASM_X86_UNISTD_H 1 |
3 | 3 | ||
4 | /* x32 syscall flag bit */ | ||
5 | #define __X32_SYSCALL_BIT 0x40000000 | ||
6 | |||
4 | #ifdef __KERNEL__ | 7 | #ifdef __KERNEL__ |
8 | |||
9 | # ifdef CONFIG_X86_X32_ABI | ||
10 | # define __SYSCALL_MASK (~(__X32_SYSCALL_BIT)) | ||
11 | # else | ||
12 | # define __SYSCALL_MASK (~0) | ||
13 | # endif | ||
14 | |||
5 | # ifdef CONFIG_X86_32 | 15 | # ifdef CONFIG_X86_32 |
6 | 16 | ||
7 | # include <asm/unistd_32.h> | 17 | # include <asm/unistd_32.h> |
@@ -14,6 +24,7 @@ | |||
14 | # else | 24 | # else |
15 | 25 | ||
16 | # include <asm/unistd_64.h> | 26 | # include <asm/unistd_64.h> |
27 | # include <asm/unistd_64_x32.h> | ||
17 | # define __ARCH_WANT_COMPAT_SYS_TIME | 28 | # define __ARCH_WANT_COMPAT_SYS_TIME |
18 | 29 | ||
19 | # endif | 30 | # endif |
@@ -52,8 +63,10 @@ | |||
52 | #else | 63 | #else |
53 | # ifdef __i386__ | 64 | # ifdef __i386__ |
54 | # include <asm/unistd_32.h> | 65 | # include <asm/unistd_32.h> |
55 | # else | 66 | # elif defined(__LP64__) |
56 | # include <asm/unistd_64.h> | 67 | # include <asm/unistd_64.h> |
68 | # else | ||
69 | # include <asm/unistd_x32.h> | ||
57 | # endif | 70 | # endif |
58 | #endif | 71 | #endif |
59 | 72 | ||