1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
26 #include "breakpoints.h"
29 static char *breakpoint_type_strings
[] =
35 static char *watchpoint_rw_strings
[] =
42 // monotonic counter/id-number for breakpoints and watch points
43 static int bpwp_unique_id
;
45 int breakpoint_add(struct target
*target
, uint32_t address
, uint32_t length
, enum breakpoint_type type
)
47 struct breakpoint
*breakpoint
= target
->breakpoints
;
48 struct breakpoint
**breakpoint_p
= &target
->breakpoints
;
57 if (breakpoint
->address
== address
) {
58 /* FIXME don't assume "same address" means "same
59 * breakpoint" ... check all the parameters before
62 LOG_DEBUG("Duplicate Breakpoint address: 0x%08" PRIx32
" (BP %d)",
63 address
, breakpoint
->unique_id
);
66 breakpoint_p
= &breakpoint
->next
;
67 breakpoint
= breakpoint
->next
;
70 (*breakpoint_p
) = malloc(sizeof(struct breakpoint
));
71 (*breakpoint_p
)->address
= address
;
72 (*breakpoint_p
)->length
= length
;
73 (*breakpoint_p
)->type
= type
;
74 (*breakpoint_p
)->set
= 0;
75 (*breakpoint_p
)->orig_instr
= malloc(length
);
76 (*breakpoint_p
)->next
= NULL
;
77 (*breakpoint_p
)->unique_id
= bpwp_unique_id
++;
79 retval
= target_add_breakpoint(target
, *breakpoint_p
);
83 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
84 reason
= "resource not available";
86 case ERROR_TARGET_NOT_HALTED
:
87 reason
= "target running";
90 reason
= "unknown reason";
92 LOG_ERROR("can't add breakpoint: %s", reason
);
93 free((*breakpoint_p
)->orig_instr
);
99 LOG_DEBUG("added %s breakpoint at 0x%8.8" PRIx32
" of length 0x%8.8x, (BPID: %d)",
100 breakpoint_type_strings
[(*breakpoint_p
)->type
],
101 (*breakpoint_p
)->address
, (*breakpoint_p
)->length
,
102 (*breakpoint_p
)->unique_id
);
107 /* free up a breakpoint */
108 static void breakpoint_free(struct target
*target
, struct breakpoint
*breakpoint_remove
)
110 struct breakpoint
*breakpoint
= target
->breakpoints
;
111 struct breakpoint
**breakpoint_p
= &target
->breakpoints
;
115 if (breakpoint
== breakpoint_remove
)
117 breakpoint_p
= &breakpoint
->next
;
118 breakpoint
= breakpoint
->next
;
121 if (breakpoint
== NULL
)
124 target_remove_breakpoint(target
, breakpoint
);
126 LOG_DEBUG("BPID: %d", breakpoint
->unique_id
);
127 (*breakpoint_p
) = breakpoint
->next
;
128 free(breakpoint
->orig_instr
);
132 void breakpoint_remove(struct target
*target
, uint32_t address
)
134 struct breakpoint
*breakpoint
= target
->breakpoints
;
135 struct breakpoint
**breakpoint_p
= &target
->breakpoints
;
139 if (breakpoint
->address
== address
)
141 breakpoint_p
= &breakpoint
->next
;
142 breakpoint
= breakpoint
->next
;
147 breakpoint_free(target
, breakpoint
);
151 LOG_ERROR("no breakpoint at address 0x%8.8" PRIx32
" found", address
);
155 void breakpoint_clear_target(struct target
*target
)
157 struct breakpoint
*breakpoint
;
159 LOG_DEBUG("Delete all breakpoints for target: %s",
160 target_name(target
));
161 while ((breakpoint
= target
->breakpoints
) != NULL
)
163 breakpoint_free(target
, breakpoint
);
167 struct breakpoint
* breakpoint_find(struct target
*target
, uint32_t address
)
169 struct breakpoint
*breakpoint
= target
->breakpoints
;
173 if (breakpoint
->address
== address
)
175 breakpoint
= breakpoint
->next
;
181 int watchpoint_add(struct target
*target
, uint32_t address
, uint32_t length
,
182 enum watchpoint_rw rw
, uint32_t value
, uint32_t mask
)
184 struct watchpoint
*watchpoint
= target
->watchpoints
;
185 struct watchpoint
**watchpoint_p
= &target
->watchpoints
;
191 if (watchpoint
->address
== address
) {
192 if (watchpoint
->length
!= length
193 || watchpoint
->value
!= value
194 || watchpoint
->mask
!= mask
195 || watchpoint
->rw
!= rw
) {
196 LOG_ERROR("address 0x%8.8" PRIx32
197 "already has watchpoint %d",
198 address
, watchpoint
->unique_id
);
202 /* ignore duplicate watchpoint */
205 watchpoint_p
= &watchpoint
->next
;
206 watchpoint
= watchpoint
->next
;
209 (*watchpoint_p
) = calloc(1, sizeof(struct watchpoint
));
210 (*watchpoint_p
)->address
= address
;
211 (*watchpoint_p
)->length
= length
;
212 (*watchpoint_p
)->value
= value
;
213 (*watchpoint_p
)->mask
= mask
;
214 (*watchpoint_p
)->rw
= rw
;
215 (*watchpoint_p
)->unique_id
= bpwp_unique_id
++;
217 retval
= target_add_watchpoint(target
, *watchpoint_p
);
221 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
222 reason
= "resource not available";
224 case ERROR_TARGET_NOT_HALTED
:
225 reason
= "target running";
228 reason
= "unrecognized error";
230 LOG_ERROR("can't add %s watchpoint at 0x%8.8" PRIx32
", %s",
231 watchpoint_rw_strings
[(*watchpoint_p
)->rw
],
233 free (*watchpoint_p
);
234 *watchpoint_p
= NULL
;
238 LOG_DEBUG("added %s watchpoint at 0x%8.8" PRIx32
239 " of length 0x%8.8" PRIx32
" (WPID: %d)",
240 watchpoint_rw_strings
[(*watchpoint_p
)->rw
],
241 (*watchpoint_p
)->address
,
242 (*watchpoint_p
)->length
,
243 (*watchpoint_p
)->unique_id
);
248 static void watchpoint_free(struct target
*target
, struct watchpoint
*watchpoint_remove
)
250 struct watchpoint
*watchpoint
= target
->watchpoints
;
251 struct watchpoint
**watchpoint_p
= &target
->watchpoints
;
255 if (watchpoint
== watchpoint_remove
)
257 watchpoint_p
= &watchpoint
->next
;
258 watchpoint
= watchpoint
->next
;
261 if (watchpoint
== NULL
)
263 target_remove_watchpoint(target
, watchpoint
);
264 LOG_DEBUG("WPID: %d", watchpoint
->unique_id
);
265 (*watchpoint_p
) = watchpoint
->next
;
269 void watchpoint_remove(struct target
*target
, uint32_t address
)
271 struct watchpoint
*watchpoint
= target
->watchpoints
;
272 struct watchpoint
**watchpoint_p
= &target
->watchpoints
;
276 if (watchpoint
->address
== address
)
278 watchpoint_p
= &watchpoint
->next
;
279 watchpoint
= watchpoint
->next
;
284 watchpoint_free(target
, watchpoint
);
288 LOG_ERROR("no watchpoint at address 0x%8.8" PRIx32
" found", address
);
292 void watchpoint_clear_target(struct target
*target
)
294 struct watchpoint
*watchpoint
;
296 LOG_DEBUG("Delete all watchpoints for target: %s",
297 target_name(target
));
298 while ((watchpoint
= target
->watchpoints
) != NULL
)
300 watchpoint_free(target
, watchpoint
);
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)