diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2013-02-05 16:36:13 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-02-05 16:36:13 +0100 |
commit | ce7d953ebecc10f71e191b6d18cfeb2399429d5f (patch) | |
tree | 3d3a9a4989bf5ecb0dfe95ba54013ac6b3c4af6f /signal.c | |
parent | beae4c7182d8204a0d9fa9db2295c42744f7f377 (diff) | |
download | strace-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.c | 15 |
1 files changed, 0 insertions, 15 deletions
@@ -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 *)®s) == -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 *)®s, 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"); |