2 * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
9 #include <asm/unistd.h>
10 #include "sysdep/ptrace.h"
11 #include "sigcontext.h"
12 #include "ptrace_user.h"
14 #include "user_util.h"
15 #include "kern_util.h"
16 #include "syscall_user.h"
20 void syscall_handler_tt(int sig
, union uml_pt_regs
*regs
)
25 #ifdef UML_CONFIG_DEBUG_SYSCALL
29 syscall
= UPT_SYSCALL_NR(regs
);
33 #ifdef UML_CONFIG_DEBUG_SYSCALL
34 index
= record_syscall_start(syscall
);
36 syscall_trace(regs
, 0);
37 result
= execute_syscall_tt(regs
);
39 /* regs->sc may have changed while the system call ran (there may
40 * have been an interrupt or segfault), so it needs to be refreshed.
44 SC_SET_SYSCALL_RETURN(sc
, result
);
46 syscall_trace(regs
, 1);
47 #ifdef UML_CONFIG_DEBUG_SYSCALL
48 record_syscall_end(index
, result
);
52 void do_sigtrap(void *task
)
54 UPT_SYSCALL_NR(TASK_REGS(task
)) = -1;
57 void do_syscall(void *task
, int pid
, int local_using_sysemu
)
59 unsigned long proc_regs
[FRAME_SIZE
];
61 if(ptrace_getregs(pid
, proc_regs
) < 0)
62 tracer_panic("Couldn't read registers");
64 UPT_SYSCALL_NR(TASK_REGS(task
)) = PT_SYSCALL_NR(proc_regs
);
67 UPT_ORIGGPR2(TASK_REGS(task
)) = REGS_ORIGGPR2(proc_regs
);
70 if(((unsigned long *) PT_IP(proc_regs
) >= &_stext
) &&
71 ((unsigned long *) PT_IP(proc_regs
) <= &_etext
))
72 tracer_panic("I'm tracing myself and I can't get out");
74 /* advanced sysemu mode set syscall number to -1 automatically */
75 if (local_using_sysemu
==2)
78 /* syscall number -1 in sysemu skips syscall restarting in host */
79 if(ptrace(PTRACE_POKEUSR
, pid
, PT_SYSCALL_NR_OFFSET
,
80 local_using_sysemu
? -1 : __NR_getpid
) < 0)
81 tracer_panic("do_syscall : Nullifying syscall failed, "
86 * Overrides for Emacs so that we follow Linus's tabbing style.
87 * Emacs will notice this stuff at the end of the file and automatically
88 * adjust the settings for this buffer only. This must remain at the end
90 * ---------------------------------------------------------------------------
92 * c-file-style: "linux"