linux/arch/um/kernel/skas/syscall.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
   3 * Licensed under the GPL
   4 */
   5
   6#include <linux/kernel.h>
   7#include <linux/ptrace.h>
   8#include <kern_util.h>
   9#include <sysdep/ptrace.h>
  10#include <sysdep/syscalls.h>
  11
  12extern int syscall_table_size;
  13#define NR_SYSCALLS (syscall_table_size / sizeof(void *))
  14
  15void handle_syscall(struct uml_pt_regs *r)
  16{
  17        struct pt_regs *regs = container_of(r, struct pt_regs, regs);
  18        long result;
  19        int syscall;
  20
  21        syscall_trace_enter(regs);
  22
  23        /*
  24         * This should go in the declaration of syscall, but when I do that,
  25         * strace -f -c bash -c 'ls ; ls' breaks, sometimes not tracing
  26         * children at all, sometimes hanging when bash doesn't see the first
  27         * ls exit.
  28         * The assembly looks functionally the same to me.  This is
  29         *     gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)
  30         * in case it's a compiler bug.
  31         */
  32        syscall = UPT_SYSCALL_NR(r);
  33        if ((syscall >= NR_SYSCALLS) || (syscall < 0))
  34                result = -ENOSYS;
  35        else result = EXECUTE_SYSCALL(syscall, regs);
  36
  37        PT_REGS_SET_SYSCALL_RETURN(regs, result);
  38
  39        syscall_trace_leave(regs);
  40}
  41