These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / um / kernel / skas / syscall.c
index c0681e0..1683b8e 100644 (file)
@@ -8,9 +8,7 @@
 #include <kern_util.h>
 #include <sysdep/ptrace.h>
 #include <sysdep/syscalls.h>
-
-extern int syscall_table_size;
-#define NR_SYSCALLS (syscall_table_size / sizeof(void *))
+#include <os.h>
 
 void handle_syscall(struct uml_pt_regs *r)
 {
@@ -18,22 +16,19 @@ void handle_syscall(struct uml_pt_regs *r)
        long result;
        int syscall;
 
-       syscall_trace_enter(regs);
+       if (syscall_trace_enter(regs)) {
+               result = -ENOSYS;
+               goto out;
+       }
+
+       syscall = get_syscall(r);
 
-       /*
-        * This should go in the declaration of syscall, but when I do that,
-        * strace -f -c bash -c 'ls ; ls' breaks, sometimes not tracing
-        * children at all, sometimes hanging when bash doesn't see the first
-        * ls exit.
-        * The assembly looks functionally the same to me.  This is
-        *     gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)
-        * in case it's a compiler bug.
-        */
-       syscall = UPT_SYSCALL_NR(r);
-       if ((syscall >= NR_SYSCALLS) || (syscall < 0))
+       if ((syscall > __NR_syscall_max) || syscall < 0)
                result = -ENOSYS;
-       else result = EXECUTE_SYSCALL(syscall, regs);
+       else
+               result = EXECUTE_SYSCALL(syscall, regs);
 
+out:
        PT_REGS_SET_SYSCALL_RETURN(regs, result);
 
        syscall_trace_leave(regs);