diff options
-rw-r--r-- | arch/s390/include/asm/compat.h | 19 | ||||
-rw-r--r-- | arch/s390/kernel/process.c | 3 | ||||
-rw-r--r-- | arch/s390/kernel/ptrace.c | 12 | ||||
-rw-r--r-- | arch/s390/kernel/signal.c | 3 | ||||
-rw-r--r-- | arch/s390/kernel/vdso.c | 4 | ||||
-rw-r--r-- | arch/s390/mm/fault.c | 3 | ||||
-rw-r--r-- | arch/s390/mm/mmap.c | 11 |
7 files changed, 36 insertions, 19 deletions
diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index de065b32381a..01a08020bc0e 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h | |||
@@ -5,6 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
7 | #include <linux/sched.h> | 7 | #include <linux/sched.h> |
8 | #include <linux/thread_info.h> | ||
8 | 9 | ||
9 | #define PSW32_MASK_PER 0x40000000UL | 10 | #define PSW32_MASK_PER 0x40000000UL |
10 | #define PSW32_MASK_DAT 0x04000000UL | 11 | #define PSW32_MASK_DAT 0x04000000UL |
@@ -163,12 +164,28 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) | |||
163 | return (u32)(unsigned long)uptr; | 164 | return (u32)(unsigned long)uptr; |
164 | } | 165 | } |
165 | 166 | ||
167 | #ifdef CONFIG_COMPAT | ||
168 | |||
169 | static inline int is_compat_task(void) | ||
170 | { | ||
171 | return test_thread_flag(TIF_31BIT); | ||
172 | } | ||
173 | |||
174 | #else | ||
175 | |||
176 | static inline int is_compat_task(void) | ||
177 | { | ||
178 | return 0; | ||
179 | } | ||
180 | |||
181 | #endif | ||
182 | |||
166 | static inline void __user *compat_alloc_user_space(long len) | 183 | static inline void __user *compat_alloc_user_space(long len) |
167 | { | 184 | { |
168 | unsigned long stack; | 185 | unsigned long stack; |
169 | 186 | ||
170 | stack = KSTK_ESP(current); | 187 | stack = KSTK_ESP(current); |
171 | if (test_thread_flag(TIF_31BIT)) | 188 | if (is_compat_task()) |
172 | stack &= 0x7fffffffUL; | 189 | stack &= 0x7fffffffUL; |
173 | return (void __user *) (stack - len); | 190 | return (void __user *) (stack - len); |
174 | } | 191 | } |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index a3acd8e60aff..355f7a30c3f1 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/elfcore.h> | 32 | #include <linux/elfcore.h> |
33 | #include <linux/kernel_stat.h> | 33 | #include <linux/kernel_stat.h> |
34 | #include <linux/syscalls.h> | 34 | #include <linux/syscalls.h> |
35 | #include <asm/compat.h> | ||
35 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
36 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
37 | #include <asm/system.h> | 38 | #include <asm/system.h> |
@@ -204,7 +205,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, | |||
204 | save_fp_regs(&p->thread.fp_regs); | 205 | save_fp_regs(&p->thread.fp_regs); |
205 | /* Set a new TLS ? */ | 206 | /* Set a new TLS ? */ |
206 | if (clone_flags & CLONE_SETTLS) { | 207 | if (clone_flags & CLONE_SETTLS) { |
207 | if (test_thread_flag(TIF_31BIT)) { | 208 | if (is_compat_task()) { |
208 | p->thread.acrs[0] = (unsigned int) regs->gprs[6]; | 209 | p->thread.acrs[0] = (unsigned int) regs->gprs[6]; |
209 | } else { | 210 | } else { |
210 | p->thread.acrs[0] = (unsigned int)(regs->gprs[6] >> 32); | 211 | p->thread.acrs[0] = (unsigned int)(regs->gprs[6] >> 32); |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 75c496f4f16d..99eef179e903 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #include <linux/elf.h> | 36 | #include <linux/elf.h> |
37 | #include <linux/regset.h> | 37 | #include <linux/regset.h> |
38 | #include <linux/tracehook.h> | 38 | #include <linux/tracehook.h> |
39 | 39 | #include <linux/compat.h> | |
40 | #include <asm/segment.h> | 40 | #include <asm/segment.h> |
41 | #include <asm/page.h> | 41 | #include <asm/page.h> |
42 | #include <asm/pgtable.h> | 42 | #include <asm/pgtable.h> |
@@ -69,7 +69,7 @@ FixPerRegisters(struct task_struct *task) | |||
69 | if (per_info->single_step) { | 69 | if (per_info->single_step) { |
70 | per_info->control_regs.bits.starting_addr = 0; | 70 | per_info->control_regs.bits.starting_addr = 0; |
71 | #ifdef CONFIG_COMPAT | 71 | #ifdef CONFIG_COMPAT |
72 | if (test_thread_flag(TIF_31BIT)) | 72 | if (is_compat_task()) |
73 | per_info->control_regs.bits.ending_addr = 0x7fffffffUL; | 73 | per_info->control_regs.bits.ending_addr = 0x7fffffffUL; |
74 | else | 74 | else |
75 | #endif | 75 | #endif |
@@ -482,8 +482,7 @@ static int peek_user_compat(struct task_struct *child, | |||
482 | { | 482 | { |
483 | __u32 tmp; | 483 | __u32 tmp; |
484 | 484 | ||
485 | if (!test_thread_flag(TIF_31BIT) || | 485 | if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user) - 3) |
486 | (addr & 3) || addr > sizeof(struct user) - 3) | ||
487 | return -EIO; | 486 | return -EIO; |
488 | 487 | ||
489 | tmp = __peek_user_compat(child, addr); | 488 | tmp = __peek_user_compat(child, addr); |
@@ -584,8 +583,7 @@ static int __poke_user_compat(struct task_struct *child, | |||
584 | static int poke_user_compat(struct task_struct *child, | 583 | static int poke_user_compat(struct task_struct *child, |
585 | addr_t addr, addr_t data) | 584 | addr_t addr, addr_t data) |
586 | { | 585 | { |
587 | if (!test_thread_flag(TIF_31BIT) || | 586 | if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user32) - 3) |
588 | (addr & 3) || addr > sizeof(struct user32) - 3) | ||
589 | return -EIO; | 587 | return -EIO; |
590 | 588 | ||
591 | return __poke_user_compat(child, addr, data); | 589 | return __poke_user_compat(child, addr, data); |
@@ -660,7 +658,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | |||
660 | } | 658 | } |
661 | 659 | ||
662 | if (unlikely(current->audit_context)) | 660 | if (unlikely(current->audit_context)) |
663 | audit_syscall_entry(test_thread_flag(TIF_31BIT) ? | 661 | audit_syscall_entry(is_compat_task() ? |
664 | AUDIT_ARCH_S390 : AUDIT_ARCH_S390X, | 662 | AUDIT_ARCH_S390 : AUDIT_ARCH_S390X, |
665 | regs->gprs[2], regs->orig_gpr2, | 663 | regs->gprs[2], regs->orig_gpr2, |
666 | regs->gprs[3], regs->gprs[4], | 664 | regs->gprs[3], regs->gprs[4], |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 3cf74c3ccb69..062bd64e65fa 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/binfmts.h> | 26 | #include <linux/binfmts.h> |
27 | #include <linux/tracehook.h> | 27 | #include <linux/tracehook.h> |
28 | #include <linux/syscalls.h> | 28 | #include <linux/syscalls.h> |
29 | #include <linux/compat.h> | ||
29 | #include <asm/ucontext.h> | 30 | #include <asm/ucontext.h> |
30 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
31 | #include <asm/lowcore.h> | 32 | #include <asm/lowcore.h> |
@@ -482,7 +483,7 @@ void do_signal(struct pt_regs *regs) | |||
482 | /* Whee! Actually deliver the signal. */ | 483 | /* Whee! Actually deliver the signal. */ |
483 | int ret; | 484 | int ret; |
484 | #ifdef CONFIG_COMPAT | 485 | #ifdef CONFIG_COMPAT |
485 | if (test_thread_flag(TIF_31BIT)) { | 486 | if (is_compat_task()) { |
486 | ret = handle_signal32(signr, &ka, &info, oldset, regs); | 487 | ret = handle_signal32(signr, &ka, &info, oldset, regs); |
487 | } | 488 | } |
488 | else | 489 | else |
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c index 7b76ee4fb16c..45e1708b70fd 100644 --- a/arch/s390/kernel/vdso.c +++ b/arch/s390/kernel/vdso.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/elf.h> | 22 | #include <linux/elf.h> |
23 | #include <linux/security.h> | 23 | #include <linux/security.h> |
24 | #include <linux/bootmem.h> | 24 | #include <linux/bootmem.h> |
25 | 25 | #include <linux/compat.h> | |
26 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
27 | #include <asm/system.h> | 27 | #include <asm/system.h> |
28 | #include <asm/processor.h> | 28 | #include <asm/processor.h> |
@@ -214,7 +214,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
214 | vdso_pagelist = vdso64_pagelist; | 214 | vdso_pagelist = vdso64_pagelist; |
215 | vdso_pages = vdso64_pages; | 215 | vdso_pages = vdso64_pages; |
216 | #ifdef CONFIG_COMPAT | 216 | #ifdef CONFIG_COMPAT |
217 | if (test_thread_flag(TIF_31BIT)) { | 217 | if (is_compat_task()) { |
218 | vdso_pagelist = vdso32_pagelist; | 218 | vdso_pagelist = vdso32_pagelist; |
219 | vdso_pages = vdso32_pages; | 219 | vdso_pages = vdso32_pages; |
220 | } | 220 | } |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 833e8366c351..220a152c836c 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/ptrace.h> | 19 | #include <linux/ptrace.h> |
20 | #include <linux/mman.h> | 20 | #include <linux/mman.h> |
21 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
22 | #include <linux/compat.h> | ||
22 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
23 | #include <linux/kdebug.h> | 24 | #include <linux/kdebug.h> |
24 | #include <linux/smp_lock.h> | 25 | #include <linux/smp_lock.h> |
@@ -239,7 +240,7 @@ static int signal_return(struct mm_struct *mm, struct pt_regs *regs, | |||
239 | up_read(&mm->mmap_sem); | 240 | up_read(&mm->mmap_sem); |
240 | clear_tsk_thread_flag(current, TIF_SINGLE_STEP); | 241 | clear_tsk_thread_flag(current, TIF_SINGLE_STEP); |
241 | #ifdef CONFIG_COMPAT | 242 | #ifdef CONFIG_COMPAT |
242 | compat = test_tsk_thread_flag(current, TIF_31BIT); | 243 | compat = is_compat_task(); |
243 | if (compat && instruction == 0x0a77) | 244 | if (compat && instruction == 0x0a77) |
244 | sys32_sigreturn(); | 245 | sys32_sigreturn(); |
245 | else if (compat && instruction == 0x0aad) | 246 | else if (compat && instruction == 0x0aad) |
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index e008d236cc15..f4558ccf02b9 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <asm/pgalloc.h> | 30 | #include <asm/pgalloc.h> |
31 | #include <asm/compat.h> | ||
31 | 32 | ||
32 | /* | 33 | /* |
33 | * Top of mmap area (just below the process stack). | 34 | * Top of mmap area (just below the process stack). |
@@ -55,7 +56,7 @@ static inline int mmap_is_legacy(void) | |||
55 | /* | 56 | /* |
56 | * Force standard allocation for 64 bit programs. | 57 | * Force standard allocation for 64 bit programs. |
57 | */ | 58 | */ |
58 | if (!test_thread_flag(TIF_31BIT)) | 59 | if (!is_compat_task()) |
59 | return 1; | 60 | return 1; |
60 | #endif | 61 | #endif |
61 | return sysctl_legacy_va_layout || | 62 | return sysctl_legacy_va_layout || |
@@ -91,7 +92,7 @@ EXPORT_SYMBOL_GPL(arch_pick_mmap_layout); | |||
91 | 92 | ||
92 | int s390_mmap_check(unsigned long addr, unsigned long len) | 93 | int s390_mmap_check(unsigned long addr, unsigned long len) |
93 | { | 94 | { |
94 | if (!test_thread_flag(TIF_31BIT) && | 95 | if (!is_compat_task() && |
95 | len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) | 96 | len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) |
96 | return crst_table_upgrade(current->mm, 1UL << 53); | 97 | return crst_table_upgrade(current->mm, 1UL << 53); |
97 | return 0; | 98 | return 0; |
@@ -108,8 +109,7 @@ s390_get_unmapped_area(struct file *filp, unsigned long addr, | |||
108 | area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); | 109 | area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); |
109 | if (!(area & ~PAGE_MASK)) | 110 | if (!(area & ~PAGE_MASK)) |
110 | return area; | 111 | return area; |
111 | if (area == -ENOMEM && | 112 | if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < (1UL << 53)) { |
112 | !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) { | ||
113 | /* Upgrade the page table to 4 levels and retry. */ | 113 | /* Upgrade the page table to 4 levels and retry. */ |
114 | rc = crst_table_upgrade(mm, 1UL << 53); | 114 | rc = crst_table_upgrade(mm, 1UL << 53); |
115 | if (rc) | 115 | if (rc) |
@@ -131,8 +131,7 @@ s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr, | |||
131 | area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags); | 131 | area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags); |
132 | if (!(area & ~PAGE_MASK)) | 132 | if (!(area & ~PAGE_MASK)) |
133 | return area; | 133 | return area; |
134 | if (area == -ENOMEM && | 134 | if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < (1UL << 53)) { |
135 | !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) { | ||
136 | /* Upgrade the page table to 4 levels and retry. */ | 135 | /* Upgrade the page table to 4 levels and retry. */ |
137 | rc = crst_table_upgrade(mm, 1UL << 53); | 136 | rc = crst_table_upgrade(mm, 1UL << 53); |
138 | if (rc) | 137 | if (rc) |