Loading arch/s390/include/asm/compat.h +18 −1 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ */ #include <linux/types.h> #include <linux/sched.h> #include <linux/thread_info.h> #define PSW32_MASK_PER 0x40000000UL #define PSW32_MASK_DAT 0x04000000UL Loading Loading @@ -163,12 +164,28 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) return (u32)(unsigned long)uptr; } #ifdef CONFIG_COMPAT static inline int is_compat_task(void) { return test_thread_flag(TIF_31BIT); } #else static inline int is_compat_task(void) { return 0; } #endif static inline void __user *compat_alloc_user_space(long len) { unsigned long stack; stack = KSTK_ESP(current); if (test_thread_flag(TIF_31BIT)) if (is_compat_task()) stack &= 0x7fffffffUL; return (void __user *) (stack - len); } Loading arch/s390/kernel/process.c +2 −1 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <linux/elfcore.h> #include <linux/kernel_stat.h> #include <linux/syscalls.h> #include <asm/compat.h> #include <asm/uaccess.h> #include <asm/pgtable.h> #include <asm/system.h> Loading Loading @@ -204,7 +205,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, save_fp_regs(&p->thread.fp_regs); /* Set a new TLS ? */ if (clone_flags & CLONE_SETTLS) { if (test_thread_flag(TIF_31BIT)) { if (is_compat_task()) { p->thread.acrs[0] = (unsigned int) regs->gprs[6]; } else { p->thread.acrs[0] = (unsigned int)(regs->gprs[6] >> 32); Loading arch/s390/kernel/ptrace.c +5 −7 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ #include <linux/elf.h> #include <linux/regset.h> #include <linux/tracehook.h> #include <linux/compat.h> #include <asm/segment.h> #include <asm/page.h> #include <asm/pgtable.h> Loading Loading @@ -69,7 +69,7 @@ FixPerRegisters(struct task_struct *task) if (per_info->single_step) { per_info->control_regs.bits.starting_addr = 0; #ifdef CONFIG_COMPAT if (test_thread_flag(TIF_31BIT)) if (is_compat_task()) per_info->control_regs.bits.ending_addr = 0x7fffffffUL; else #endif Loading Loading @@ -482,8 +482,7 @@ static int peek_user_compat(struct task_struct *child, { __u32 tmp; if (!test_thread_flag(TIF_31BIT) || (addr & 3) || addr > sizeof(struct user) - 3) if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user) - 3) return -EIO; tmp = __peek_user_compat(child, addr); Loading Loading @@ -584,8 +583,7 @@ static int __poke_user_compat(struct task_struct *child, static int poke_user_compat(struct task_struct *child, addr_t addr, addr_t data) { if (!test_thread_flag(TIF_31BIT) || (addr & 3) || addr > sizeof(struct user32) - 3) if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user32) - 3) return -EIO; return __poke_user_compat(child, addr, data); Loading Loading @@ -660,7 +658,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) } if (unlikely(current->audit_context)) audit_syscall_entry(test_thread_flag(TIF_31BIT) ? audit_syscall_entry(is_compat_task() ? AUDIT_ARCH_S390 : AUDIT_ARCH_S390X, regs->gprs[2], regs->orig_gpr2, regs->gprs[3], regs->gprs[4], Loading arch/s390/kernel/signal.c +2 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <linux/binfmts.h> #include <linux/tracehook.h> #include <linux/syscalls.h> #include <linux/compat.h> #include <asm/ucontext.h> #include <asm/uaccess.h> #include <asm/lowcore.h> Loading Loading @@ -482,7 +483,7 @@ void do_signal(struct pt_regs *regs) /* Whee! Actually deliver the signal. */ int ret; #ifdef CONFIG_COMPAT if (test_thread_flag(TIF_31BIT)) { if (is_compat_task()) { ret = handle_signal32(signr, &ka, &info, oldset, regs); } else Loading arch/s390/kernel/vdso.c +2 −2 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ #include <linux/elf.h> #include <linux/security.h> #include <linux/bootmem.h> #include <linux/compat.h> #include <asm/pgtable.h> #include <asm/system.h> #include <asm/processor.h> Loading Loading @@ -214,7 +214,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) vdso_pagelist = vdso64_pagelist; vdso_pages = vdso64_pages; #ifdef CONFIG_COMPAT if (test_thread_flag(TIF_31BIT)) { if (is_compat_task()) { vdso_pagelist = vdso32_pagelist; vdso_pages = vdso32_pages; } Loading Loading
arch/s390/include/asm/compat.h +18 −1 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ */ #include <linux/types.h> #include <linux/sched.h> #include <linux/thread_info.h> #define PSW32_MASK_PER 0x40000000UL #define PSW32_MASK_DAT 0x04000000UL Loading Loading @@ -163,12 +164,28 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) return (u32)(unsigned long)uptr; } #ifdef CONFIG_COMPAT static inline int is_compat_task(void) { return test_thread_flag(TIF_31BIT); } #else static inline int is_compat_task(void) { return 0; } #endif static inline void __user *compat_alloc_user_space(long len) { unsigned long stack; stack = KSTK_ESP(current); if (test_thread_flag(TIF_31BIT)) if (is_compat_task()) stack &= 0x7fffffffUL; return (void __user *) (stack - len); } Loading
arch/s390/kernel/process.c +2 −1 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <linux/elfcore.h> #include <linux/kernel_stat.h> #include <linux/syscalls.h> #include <asm/compat.h> #include <asm/uaccess.h> #include <asm/pgtable.h> #include <asm/system.h> Loading Loading @@ -204,7 +205,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, save_fp_regs(&p->thread.fp_regs); /* Set a new TLS ? */ if (clone_flags & CLONE_SETTLS) { if (test_thread_flag(TIF_31BIT)) { if (is_compat_task()) { p->thread.acrs[0] = (unsigned int) regs->gprs[6]; } else { p->thread.acrs[0] = (unsigned int)(regs->gprs[6] >> 32); Loading
arch/s390/kernel/ptrace.c +5 −7 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ #include <linux/elf.h> #include <linux/regset.h> #include <linux/tracehook.h> #include <linux/compat.h> #include <asm/segment.h> #include <asm/page.h> #include <asm/pgtable.h> Loading Loading @@ -69,7 +69,7 @@ FixPerRegisters(struct task_struct *task) if (per_info->single_step) { per_info->control_regs.bits.starting_addr = 0; #ifdef CONFIG_COMPAT if (test_thread_flag(TIF_31BIT)) if (is_compat_task()) per_info->control_regs.bits.ending_addr = 0x7fffffffUL; else #endif Loading Loading @@ -482,8 +482,7 @@ static int peek_user_compat(struct task_struct *child, { __u32 tmp; if (!test_thread_flag(TIF_31BIT) || (addr & 3) || addr > sizeof(struct user) - 3) if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user) - 3) return -EIO; tmp = __peek_user_compat(child, addr); Loading Loading @@ -584,8 +583,7 @@ static int __poke_user_compat(struct task_struct *child, static int poke_user_compat(struct task_struct *child, addr_t addr, addr_t data) { if (!test_thread_flag(TIF_31BIT) || (addr & 3) || addr > sizeof(struct user32) - 3) if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user32) - 3) return -EIO; return __poke_user_compat(child, addr, data); Loading Loading @@ -660,7 +658,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) } if (unlikely(current->audit_context)) audit_syscall_entry(test_thread_flag(TIF_31BIT) ? audit_syscall_entry(is_compat_task() ? AUDIT_ARCH_S390 : AUDIT_ARCH_S390X, regs->gprs[2], regs->orig_gpr2, regs->gprs[3], regs->gprs[4], Loading
arch/s390/kernel/signal.c +2 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <linux/binfmts.h> #include <linux/tracehook.h> #include <linux/syscalls.h> #include <linux/compat.h> #include <asm/ucontext.h> #include <asm/uaccess.h> #include <asm/lowcore.h> Loading Loading @@ -482,7 +483,7 @@ void do_signal(struct pt_regs *regs) /* Whee! Actually deliver the signal. */ int ret; #ifdef CONFIG_COMPAT if (test_thread_flag(TIF_31BIT)) { if (is_compat_task()) { ret = handle_signal32(signr, &ka, &info, oldset, regs); } else Loading
arch/s390/kernel/vdso.c +2 −2 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ #include <linux/elf.h> #include <linux/security.h> #include <linux/bootmem.h> #include <linux/compat.h> #include <asm/pgtable.h> #include <asm/system.h> #include <asm/processor.h> Loading Loading @@ -214,7 +214,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) vdso_pagelist = vdso64_pagelist; vdso_pages = vdso64_pages; #ifdef CONFIG_COMPAT if (test_thread_flag(TIF_31BIT)) { if (is_compat_task()) { vdso_pagelist = vdso32_pagelist; vdso_pages = vdso32_pages; } Loading