Blackfin: check for bad syscalls after tracing it
authorMike Frysinger <vapier@gentoo.org>
Fri, 12 Feb 2010 07:24:34 +0000 (07:24 +0000)
committerMike Frysinger <vapier@gentoo.org>
Tue, 9 Mar 2010 05:30:51 +0000 (00:30 -0500)
We want to report all system calls (even invalid ones) to the tracing
layers, so check the NR only after we've notified.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
arch/blackfin/mach-common/entry.S

index 0a9e458..6c20044 100644 (file)
@@ -626,13 +626,6 @@ ENTRY(_system_call)
        p0 = [sp + PT_ORIG_P0];
 #endif /* CONFIG_IPIPE */
 
-       /* Check the System Call */
-       r7 = __NR_syscall;
-       /* System call number is passed in P0 */
-       r6 = p0;
-       cc = r6 < r7;
-       if ! cc jump .Lbadsys;
-
        /* are we tracing syscalls?*/
        r7 = sp;
        r6.l = lo(ALIGN_PAGE_MASK);
@@ -645,6 +638,12 @@ ENTRY(_system_call)
        CC = BITTST(r7,TIF_SINGLESTEP);
        if CC JUMP _sys_trace;
 
+       /* Make sure the system call # is valid */
+       p4 = __NR_syscall;
+       /* System call number is passed in P0 */
+       cc = p4 <= p0;
+       if cc jump .Lbadsys;
+
        /* Execute the appropriate system call */
 
        p4 = p0;
@@ -741,9 +740,14 @@ _sys_trace:
        r0 = sp;
        pseudo_long_call _syscall_trace_enter, p5;
 
-       /* Execute the appropriate system call */
-
+       /* Make sure the system call # is valid */
        p4 = [SP + PT_P0];
+       p3 = __NR_syscall;
+       cc = p3 <= p4;
+       r0 = -ENOSYS;
+       if cc jump .Lsys_trace_badsys;
+
+       /* Execute the appropriate system call */
        p5.l = _sys_call_table;
        p5.h = _sys_call_table;
        p5 = p5 + (p4 << 2);
@@ -761,6 +765,7 @@ _sys_trace:
        SP += -12;
        call (p5);
        SP += 24;
+.Lsys_trace_badsys:
        [sp + PT_R0] = r0;
 
        r0 = sp;