trace.c revision 3e94cbf0d388a5b5b49f8dbc60f4b24900de89ae
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
22get_arch_dep(Process *proc) {
23}
24
25/* Returns 1 if syscall, 2 if sysret, 0 otherwise.
26 */
27int
28syscall_p(Process *proc, int status, int *sysnum) {
29	int depth;
30
31	if (WIFSTOPPED(status)
32	    && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
33		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * PT_ORIG_D0, 0);
34		if (*sysnum == -1)
35			return 0;
36		if (*sysnum >= 0) {
37			depth = proc->callstack_depth;
38			if (depth > 0 &&
39					proc->callstack[depth - 1].is_syscall &&
40					proc->callstack[depth - 1].c_un.syscall == *sysnum) {
41				return 2;
42			} else {
43				return 1;
44			}
45		}
46	}
47	return 0;
48}
49
50long
51gimme_arg(enum tof type, Process *proc, int arg_num, arg_type_info *info) {
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
90save_register_args(enum tof type, Process *proc) {
91}
92