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(target_t
*target
, uint32_t address
, uint32_t length
, enum breakpoint_type type
)
47 breakpoint_t
*breakpoint
= target
->breakpoints
;
48 breakpoint_t
**breakpoint_p
= &target
->breakpoints
;
56 if (breakpoint
->address
== address
){
57 LOG_DEBUG("Duplicate Breakpoint address: 0x%08" PRIx32
" (BP %d)",
58 address
, breakpoint
->unique_id
);
61 breakpoint_p
= &breakpoint
->next
;
62 breakpoint
= breakpoint
->next
;
65 (*breakpoint_p
) = malloc(sizeof(breakpoint_t
));
66 (*breakpoint_p
)->address
= address
;
67 (*breakpoint_p
)->length
= length
;
68 (*breakpoint_p
)->type
= type
;
69 (*breakpoint_p
)->set
= 0;
70 (*breakpoint_p
)->orig_instr
= malloc(length
);
71 (*breakpoint_p
)->next
= NULL
;
72 (*breakpoint_p
)->unique_id
= bpwp_unique_id
++;
74 if ((retval
= target_add_breakpoint(target
, *breakpoint_p
)) != ERROR_OK
)
78 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
79 LOG_INFO("can't add %s breakpoint, resource not available (BPID=%d)",
80 breakpoint_type_strings
[(*breakpoint_p
)->type
],
81 (*breakpoint_p
)->unique_id
);
83 free((*breakpoint_p
)->orig_instr
);
88 case ERROR_TARGET_NOT_HALTED
:
89 LOG_INFO("can't add breakpoint while target is running (BPID: %d)",
90 (*breakpoint_p
)->unique_id
);
91 free((*breakpoint_p
)->orig_instr
);
101 LOG_DEBUG("added %s breakpoint at 0x%8.8" PRIx32
" of length 0x%8.8x, (BPID: %d)",
102 breakpoint_type_strings
[(*breakpoint_p
)->type
],
103 (*breakpoint_p
)->address
, (*breakpoint_p
)->length
,
104 (*breakpoint_p
)->unique_id
);
109 /* free up a breakpoint */
110 static void breakpoint_free(target_t
*target
, breakpoint_t
*breakpoint_remove
)
112 breakpoint_t
*breakpoint
= target
->breakpoints
;
113 breakpoint_t
**breakpoint_p
= &target
->breakpoints
;
117 if (breakpoint
== breakpoint_remove
)
119 breakpoint_p
= &breakpoint
->next
;
120 breakpoint
= breakpoint
->next
;
123 if (breakpoint
== NULL
)
126 target_remove_breakpoint(target
, breakpoint
);
128 LOG_DEBUG("BPID: %d", breakpoint
->unique_id
);
129 (*breakpoint_p
) = breakpoint
->next
;
130 free(breakpoint
->orig_instr
);
134 void breakpoint_remove(target_t
*target
, uint32_t address
)
136 breakpoint_t
*breakpoint
= target
->breakpoints
;
137 breakpoint_t
**breakpoint_p
= &target
->breakpoints
;
141 if (breakpoint
->address
== address
)
143 breakpoint_p
= &breakpoint
->next
;
144 breakpoint
= breakpoint
->next
;
149 breakpoint_free(target
, breakpoint
);
153 LOG_ERROR("no breakpoint at address 0x%8.8" PRIx32
" found", address
);
157 void breakpoint_clear_target(target_t
*target
)
159 breakpoint_t
*breakpoint
;
160 LOG_DEBUG("Delete all breakpoints for target: %s", target_get_name( target
));
161 while ((breakpoint
= target
->breakpoints
) != NULL
)
163 breakpoint_free(target
, breakpoint
);
167 breakpoint_t
* breakpoint_find(target_t
*target
, uint32_t address
)
169 breakpoint_t
*breakpoint
= target
->breakpoints
;
173 if (breakpoint
->address
== address
)
175 breakpoint
= breakpoint
->next
;
181 int watchpoint_add(target_t
*target
, uint32_t address
, uint32_t length
, enum watchpoint_rw rw
, uint32_t value
, uint32_t mask
)
183 watchpoint_t
*watchpoint
= target
->watchpoints
;
184 watchpoint_t
**watchpoint_p
= &target
->watchpoints
;
189 if (watchpoint
->address
== address
)
191 watchpoint_p
= &watchpoint
->next
;
192 watchpoint
= watchpoint
->next
;
195 (*watchpoint_p
) = malloc(sizeof(watchpoint_t
));
196 (*watchpoint_p
)->address
= address
;
197 (*watchpoint_p
)->length
= length
;
198 (*watchpoint_p
)->value
= value
;
199 (*watchpoint_p
)->mask
= mask
;
200 (*watchpoint_p
)->rw
= rw
;
201 (*watchpoint_p
)->set
= 0;
202 (*watchpoint_p
)->next
= NULL
;
203 (*watchpoint_p
)->unique_id
= bpwp_unique_id
++;
205 if ((retval
= target_add_watchpoint(target
, *watchpoint_p
)) != ERROR_OK
)
209 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
210 LOG_INFO("can't add %s watchpoint, resource not available (WPID: %d)",
211 watchpoint_rw_strings
[(*watchpoint_p
)->rw
],
212 (*watchpoint_p
)->unique_id
);
213 free (*watchpoint_p
);
214 *watchpoint_p
= NULL
;
217 case ERROR_TARGET_NOT_HALTED
:
218 LOG_INFO("can't add watchpoint while target is running (WPID: %d)",
219 (*watchpoint_p
)->unique_id
);
220 free (*watchpoint_p
);
221 *watchpoint_p
= NULL
;
225 LOG_ERROR("unknown error");
231 LOG_DEBUG("added %s watchpoint at 0x%8.8" PRIx32
" of length 0x%8.8x (WPID: %d)",
232 watchpoint_rw_strings
[(*watchpoint_p
)->rw
],
233 (*watchpoint_p
)->address
,
234 (*watchpoint_p
)->length
,
235 (*watchpoint_p
)->unique_id
);
240 static void watchpoint_free(target_t
*target
, watchpoint_t
*watchpoint_remove
)
242 watchpoint_t
*watchpoint
= target
->watchpoints
;
243 watchpoint_t
**watchpoint_p
= &target
->watchpoints
;
247 if (watchpoint
== watchpoint_remove
)
249 watchpoint_p
= &watchpoint
->next
;
250 watchpoint
= watchpoint
->next
;
253 if (watchpoint
== NULL
)
255 target_remove_watchpoint(target
, watchpoint
);
256 LOG_DEBUG("WPID: %d", watchpoint
->unique_id
);
257 (*watchpoint_p
) = watchpoint
->next
;
261 void watchpoint_remove(target_t
*target
, uint32_t address
)
263 watchpoint_t
*watchpoint
= target
->watchpoints
;
264 watchpoint_t
**watchpoint_p
= &target
->watchpoints
;
268 if (watchpoint
->address
== address
)
270 watchpoint_p
= &watchpoint
->next
;
271 watchpoint
= watchpoint
->next
;
276 watchpoint_free(target
, watchpoint
);
280 LOG_ERROR("no watchpoint at address 0x%8.8" PRIx32
" found", address
);
284 void watchpoint_clear_target(target_t
*target
)
286 watchpoint_t
*watchpoint
;
287 LOG_DEBUG("Delete all watchpoints for target: %s", target_get_name( target
));
288 while ((watchpoint
= target
->watchpoints
) != NULL
)
290 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)