summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2013-02-05 16:36:13 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2013-02-05 16:36:13 +0100
commitce7d953ebecc10f71e191b6d18cfeb2399429d5f (patch)
tree3d3a9a4989bf5ecb0dfe95ba54013ac6b3c4af6f /signal.c
parentbeae4c7182d8204a0d9fa9db2295c42744f7f377 (diff)
downloadstrace-ce7d953ebecc10f71e191b6d18cfeb2399429d5f.tar.gz
strace-ce7d953ebecc10f71e191b6d18cfeb2399429d5f.tar.bz2
strace-ce7d953ebecc10f71e191b6d18cfeb2399429d5f.tar.xz
Optimize out PTRACE_PEEKUSER with -i
strace -i was fetching PC with a separate PEEKUSER despite having GETREGS data: ptrace(PTRACE_GETREGS, 22331, 0, 0x8087f00) = 0 ptrace(PTRACE_PEEKUSER, 22331, 4*EIP, [0x80dd7b7]) = 0 write(3, "[080dd7b7] ioctl(0, SNDCTL_TMR_T"..., 82) = 82 ptrace(PTRACE_SYSCALL, 22331, 0, SIG_0) = 0 Now it does this: ptrace(PTRACE_GETREGS, 22549, 0, 0x8087ea0) = 0 write(3, "[080dd7b7] ioctl(0, SNDCTL_TMR_T"..., 82) = 82 ptrace(PTRACE_SYSCALL, 22549, 0, SIG_0) = 0 Analogous improvement in sys_sigreturn() is also implemented. * defs.h: Declare extern struct pt_regs regs for SPARC[64] and ARM. Declare clear_regs(), get_regs() and get_regs_error flag variable. * strace.c (trace): Call get_regs(pid) as soon as we know the tcb and that it is stopped. * syscall.c (get_regs): New function. Used to fetch registers early, just after tracee has stopped. (printcall): Move it here from util.c. Use global regs.REG data, if available on the arch, instead of re-fetching it. (get_scno): Use global regs.REG data. (get_syscall_result): Likewise. * signal.c (sys_sigreturn): Likewise. * util.c (printcall): Moved to syscall.c. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c15
1 files changed, 0 insertions, 15 deletions
diff --git a/signal.c b/signal.c
index c77758f..878a33d 100644
--- a/signal.c
+++ b/signal.c
@@ -60,13 +60,6 @@
# include <asm/ptrace_offsets.h>
#endif
-#if defined(SPARC64)
-# undef PTRACE_GETREGS
-# define PTRACE_GETREGS PTRACE_GETREGS64
-# undef PTRACE_SETREGS
-# define PTRACE_SETREGS PTRACE_SETREGS64
-#endif
-
#if defined(SPARC) || defined(SPARC64) || defined(MIPS)
typedef struct {
struct pt_regs si_regs;
@@ -889,11 +882,8 @@ sys_sigreturn(struct tcb *tcp)
{
#if defined(ARM)
if (entering(tcp)) {
- struct pt_regs regs;
struct sigcontext_struct sc;
sigset_t sigm;
- if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)&regs) == -1)
- return 0;
if (umove(tcp, regs.ARM_sp, &sc) < 0)
return 0;
long_to_sigset(sc.oldmask, &sigm);
@@ -986,13 +976,8 @@ sys_sigreturn(struct tcb *tcp)
#elif defined(SPARC) || defined(SPARC64)
if (entering(tcp)) {
long i1;
- struct pt_regs regs;
m_siginfo_t si;
sigset_t sigm;
- if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0) {
- perror_msg("%s", "sigreturn: PTRACE_GETREGS");
- return 0;
- }
i1 = regs.u_regs[U_REG_O1];
if (umove(tcp, i1, &si) < 0) {
perror_msg("%s", "sigreturn: umove");