]>
Commit | Line | Data |
---|---|---|
7d9884b9 JG |
1 | /* Simulate breakpoints by patching locations in the target system, for GDB. |
2 | Copyright 1990, 1991 Free Software Foundation, Inc. | |
3 | Contributed by Cygnus Support. Written by John Gilmore. | |
bd5635a1 RP |
4 | |
5 | This file is part of GDB. | |
6 | ||
7d9884b9 | 7 | This program is free software; you can redistribute it and/or modify |
bd5635a1 | 8 | it under the terms of the GNU General Public License as published by |
7d9884b9 JG |
9 | the Free Software Foundation; either version 2 of the License, or |
10 | (at your option) any later version. | |
bd5635a1 | 11 | |
7d9884b9 | 12 | This program is distributed in the hope that it will be useful, |
bd5635a1 RP |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
7d9884b9 JG |
18 | along with this program; if not, write to the Free Software |
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
bd5635a1 RP |
20 | |
21 | #include "defs.h" | |
bd5635a1 RP |
22 | |
23 | #ifdef BREAKPOINT | |
24 | /* This file is only useful if BREAKPOINT is set. If not, we punt. */ | |
25 | ||
26 | #include <stdio.h> | |
27 | #include "breakpoint.h" | |
28 | #include "inferior.h" | |
29 | #include "target.h" | |
30 | ||
31 | /* This is the sequence of bytes we insert for a breakpoint. On some | |
32 | machines, breakpoints are handled by the target environment and we | |
33 | don't have to worry about them here. */ | |
34 | ||
35 | static char break_insn[] = BREAKPOINT; | |
36 | ||
37 | /* This is only to check that BREAKPOINT fits in BREAKPOINT_MAX bytes. */ | |
38 | ||
39 | static char check_break_insn_size[BREAKPOINT_MAX] = BREAKPOINT; | |
40 | ||
41 | /* Insert a breakpoint on machines that don't have any better breakpoint | |
42 | support. We read the contents of the target location and stash it, | |
43 | then overwrite it with a breakpoint instruction. ADDR is the target | |
44 | location in the target machine. CONTENTS_CACHE is a pointer to | |
45 | memory allocated for saving the target contents. It is guaranteed | |
46 | by the caller to be long enough to save sizeof BREAKPOINT bytes. | |
47 | FIXME: This size is target_arch dependent and should be available in | |
48 | the target_arch transfer vector, if we ever have one... */ | |
49 | ||
50 | int | |
51 | memory_insert_breakpoint (addr, contents_cache) | |
52 | CORE_ADDR addr; | |
53 | char *contents_cache; | |
54 | { | |
55 | int val; | |
56 | ||
57 | val = target_read_memory (addr, contents_cache, sizeof break_insn); | |
58 | ||
59 | if (val == 0) | |
60 | val = target_write_memory (addr, break_insn, sizeof break_insn); | |
61 | ||
62 | return val; | |
63 | } | |
64 | ||
65 | ||
66 | int | |
67 | memory_remove_breakpoint (addr, contents_cache) | |
68 | CORE_ADDR addr; | |
69 | char *contents_cache; | |
70 | { | |
71 | return target_write_memory (addr, contents_cache, sizeof break_insn); | |
72 | } | |
73 | ||
74 | ||
7d9884b9 | 75 | int memory_breakpoint_size = sizeof (break_insn); |
bd5635a1 | 76 | |
bd5635a1 RP |
77 | |
78 | #else /* BREAKPOINT */ | |
79 | ||
80 | char nogo[] = "Breakpoints not implemented for this target."; | |
81 | ||
82 | int | |
83 | memory_insert_breakpoint (addr, contents_cache) | |
84 | CORE_ADDR addr; | |
85 | char *contents_cache; | |
86 | { | |
87 | error (nogo); | |
88 | return 0; /* lint */ | |
89 | } | |
90 | ||
91 | int | |
92 | memory_remove_breakpoint (addr, contents_cache) | |
93 | CORE_ADDR addr; | |
94 | char *contents_cache; | |
95 | { | |
96 | error (nogo); | |
97 | return 0; /* lint */ | |
98 | } | |
99 | ||
7d9884b9 JG |
100 | int memory_breakpoint_size = -1; |
101 | ||
bd5635a1 | 102 | #endif /* BREAKPOINT */ |