Commit | Line | Data |
---|---|---|
e32dacb9 | 1 | /* |
ba180fd4 | 2 | * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
e32dacb9 JD |
3 | * Licensed under the GPL |
4 | */ | |
5 | ||
ba180fd4 | 6 | #include "linux/kernel.h" |
e32dacb9 | 7 | #include "linux/ptrace.h" |
e32dacb9 | 8 | #include "kern_util.h" |
ba180fd4 JD |
9 | #include "sysdep/ptrace.h" |
10 | #include "sysdep/syscalls.h" | |
e32dacb9 | 11 | |
77bf4400 | 12 | void handle_syscall(struct uml_pt_regs *r) |
e32dacb9 JD |
13 | { |
14 | struct pt_regs *regs = container_of(r, struct pt_regs, regs); | |
15 | long result; | |
16 | int syscall; | |
e32dacb9 | 17 | |
e32dacb9 JD |
18 | syscall_trace(r, 0); |
19 | ||
20 | current->thread.nsyscalls++; | |
21 | nsyscalls++; | |
22 | ||
ba180fd4 JD |
23 | /* |
24 | * This should go in the declaration of syscall, but when I do that, | |
e32dacb9 JD |
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); | |
ba180fd4 | 33 | if ((syscall >= NR_syscalls) || (syscall < 0)) |
e32dacb9 JD |
34 | result = -ENOSYS; |
35 | else result = EXECUTE_SYSCALL(syscall, regs); | |
36 | ||
77bf4400 | 37 | REGS_SET_SYSCALL_RETURN(r->regs, result); |
e32dacb9 JD |
38 | |
39 | syscall_trace(r, 1); | |
e32dacb9 | 40 | } |