diff options
| -rw-r--r-- | arch/arm/include/asm/io.h | 24 | ||||
| -rw-r--r-- | arch/arm/include/asm/thread_info.h | 8 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-common.S | 8 | ||||
| -rw-r--r-- | arch/arm/kernel/ptrace.c | 3 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 85 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.h | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/traps.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/neponset.c | 1 |
8 files changed, 44 insertions, 89 deletions
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 9af5563dd3eb..815c669fec0a 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h | |||
| @@ -47,9 +47,9 @@ extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen); | |||
| 47 | extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); | 47 | extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); |
| 48 | extern void __raw_readsl(const void __iomem *addr, void *data, int longlen); | 48 | extern void __raw_readsl(const void __iomem *addr, void *data, int longlen); |
| 49 | 49 | ||
| 50 | #define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a) = (v)) | 50 | #define __raw_writeb(v,a) ((void)(__chk_io_ptr(a), *(volatile unsigned char __force *)(a) = (v))) |
| 51 | #define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v)) | 51 | #define __raw_writew(v,a) ((void)(__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v))) |
| 52 | #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v)) | 52 | #define __raw_writel(v,a) ((void)(__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))) |
| 53 | 53 | ||
| 54 | #define __raw_readb(a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a)) | 54 | #define __raw_readb(a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a)) |
| 55 | #define __raw_readw(a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a)) | 55 | #define __raw_readw(a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a)) |
| @@ -229,11 +229,9 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
| 229 | #define readl_relaxed(c) ({ u32 __r = le32_to_cpu((__force __le32) \ | 229 | #define readl_relaxed(c) ({ u32 __r = le32_to_cpu((__force __le32) \ |
| 230 | __raw_readl(c)); __r; }) | 230 | __raw_readl(c)); __r; }) |
| 231 | 231 | ||
| 232 | #define writeb_relaxed(v,c) ((void)__raw_writeb(v,c)) | 232 | #define writeb_relaxed(v,c) __raw_writeb(v,c) |
| 233 | #define writew_relaxed(v,c) ((void)__raw_writew((__force u16) \ | 233 | #define writew_relaxed(v,c) __raw_writew((__force u16) cpu_to_le16(v),c) |
| 234 | cpu_to_le16(v),c)) | 234 | #define writel_relaxed(v,c) __raw_writel((__force u32) cpu_to_le32(v),c) |
| 235 | #define writel_relaxed(v,c) ((void)__raw_writel((__force u32) \ | ||
| 236 | cpu_to_le32(v),c)) | ||
| 237 | 235 | ||
| 238 | #define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; }) | 236 | #define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; }) |
| 239 | #define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; }) | 237 | #define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; }) |
| @@ -281,12 +279,12 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
| 281 | #define ioread16be(p) ({ unsigned int __v = be16_to_cpu((__force __be16)__raw_readw(p)); __iormb(); __v; }) | 279 | #define ioread16be(p) ({ unsigned int __v = be16_to_cpu((__force __be16)__raw_readw(p)); __iormb(); __v; }) |
| 282 | #define ioread32be(p) ({ unsigned int __v = be32_to_cpu((__force __be32)__raw_readl(p)); __iormb(); __v; }) | 280 | #define ioread32be(p) ({ unsigned int __v = be32_to_cpu((__force __be32)__raw_readl(p)); __iormb(); __v; }) |
| 283 | 281 | ||
| 284 | #define iowrite8(v,p) ({ __iowmb(); (void)__raw_writeb(v, p); }) | 282 | #define iowrite8(v,p) ({ __iowmb(); __raw_writeb(v, p); }) |
| 285 | #define iowrite16(v,p) ({ __iowmb(); (void)__raw_writew((__force __u16)cpu_to_le16(v), p); }) | 283 | #define iowrite16(v,p) ({ __iowmb(); __raw_writew((__force __u16)cpu_to_le16(v), p); }) |
| 286 | #define iowrite32(v,p) ({ __iowmb(); (void)__raw_writel((__force __u32)cpu_to_le32(v), p); }) | 284 | #define iowrite32(v,p) ({ __iowmb(); __raw_writel((__force __u32)cpu_to_le32(v), p); }) |
| 287 | 285 | ||
| 288 | #define iowrite16be(v,p) ({ __iowmb(); (void)__raw_writew((__force __u16)cpu_to_be16(v), p); }) | 286 | #define iowrite16be(v,p) ({ __iowmb(); __raw_writew((__force __u16)cpu_to_be16(v), p); }) |
| 289 | #define iowrite32be(v,p) ({ __iowmb(); (void)__raw_writel((__force __u32)cpu_to_be32(v), p); }) | 287 | #define iowrite32be(v,p) ({ __iowmb(); __raw_writel((__force __u32)cpu_to_be32(v), p); }) |
| 290 | 288 | ||
| 291 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) | 289 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) |
| 292 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) | 290 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) |
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 68388eb4946b..b79f8e97f775 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h | |||
| @@ -148,6 +148,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, | |||
| 148 | #define TIF_NOTIFY_RESUME 2 /* callback before returning to user */ | 148 | #define TIF_NOTIFY_RESUME 2 /* callback before returning to user */ |
| 149 | #define TIF_SYSCALL_TRACE 8 | 149 | #define TIF_SYSCALL_TRACE 8 |
| 150 | #define TIF_SYSCALL_AUDIT 9 | 150 | #define TIF_SYSCALL_AUDIT 9 |
| 151 | #define TIF_SYSCALL_RESTARTSYS 10 | ||
| 151 | #define TIF_POLLING_NRFLAG 16 | 152 | #define TIF_POLLING_NRFLAG 16 |
| 152 | #define TIF_USING_IWMMXT 17 | 153 | #define TIF_USING_IWMMXT 17 |
| 153 | #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ | 154 | #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ |
| @@ -162,16 +163,17 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, | |||
| 162 | #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) | 163 | #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) |
| 163 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) | 164 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) |
| 164 | #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) | 165 | #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) |
| 165 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) | ||
| 166 | #define _TIF_SECCOMP (1 << TIF_SECCOMP) | 166 | #define _TIF_SECCOMP (1 << TIF_SECCOMP) |
| 167 | #define _TIF_SYSCALL_RESTARTSYS (1 << TIF_SYSCALL_RESTARTSYS) | ||
| 167 | 168 | ||
| 168 | /* Checks for any syscall work in entry-common.S */ | 169 | /* Checks for any syscall work in entry-common.S */ |
| 169 | #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT) | 170 | #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ |
| 171 | _TIF_SYSCALL_RESTARTSYS) | ||
| 170 | 172 | ||
| 171 | /* | 173 | /* |
| 172 | * Change these and you break ASM code in entry-common.S | 174 | * Change these and you break ASM code in entry-common.S |
| 173 | */ | 175 | */ |
| 174 | #define _TIF_WORK_MASK 0x000000ff | 176 | #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | _TIF_NOTIFY_RESUME) |
| 175 | 177 | ||
| 176 | #endif /* __KERNEL__ */ | 178 | #endif /* __KERNEL__ */ |
| 177 | #endif /* __ASM_ARM_THREAD_INFO_H */ | 179 | #endif /* __ASM_ARM_THREAD_INFO_H */ |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 7bd2d3cb8957..4afed88d250a 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -53,9 +53,13 @@ fast_work_pending: | |||
| 53 | work_pending: | 53 | work_pending: |
| 54 | tst r1, #_TIF_NEED_RESCHED | 54 | tst r1, #_TIF_NEED_RESCHED |
| 55 | bne work_resched | 55 | bne work_resched |
| 56 | tst r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME | 56 | /* |
| 57 | beq no_work_pending | 57 | * TIF_SIGPENDING or TIF_NOTIFY_RESUME must've been set if we got here |
| 58 | */ | ||
| 59 | ldr r2, [sp, #S_PSR] | ||
| 58 | mov r0, sp @ 'regs' | 60 | mov r0, sp @ 'regs' |
| 61 | tst r2, #15 @ are we returning to user mode? | ||
| 62 | bne no_work_pending @ no? just leave, then... | ||
| 59 | mov r2, why @ 'syscall' | 63 | mov r2, why @ 'syscall' |
| 60 | tst r1, #_TIF_SIGPENDING @ delivering a signal? | 64 | tst r1, #_TIF_SIGPENDING @ delivering a signal? |
| 61 | movne why, #0 @ prevent further restarts | 65 | movne why, #0 @ prevent further restarts |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 14e38261cd31..5700a7ae7f0b 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/regset.h> | 25 | #include <linux/regset.h> |
| 26 | #include <linux/audit.h> | 26 | #include <linux/audit.h> |
| 27 | #include <linux/tracehook.h> | 27 | #include <linux/tracehook.h> |
| 28 | #include <linux/unistd.h> | ||
| 28 | 29 | ||
| 29 | #include <asm/pgtable.h> | 30 | #include <asm/pgtable.h> |
| 30 | #include <asm/traps.h> | 31 | #include <asm/traps.h> |
| @@ -917,6 +918,8 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | |||
| 917 | audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, | 918 | audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, |
| 918 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); | 919 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); |
| 919 | 920 | ||
| 921 | if (why == 0 && test_and_clear_thread_flag(TIF_SYSCALL_RESTARTSYS)) | ||
| 922 | scno = __NR_restart_syscall - __NR_SYSCALL_BASE; | ||
| 920 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 923 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
| 921 | return scno; | 924 | return scno; |
| 922 | 925 | ||
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 4e5fdd9bd9e3..17fc36c41cff 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | */ | 29 | */ |
| 30 | #define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)) | 30 | #define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)) |
| 31 | #define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)) | 31 | #define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)) |
| 32 | #define SWI_SYS_RESTART (0xef000000|__NR_restart_syscall|__NR_OABI_SYSCALL_BASE) | ||
| 33 | 32 | ||
| 34 | /* | 33 | /* |
| 35 | * With EABI, the syscall number has to be loaded into r7. | 34 | * With EABI, the syscall number has to be loaded into r7. |
| @@ -50,18 +49,6 @@ const unsigned long sigreturn_codes[7] = { | |||
| 50 | }; | 49 | }; |
| 51 | 50 | ||
| 52 | /* | 51 | /* |
| 53 | * Either we support OABI only, or we have EABI with the OABI | ||
| 54 | * compat layer enabled. In the later case we don't know if | ||
| 55 | * user space is EABI or not, and if not we must not clobber r7. | ||
| 56 | * Always using the OABI syscall solves that issue and works for | ||
| 57 | * all those cases. | ||
| 58 | */ | ||
| 59 | const unsigned long syscall_restart_code[2] = { | ||
| 60 | SWI_SYS_RESTART, /* swi __NR_restart_syscall */ | ||
| 61 | 0xe49df004, /* ldr pc, [sp], #4 */ | ||
| 62 | }; | ||
| 63 | |||
| 64 | /* | ||
| 65 | * atomically swap in the new signal mask, and wait for a signal. | 52 | * atomically swap in the new signal mask, and wait for a signal. |
| 66 | */ | 53 | */ |
| 67 | asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask) | 54 | asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask) |
| @@ -82,10 +69,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
| 82 | old_sigset_t mask; | 69 | old_sigset_t mask; |
| 83 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 70 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
| 84 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 71 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
| 85 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | 72 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || |
| 73 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 74 | __get_user(mask, &act->sa_mask)) | ||
| 86 | return -EFAULT; | 75 | return -EFAULT; |
| 87 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 88 | __get_user(mask, &act->sa_mask); | ||
| 89 | siginitset(&new_ka.sa.sa_mask, mask); | 76 | siginitset(&new_ka.sa.sa_mask, mask); |
| 90 | } | 77 | } |
| 91 | 78 | ||
| @@ -94,10 +81,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
| 94 | if (!ret && oact) { | 81 | if (!ret && oact) { |
| 95 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 82 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
| 96 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 83 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
| 97 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | 84 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || |
| 85 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 86 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 98 | return -EFAULT; | 87 | return -EFAULT; |
| 99 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 100 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 101 | } | 88 | } |
| 102 | 89 | ||
| 103 | return ret; | 90 | return ret; |
| @@ -602,15 +589,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 602 | int signr; | 589 | int signr; |
| 603 | 590 | ||
| 604 | /* | 591 | /* |
| 605 | * We want the common case to go fast, which | ||
| 606 | * is why we may in certain cases get here from | ||
| 607 | * kernel mode. Just return without doing anything | ||
| 608 | * if so. | ||
| 609 | */ | ||
| 610 | if (!user_mode(regs)) | ||
| 611 | return; | ||
| 612 | |||
| 613 | /* | ||
| 614 | * If we were from a system call, check for system call restarting... | 592 | * If we were from a system call, check for system call restarting... |
| 615 | */ | 593 | */ |
| 616 | if (syscall) { | 594 | if (syscall) { |
| @@ -626,18 +604,13 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 626 | case -ERESTARTNOHAND: | 604 | case -ERESTARTNOHAND: |
| 627 | case -ERESTARTSYS: | 605 | case -ERESTARTSYS: |
| 628 | case -ERESTARTNOINTR: | 606 | case -ERESTARTNOINTR: |
| 607 | case -ERESTART_RESTARTBLOCK: | ||
| 629 | regs->ARM_r0 = regs->ARM_ORIG_r0; | 608 | regs->ARM_r0 = regs->ARM_ORIG_r0; |
| 630 | regs->ARM_pc = restart_addr; | 609 | regs->ARM_pc = restart_addr; |
| 631 | break; | 610 | break; |
| 632 | case -ERESTART_RESTARTBLOCK: | ||
| 633 | regs->ARM_r0 = -EINTR; | ||
| 634 | break; | ||
| 635 | } | 611 | } |
| 636 | } | 612 | } |
| 637 | 613 | ||
| 638 | if (try_to_freeze()) | ||
| 639 | goto no_signal; | ||
| 640 | |||
| 641 | /* | 614 | /* |
| 642 | * Get the signal to deliver. When running under ptrace, at this | 615 | * Get the signal to deliver. When running under ptrace, at this |
| 643 | * point the debugger may change all our registers ... | 616 | * point the debugger may change all our registers ... |
| @@ -652,12 +625,14 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 652 | * debugger has chosen to restart at a different PC. | 625 | * debugger has chosen to restart at a different PC. |
| 653 | */ | 626 | */ |
| 654 | if (regs->ARM_pc == restart_addr) { | 627 | if (regs->ARM_pc == restart_addr) { |
| 655 | if (retval == -ERESTARTNOHAND | 628 | if (retval == -ERESTARTNOHAND || |
| 629 | retval == -ERESTART_RESTARTBLOCK | ||
| 656 | || (retval == -ERESTARTSYS | 630 | || (retval == -ERESTARTSYS |
| 657 | && !(ka.sa.sa_flags & SA_RESTART))) { | 631 | && !(ka.sa.sa_flags & SA_RESTART))) { |
| 658 | regs->ARM_r0 = -EINTR; | 632 | regs->ARM_r0 = -EINTR; |
| 659 | regs->ARM_pc = continue_addr; | 633 | regs->ARM_pc = continue_addr; |
| 660 | } | 634 | } |
| 635 | clear_thread_flag(TIF_SYSCALL_RESTARTSYS); | ||
| 661 | } | 636 | } |
| 662 | 637 | ||
| 663 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 638 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
| @@ -677,7 +652,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 677 | return; | 652 | return; |
| 678 | } | 653 | } |
| 679 | 654 | ||
| 680 | no_signal: | ||
| 681 | if (syscall) { | 655 | if (syscall) { |
| 682 | /* | 656 | /* |
| 683 | * Handle restarting a different system call. As above, | 657 | * Handle restarting a different system call. As above, |
| @@ -685,38 +659,15 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
| 685 | * ignore the restart. | 659 | * ignore the restart. |
| 686 | */ | 660 | */ |
| 687 | if (retval == -ERESTART_RESTARTBLOCK | 661 | if (retval == -ERESTART_RESTARTBLOCK |
| 688 | && regs->ARM_pc == continue_addr) { | 662 | && regs->ARM_pc == restart_addr) |
| 689 | if (thumb_mode(regs)) { | 663 | set_thread_flag(TIF_SYSCALL_RESTARTSYS); |
| 690 | regs->ARM_r7 = __NR_restart_syscall - __NR_SYSCALL_BASE; | ||
| 691 | regs->ARM_pc -= 2; | ||
| 692 | } else { | ||
| 693 | #if defined(CONFIG_AEABI) && !defined(CONFIG_OABI_COMPAT) | ||
| 694 | regs->ARM_r7 = __NR_restart_syscall; | ||
| 695 | regs->ARM_pc -= 4; | ||
| 696 | #else | ||
| 697 | u32 __user *usp; | ||
| 698 | |||
| 699 | regs->ARM_sp -= 4; | ||
| 700 | usp = (u32 __user *)regs->ARM_sp; | ||
| 701 | |||
| 702 | if (put_user(regs->ARM_pc, usp) == 0) { | ||
| 703 | regs->ARM_pc = KERN_RESTART_CODE; | ||
| 704 | } else { | ||
| 705 | regs->ARM_sp += 4; | ||
| 706 | force_sigsegv(0, current); | ||
| 707 | } | ||
| 708 | #endif | ||
| 709 | } | ||
| 710 | } | ||
| 711 | |||
| 712 | /* If there's no signal to deliver, we just put the saved sigmask | ||
| 713 | * back. | ||
| 714 | */ | ||
| 715 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
| 716 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
| 717 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
| 718 | } | ||
| 719 | } | 664 | } |
| 665 | |||
| 666 | /* If there's no signal to deliver, we just put the saved sigmask | ||
| 667 | * back. | ||
| 668 | */ | ||
| 669 | if (test_and_clear_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 670 | set_current_blocked(¤t->saved_sigmask); | ||
| 720 | } | 671 | } |
| 721 | 672 | ||
| 722 | asmlinkage void | 673 | asmlinkage void |
diff --git a/arch/arm/kernel/signal.h b/arch/arm/kernel/signal.h index 6fcfe8398aa4..5ff067b7c752 100644 --- a/arch/arm/kernel/signal.h +++ b/arch/arm/kernel/signal.h | |||
| @@ -8,7 +8,5 @@ | |||
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | #define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500) | 10 | #define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500) |
| 11 | #define KERN_RESTART_CODE (KERN_SIGRETURN_CODE + sizeof(sigreturn_codes)) | ||
| 12 | 11 | ||
| 13 | extern const unsigned long sigreturn_codes[7]; | 12 | extern const unsigned long sigreturn_codes[7]; |
| 14 | extern const unsigned long syscall_restart_code[2]; | ||
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 3647170e9a16..4928d89758f4 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -820,8 +820,6 @@ void __init early_trap_init(void *vectors_base) | |||
| 820 | */ | 820 | */ |
| 821 | memcpy((void *)(vectors + KERN_SIGRETURN_CODE - CONFIG_VECTORS_BASE), | 821 | memcpy((void *)(vectors + KERN_SIGRETURN_CODE - CONFIG_VECTORS_BASE), |
| 822 | sigreturn_codes, sizeof(sigreturn_codes)); | 822 | sigreturn_codes, sizeof(sigreturn_codes)); |
| 823 | memcpy((void *)(vectors + KERN_RESTART_CODE - CONFIG_VECTORS_BASE), | ||
| 824 | syscall_restart_code, sizeof(syscall_restart_code)); | ||
| 825 | 823 | ||
| 826 | flush_icache_range(vectors, vectors + PAGE_SIZE); | 824 | flush_icache_range(vectors, vectors + PAGE_SIZE); |
| 827 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); | 825 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); |
diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index 6c58f01b358a..266db873a4e4 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c | |||
| @@ -89,6 +89,7 @@ void neponset_ncr_frob(unsigned int mask, unsigned int val) | |||
| 89 | WARN(1, "nep_base unset\n"); | 89 | WARN(1, "nep_base unset\n"); |
| 90 | } | 90 | } |
| 91 | } | 91 | } |
| 92 | EXPORT_SYMBOL(neponset_ncr_frob); | ||
| 92 | 93 | ||
| 93 | static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) | 94 | static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) |
| 94 | { | 95 | { |
