blob: 5701c1597c3251902ca3abe24778e40227ff250e [file] [log] [blame]
Juan Cespedesa4850832002-03-03 02:37:50 +01001#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
Ian Wienand3219f322006-02-16 06:00:00 +010012void enable_breakpoint(pid_t pid, struct breakpoint *sbp)
13{
14 int i, j;
Juan Cespedesa4850832002-03-03 02:37:50 +010015
Ian Wienand3219f322006-02-16 06:00:00 +010016 if (opt_d > 1) {
Juan Cespedesefe85f02004-04-04 01:31:38 +020017 output_line(0, "enable_breakpoint(%d,%p)", pid, sbp->addr);
Juan Cespedesa4850832002-03-03 02:37:50 +010018 }
19
Ian Wienand3219f322006-02-16 06:00:00 +010020 for (i = 0; i < 1 + ((BREAKPOINT_LENGTH - 1) / sizeof(long)); i++) {
21 long a =
22 ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i * sizeof(long),
23 0);
24 for (j = 0;
25 j < sizeof(long)
26 && i * sizeof(long) + j < BREAKPOINT_LENGTH; j++) {
27 unsigned char *bytes = (unsigned char *)&a;
Juan Cespedesa4850832002-03-03 02:37:50 +010028
Ian Wienand3219f322006-02-16 06:00:00 +010029 sbp->orig_value[i * sizeof(long) + j] = bytes[+j];
30 bytes[j] = break_insn[i * sizeof(long) + j];
Juan Cespedesa4850832002-03-03 02:37:50 +010031 }
Ian Wienand3219f322006-02-16 06:00:00 +010032 ptrace(PTRACE_POKETEXT, pid, sbp->addr + i * sizeof(long), a);
Juan Cespedesa4850832002-03-03 02:37:50 +010033 }
34}
35
Ian Wienand3219f322006-02-16 06:00:00 +010036void disable_breakpoint(pid_t pid, const struct breakpoint *sbp)
37{
38 int i, j;
Juan Cespedesa4850832002-03-03 02:37:50 +010039
Ian Wienand3219f322006-02-16 06:00:00 +010040 if (opt_d > 1) {
Juan Cespedesefe85f02004-04-04 01:31:38 +020041 output_line(0, "disable_breakpoint(%d,%p)", pid, sbp->addr);
Juan Cespedesa4850832002-03-03 02:37:50 +010042 }
43
Ian Wienand3219f322006-02-16 06:00:00 +010044 for (i = 0; i < 1 + ((BREAKPOINT_LENGTH - 1) / sizeof(long)); i++) {
45 long a =
46 ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i * sizeof(long),
47 0);
48 for (j = 0;
49 j < sizeof(long)
50 && i * sizeof(long) + j < BREAKPOINT_LENGTH; j++) {
51 unsigned char *bytes = (unsigned char *)&a;
Juan Cespedesa4850832002-03-03 02:37:50 +010052
Ian Wienand3219f322006-02-16 06:00:00 +010053 bytes[j] = sbp->orig_value[i * sizeof(long) + j];
Juan Cespedesa4850832002-03-03 02:37:50 +010054 }
Ian Wienand3219f322006-02-16 06:00:00 +010055 ptrace(PTRACE_POKETEXT, pid, sbp->addr + i * sizeof(long), a);
Juan Cespedesa4850832002-03-03 02:37:50 +010056 }
57}