aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-05-29 21:21:44 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-29 21:21:44 -0400
commit227d1e4319ffd8729781941d92f4ae4d85beecd9 (patch)
tree22dd4d85386dd3bdd228b7be988bebbb9607d0fa /arch/arm
parent7d36014b972a3833b883a7ef41e6bd3b0d187850 (diff)
parente94c805f0c234ef54609f23695b60add6b25ad40 (diff)
Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm
Pull arm updates from Russell King: "This contains both some fixes found when trying to get the Assabet+neponset setup as a replacement firewall with a 3c589 PCMCIA card, and a bunch of changes from Al to fix up the ARM signal handling, particularly some of the restart behaviour." * 'for-linus' of git://git.linaro.org/people/rmk/linux-arm: ARM: neponset: make sure neponset_ncr_frob() is exported ARM: fix out[bwl]() arm: don't open-code ptrace_report_syscall() arm: bury unused _TIF_RESTORE_SIGMASK arm: remove unused restart trampoline arm: new way of handling ERESTART_RESTARTBLOCK arm: if we get into work_pending while returning to kernel mode, just go away arm: don't call try_to_freeze() from do_signal() arm: if there's no handler we need to restore sigmask, syscall or no syscall arm: trim _TIF_WORK_MASK, get rid of useless test and branch... arm: missing checks of __get_user()/__put_user() return values
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/include/asm/io.h24
-rw-r--r--arch/arm/include/asm/thread_info.h8
-rw-r--r--arch/arm/kernel/entry-common.S8
-rw-r--r--arch/arm/kernel/ptrace.c3
-rw-r--r--arch/arm/kernel/signal.c85
-rw-r--r--arch/arm/kernel/signal.h2
-rw-r--r--arch/arm/kernel/traps.c2
-rw-r--r--arch/arm/mach-sa1100/neponset.c1
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);
47extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); 47extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
48extern void __raw_readsl(const void __iomem *addr, void *data, int longlen); 48extern 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:
53work_pending: 53work_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 */
59const 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 */
67asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask) 54asmlinkage 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, &current->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(&current->saved_sigmask);
720} 671}
721 672
722asmlinkage void 673asmlinkage 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
13extern const unsigned long sigreturn_codes[7]; 12extern const unsigned long sigreturn_codes[7];
14extern 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}
92EXPORT_SYMBOL(neponset_ncr_frob);
92 93
93static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) 94static void neponset_set_mctrl(struct uart_port *port, u_int mctrl)
94{ 95{