breakpoint.c revision 5c3fe0697b202cc7d95e90459de0fb312b297b27
1#if HAVE_CONFIG_H
2#include "config.h"
3#endif
4
5#include <sys/ptrace.h>
6#include "arch.h"
7#include "options.h"
8#include "output.h"
9
10static unsigned char break_insn[] = BREAKPOINT_VALUE;
11
12void
13enable_breakpoint(pid_t pid, struct breakpoint * sbp) {
14	int i,j;
15
16	if (opt_d>1) {
17		output_line(0, "enable_breakpoint(%d,%p)", pid, sbp->addr);
18	}
19
20	for(i=0; i < 1+((BREAKPOINT_LENGTH-1)/sizeof(long)); i++) {
21		long a = ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i*sizeof(long), 0);
22		for(j=0; j<sizeof(long) && i*sizeof(long)+j < BREAKPOINT_LENGTH; j++) {
23			unsigned char * bytes = (unsigned char *)&a;
24
25			sbp->orig_value[i*sizeof(long)+j] = bytes[+j];
26			bytes[j] = break_insn[i*sizeof(long)+j];
27		}
28		ptrace(PTRACE_POKETEXT, pid, sbp->addr + i*sizeof(long), a);
29	}
30}
31
32void
33disable_breakpoint(pid_t pid, const struct breakpoint * sbp) {
34	int i,j;
35
36	if (opt_d>1) {
37		output_line(0, "disable_breakpoint(%d,%p)", pid, sbp->addr);
38	}
39
40	for(i=0; i < 1+((BREAKPOINT_LENGTH-1)/sizeof(long)); i++) {
41		long a = ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i*sizeof(long), 0);
42		for(j=0; j<sizeof(long) && i*sizeof(long)+j < BREAKPOINT_LENGTH; j++) {
43			unsigned char * bytes = (unsigned char *)&a;
44
45			bytes[j] = sbp->orig_value[i*sizeof(long)+j];
46		}
47		ptrace(PTRACE_POKETEXT, pid, sbp->addr + i*sizeof(long), a);
48	}
49}
50