trace.c revision 3219f320604810532a4938dda8f9dfadb0e840f3
1#if HAVE_CONFIG_H
2#include "config.h"
3#endif
4
5#include <sys/types.h>
6#include <sys/wait.h>
7#include <signal.h>
8#include <sys/ptrace.h>
9#include <asm/ptrace.h>
10
11#include "ltrace.h"
12
13#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR))
14# define PTRACE_PEEKUSER PTRACE_PEEKUSR
15#endif
16
17#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR))
18# define PTRACE_POKEUSER PTRACE_POKEUSR
19#endif
20
21void get_arch_dep(struct process *proc)
22{
23}
24
25/* Returns 1 if syscall, 2 if sysret, 0 otherwise.
26 */
27int syscall_p(struct process *proc, int status, int *sysnum)
28{
29	int depth;
30
31	if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP) {
32		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_ORIG_D0, 0);
33		if (*sysnum == -1)
34			return 0;
35		if (*sysnum >= 0) {
36			depth = proc->callstack_depth;
37			if (depth > 0 &&
38			    proc->callstack[depth - 1].is_syscall &&
39			    proc->callstack[depth - 1].c_un.syscall ==
40			    *sysnum) {
41				return 2;
42			} else {
43				return 1;
44			}
45		}
46	}
47	return 0;
48}
49
50long gimme_arg(enum tof type, struct process *proc, int arg_num)
51{
52	if (arg_num == -1) {	/* return value */
53		return ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_D0, 0);
54	}
55
56	if (type == LT_TOF_FUNCTION || type == LT_TOF_FUNCTIONR) {
57		return ptrace(PTRACE_PEEKTEXT, proc->pid,
58			      proc->stack_pointer + 4 * (arg_num + 1), 0);
59	} else if (type == LT_TOF_SYSCALL || type == LT_TOF_SYSCALLR) {
60#if 0
61		switch (arg_num) {
62		case 0:
63			return ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_D1, 0);
64		case 1:
65			return ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_D2, 0);
66		case 2:
67			return ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_D3, 0);
68		case 3:
69			return ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_D4, 0);
70		case 4:
71			return ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_D5, 0);
72		default:
73			fprintf(stderr,
74				"gimme_arg called with wrong arguments\n");
75			exit(2);
76		}
77#else
78		/* That hack works on m68k, too */
79		return ptrace(PTRACE_PEEKUSER, proc->pid, 4 * arg_num, 0);
80#endif
81	} else {
82		fprintf(stderr, "gimme_arg called with wrong arguments\n");
83		exit(1);
84	}
85
86	return 0;
87}
88
89void save_register_args(enum tof type, struct process *proc)
90{
91}
92