Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 
 12 extern int syscall_table_size;
 13 #define NR_syscalls (syscall_table_size / sizeof(void *))
 14 
 15 void 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(r, 0);
 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         REGS_SET_SYSCALL_RETURN(r->gp, result);
 38 
 39         syscall_trace(r, 1);
 40 }
 41 
  This page was automatically generated by the LXR engine.