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 "binarybuffer.h"
31 #include "breakpoints.h"
33 static char *breakpoint_type_strings
[] =
39 static char *watchpoint_rw_strings
[] =
46 int breakpoint_add(target_t
*target
, u32 address
, u32 length
, enum breakpoint_type type
)
48 breakpoint_t
*breakpoint
= target
->breakpoints
;
49 breakpoint_t
**breakpoint_p
= &target
->breakpoints
;
54 if (breakpoint
->address
== address
)
56 breakpoint_p
= &breakpoint
->next
;
57 breakpoint
= breakpoint
->next
;
60 (*breakpoint_p
) = malloc(sizeof(breakpoint_t
));
61 (*breakpoint_p
)->address
= address
;
62 (*breakpoint_p
)->length
= length
;
63 (*breakpoint_p
)->type
= type
;
64 (*breakpoint_p
)->set
= 0;
65 (*breakpoint_p
)->orig_instr
= malloc(length
);
66 (*breakpoint_p
)->next
= NULL
;
68 if ((retval
= target
->type
->add_breakpoint(target
, *breakpoint_p
)) != ERROR_OK
)
72 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
73 LOG_INFO("can't add %s breakpoint, resource not available", breakpoint_type_strings
[(*breakpoint_p
)->type
]);
74 free((*breakpoint_p
)->orig_instr
);
79 case ERROR_TARGET_NOT_HALTED
:
80 LOG_INFO("can't add breakpoint while target is running");
81 free((*breakpoint_p
)->orig_instr
);
91 LOG_DEBUG("added %s breakpoint at 0x%8.8x of length 0x%8.8x",
92 breakpoint_type_strings
[(*breakpoint_p
)->type
],
93 (*breakpoint_p
)->address
, (*breakpoint_p
)->length
);
98 /* free up a breakpoint */
99 static void breakpoint_free(target_t
*target
, breakpoint_t
*breakpoint_remove
)
101 breakpoint_t
*breakpoint
= target
->breakpoints
;
102 breakpoint_t
**breakpoint_p
= &target
->breakpoints
;
106 if (breakpoint
==breakpoint_remove
)
108 breakpoint_p
= &breakpoint
->next
;
109 breakpoint
= breakpoint
->next
;
112 if (breakpoint
==NULL
)
115 target
->type
->remove_breakpoint(target
, breakpoint
);
117 (*breakpoint_p
) = breakpoint
->next
;
118 free(breakpoint
->orig_instr
);
122 void breakpoint_remove(target_t
*target
, u32 address
)
124 breakpoint_t
*breakpoint
= target
->breakpoints
;
125 breakpoint_t
**breakpoint_p
= &target
->breakpoints
;
129 if (breakpoint
->address
== address
)
131 breakpoint_p
= &breakpoint
->next
;
132 breakpoint
= breakpoint
->next
;
137 breakpoint_free(target
, breakpoint
);
141 LOG_ERROR("no breakpoint at address 0x%8.8x found", address
);
145 void breakpoint_clear_target(target_t
*target
)
147 breakpoint_t
*breakpoint
;
148 while ((breakpoint
= target
->breakpoints
)!=NULL
)
150 breakpoint_free(target
, breakpoint
);
154 breakpoint_t
* breakpoint_find(target_t
*target
, u32 address
)
156 breakpoint_t
*breakpoint
= target
->breakpoints
;
160 if (breakpoint
->address
== address
)
162 breakpoint
= breakpoint
->next
;
168 int watchpoint_add(target_t
*target
, u32 address
, u32 length
, enum watchpoint_rw rw
, u32 value
, u32 mask
)
170 watchpoint_t
*watchpoint
= target
->watchpoints
;
171 watchpoint_t
**watchpoint_p
= &target
->watchpoints
;
176 if (watchpoint
->address
== address
)
178 watchpoint_p
= &watchpoint
->next
;
179 watchpoint
= watchpoint
->next
;
182 (*watchpoint_p
) = malloc(sizeof(watchpoint_t
));
183 (*watchpoint_p
)->address
= address
;
184 (*watchpoint_p
)->length
= length
;
185 (*watchpoint_p
)->value
= value
;
186 (*watchpoint_p
)->mask
= mask
;
187 (*watchpoint_p
)->rw
= rw
;
188 (*watchpoint_p
)->set
= 0;
189 (*watchpoint_p
)->next
= NULL
;
191 if ((retval
= target
->type
->add_watchpoint(target
, *watchpoint_p
)) != ERROR_OK
)
195 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
196 LOG_INFO("can't add %s watchpoint, resource not available", watchpoint_rw_strings
[(*watchpoint_p
)->rw
]);
197 free (*watchpoint_p
);
198 *watchpoint_p
= NULL
;
201 case ERROR_TARGET_NOT_HALTED
:
202 LOG_INFO("can't add watchpoint while target is running");
203 free (*watchpoint_p
);
204 *watchpoint_p
= NULL
;
208 LOG_ERROR("unknown error");
214 LOG_DEBUG("added %s watchpoint at 0x%8.8x of length 0x%8.8x",
215 watchpoint_rw_strings
[(*watchpoint_p
)->rw
],
216 (*watchpoint_p
)->address
, (*watchpoint_p
)->length
);
221 static void watchpoint_free(target_t
*target
, watchpoint_t
*watchpoint_remove
)
223 watchpoint_t
*watchpoint
= target
->watchpoints
;
224 watchpoint_t
**watchpoint_p
= &target
->watchpoints
;
228 if (watchpoint
== watchpoint_remove
)
230 watchpoint_p
= &watchpoint
->next
;
231 watchpoint
= watchpoint
->next
;
234 if (watchpoint
==NULL
)
236 target
->type
->remove_watchpoint(target
, watchpoint
);
237 (*watchpoint_p
) = watchpoint
->next
;
241 void watchpoint_remove(target_t
*target
, u32 address
)
243 watchpoint_t
*watchpoint
= target
->watchpoints
;
244 watchpoint_t
**watchpoint_p
= &target
->watchpoints
;
248 if (watchpoint
->address
== address
)
250 watchpoint_p
= &watchpoint
->next
;
251 watchpoint
= watchpoint
->next
;
256 watchpoint_free(target
, watchpoint
);
260 LOG_ERROR("no watchpoint at address 0x%8.8x found", address
);
264 void watchpoint_clear_target(target_t
*target
)
266 watchpoint_t
*watchpoint
;
267 while ((watchpoint
= target
->watchpoints
)!=NULL
)
269 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)