diff options
author | H. Peter Anvin <hpa@zytor.com> | 2012-02-06 16:03:09 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-02-20 15:48:46 -0500 |
commit | 6bd330083e0e97b7ddc053459190bf3d5768ca83 (patch) | |
tree | c0fc2e703c4ce13b33cc364e5ad3eac712b57fb7 /arch | |
parent | cf420048b3b2af9ce928d35cc5455c646c9dd2f7 (diff) |
x86: Factor out TIF_IA32 from 32-bit address space
Factor out IA32 (compatibility instruction set) from 32-bit address
space in the thread_info flags; this is a precondition patch for x32
support.
Originally-by: H. J. Lu <hjl.tools@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Link: http://lkml.kernel.org/n/tip-4pr1xnnksprt7t0h3w5fw4rv@git.kernel.org
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/include/asm/elf.h | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/processor.h | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/thread_info.h | 4 | ||||
-rw-r--r-- | arch/x86/kernel/process_64.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/sys_x86_64.c | 6 | ||||
-rw-r--r-- | arch/x86/oprofile/backtrace.c | 2 |
6 files changed, 13 insertions, 9 deletions
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index 5f962df30d0f..410fa6a219f6 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h | |||
@@ -287,7 +287,7 @@ do { \ | |||
287 | #define VDSO_HIGH_BASE 0xffffe000U /* CONFIG_COMPAT_VDSO address */ | 287 | #define VDSO_HIGH_BASE 0xffffe000U /* CONFIG_COMPAT_VDSO address */ |
288 | 288 | ||
289 | /* 1GB for 64bit, 8MB for 32bit */ | 289 | /* 1GB for 64bit, 8MB for 32bit */ |
290 | #define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff) | 290 | #define STACK_RND_MASK (test_thread_flag(TIF_ADDR32) ? 0x7ff : 0x3fffff) |
291 | 291 | ||
292 | #define ARCH_DLINFO \ | 292 | #define ARCH_DLINFO \ |
293 | do { \ | 293 | do { \ |
@@ -330,7 +330,7 @@ static inline int mmap_is_ia32(void) | |||
330 | return 1; | 330 | return 1; |
331 | #endif | 331 | #endif |
332 | #ifdef CONFIG_IA32_EMULATION | 332 | #ifdef CONFIG_IA32_EMULATION |
333 | if (test_thread_flag(TIF_IA32)) | 333 | if (test_thread_flag(TIF_ADDR32)) |
334 | return 1; | 334 | return 1; |
335 | #endif | 335 | #endif |
336 | return 0; | 336 | return 0; |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index aa9088c26931..9f748b5fb701 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -924,9 +924,9 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
924 | #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ | 924 | #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ |
925 | 0xc0000000 : 0xFFFFe000) | 925 | 0xc0000000 : 0xFFFFe000) |
926 | 926 | ||
927 | #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ | 927 | #define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \ |
928 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) | 928 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) |
929 | #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_IA32)) ? \ | 929 | #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_ADDR32)) ? \ |
930 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) | 930 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) |
931 | 931 | ||
932 | #define STACK_TOP TASK_SIZE | 932 | #define STACK_TOP TASK_SIZE |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index bc817cd8b443..d1803a495b35 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,7 @@ 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 */ | ||
98 | 99 | ||
99 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 100 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
100 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | 101 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) |
@@ -116,6 +117,7 @@ struct thread_info { | |||
116 | #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) | 117 | #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) |
117 | #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) | 118 | #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) |
118 | #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) | 119 | #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) |
120 | #define _TIF_ADDR32 (1 << TIF_ADDR32) | ||
119 | 121 | ||
120 | /* work to do in syscall_trace_enter() */ | 122 | /* work to do in syscall_trace_enter() */ |
121 | #define _TIF_WORK_SYSCALL_ENTRY \ | 123 | #define _TIF_WORK_SYSCALL_ENTRY \ |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 9b9fe4a85c87..0e900d09e232 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -508,6 +508,7 @@ void set_personality_64bit(void) | |||
508 | 508 | ||
509 | /* Make sure to be in 64bit mode */ | 509 | /* Make sure to be in 64bit mode */ |
510 | clear_thread_flag(TIF_IA32); | 510 | clear_thread_flag(TIF_IA32); |
511 | clear_thread_flag(TIF_ADDR32); | ||
511 | 512 | ||
512 | /* Ensure the corresponding mm is not marked. */ | 513 | /* Ensure the corresponding mm is not marked. */ |
513 | if (current->mm) | 514 | if (current->mm) |
@@ -526,6 +527,7 @@ void set_personality_ia32(void) | |||
526 | 527 | ||
527 | /* Make sure to be in 32bit mode */ | 528 | /* Make sure to be in 32bit mode */ |
528 | set_thread_flag(TIF_IA32); | 529 | set_thread_flag(TIF_IA32); |
530 | set_thread_flag(TIF_ADDR32); | ||
529 | current->personality |= force_personality32; | 531 | current->personality |= force_personality32; |
530 | 532 | ||
531 | /* Mark the associated mm as containing 32-bit tasks. */ | 533 | /* Mark the associated mm as containing 32-bit tasks. */ |
diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index 051489082d59..f921df8c2099 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c | |||
@@ -98,7 +98,7 @@ out: | |||
98 | static void find_start_end(unsigned long flags, unsigned long *begin, | 98 | static void find_start_end(unsigned long flags, unsigned long *begin, |
99 | unsigned long *end) | 99 | unsigned long *end) |
100 | { | 100 | { |
101 | if (!test_thread_flag(TIF_IA32) && (flags & MAP_32BIT)) { | 101 | if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) { |
102 | unsigned long new_begin; | 102 | unsigned long new_begin; |
103 | /* This is usually used needed to map code in small | 103 | /* This is usually used needed to map code in small |
104 | model, so it needs to be in the first 31bit. Limit | 104 | model, so it needs to be in the first 31bit. Limit |
@@ -144,7 +144,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
144 | (!vma || addr + len <= vma->vm_start)) | 144 | (!vma || addr + len <= vma->vm_start)) |
145 | return addr; | 145 | return addr; |
146 | } | 146 | } |
147 | if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32)) | 147 | if (((flags & MAP_32BIT) || test_thread_flag(TIF_ADDR32)) |
148 | && len <= mm->cached_hole_size) { | 148 | && len <= mm->cached_hole_size) { |
149 | mm->cached_hole_size = 0; | 149 | mm->cached_hole_size = 0; |
150 | mm->free_area_cache = begin; | 150 | mm->free_area_cache = begin; |
@@ -205,7 +205,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
205 | return addr; | 205 | return addr; |
206 | 206 | ||
207 | /* for MAP_32BIT mappings we force the legact mmap base */ | 207 | /* for MAP_32BIT mappings we force the legact mmap base */ |
208 | if (!test_thread_flag(TIF_IA32) && (flags & MAP_32BIT)) | 208 | if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) |
209 | goto bottomup; | 209 | goto bottomup; |
210 | 210 | ||
211 | /* requesting a specific address */ | 211 | /* requesting a specific address */ |
diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c index bff89dfe3619..d6aa6e8315d1 100644 --- a/arch/x86/oprofile/backtrace.c +++ b/arch/x86/oprofile/backtrace.c | |||
@@ -67,7 +67,7 @@ x86_backtrace_32(struct pt_regs * const regs, unsigned int depth) | |||
67 | { | 67 | { |
68 | struct stack_frame_ia32 *head; | 68 | struct stack_frame_ia32 *head; |
69 | 69 | ||
70 | /* User process is 32-bit */ | 70 | /* User process is IA32 */ |
71 | if (!current || !test_thread_flag(TIF_IA32)) | 71 | if (!current || !test_thread_flag(TIF_IA32)) |
72 | return 0; | 72 | return 0; |
73 | 73 | ||