target/cortex_m: remove fp_code_available counting
fp_code_available looses sync with the real number of free comparators as soon as cortex_m_set_breakpoint() returns an error. Remove the counter and always go through the fp_comparator_list to find a free one. Change-Id: I9f6e06c36d8a57ad11df5155e8a1a3aff6d833a5 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/4870 Tested-by: jenkins Reviewed-by: Jānis Skujenieks <janis.skujenieks@gmail.com> Reviewed-by: Christopher Head <chead@zaber.com> Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
This commit is contained in:
parent
16432e681e
commit
4db5299b5b
|
@ -1164,7 +1164,7 @@ int cortex_m_set_breakpoint(struct target *target, struct breakpoint *breakpoint
|
||||||
fp_num++;
|
fp_num++;
|
||||||
if (fp_num >= cortex_m->fp_num_code) {
|
if (fp_num >= cortex_m->fp_num_code) {
|
||||||
LOG_ERROR("Can not find free FPB Comparator!");
|
LOG_ERROR("Can not find free FPB Comparator!");
|
||||||
return ERROR_FAIL;
|
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
breakpoint->set = fp_num + 1;
|
breakpoint->set = fp_num + 1;
|
||||||
fpcr_value = breakpoint->address | 1;
|
fpcr_value = breakpoint->address | 1;
|
||||||
|
@ -1273,13 +1273,6 @@ int cortex_m_unset_breakpoint(struct target *target, struct breakpoint *breakpoi
|
||||||
|
|
||||||
int cortex_m_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
|
int cortex_m_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
|
||||||
{
|
{
|
||||||
struct cortex_m_common *cortex_m = target_to_cm(target);
|
|
||||||
|
|
||||||
if ((breakpoint->type == BKPT_HARD) && (cortex_m->fp_code_available < 1)) {
|
|
||||||
LOG_INFO("no flash patch comparator unit available for hardware breakpoint");
|
|
||||||
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (breakpoint->length == 3) {
|
if (breakpoint->length == 3) {
|
||||||
LOG_DEBUG("Using a two byte breakpoint for 32bit Thumb-2 request");
|
LOG_DEBUG("Using a two byte breakpoint for 32bit Thumb-2 request");
|
||||||
breakpoint->length = 2;
|
breakpoint->length = 2;
|
||||||
|
@ -1290,16 +1283,11 @@ int cortex_m_add_breakpoint(struct target *target, struct breakpoint *breakpoint
|
||||||
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (breakpoint->type == BKPT_HARD)
|
|
||||||
cortex_m->fp_code_available--;
|
|
||||||
|
|
||||||
return cortex_m_set_breakpoint(target, breakpoint);
|
return cortex_m_set_breakpoint(target, breakpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
int cortex_m_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
|
int cortex_m_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
|
||||||
{
|
{
|
||||||
struct cortex_m_common *cortex_m = target_to_cm(target);
|
|
||||||
|
|
||||||
/* REVISIT why check? FPB can be updated with core running ... */
|
/* REVISIT why check? FPB can be updated with core running ... */
|
||||||
if (target->state != TARGET_HALTED) {
|
if (target->state != TARGET_HALTED) {
|
||||||
LOG_WARNING("target not halted");
|
LOG_WARNING("target not halted");
|
||||||
|
@ -1309,9 +1297,6 @@ int cortex_m_remove_breakpoint(struct target *target, struct breakpoint *breakpo
|
||||||
if (breakpoint->set)
|
if (breakpoint->set)
|
||||||
cortex_m_unset_breakpoint(target, breakpoint);
|
cortex_m_unset_breakpoint(target, breakpoint);
|
||||||
|
|
||||||
if (breakpoint->type == BKPT_HARD)
|
|
||||||
cortex_m->fp_code_available++;
|
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2121,7 +2106,6 @@ int cortex_m_examine(struct target *target)
|
||||||
/* bits [14:12] and [7:4] */
|
/* bits [14:12] and [7:4] */
|
||||||
cortex_m->fp_num_code = ((fpcr >> 8) & 0x70) | ((fpcr >> 4) & 0xF);
|
cortex_m->fp_num_code = ((fpcr >> 8) & 0x70) | ((fpcr >> 4) & 0xF);
|
||||||
cortex_m->fp_num_lit = (fpcr >> 8) & 0xF;
|
cortex_m->fp_num_lit = (fpcr >> 8) & 0xF;
|
||||||
cortex_m->fp_code_available = cortex_m->fp_num_code;
|
|
||||||
/* Detect flash patch revision, see RM DDI 0403E.b page C1-817.
|
/* Detect flash patch revision, see RM DDI 0403E.b page C1-817.
|
||||||
Revision is zero base, fp_rev == 1 means Rev.2 ! */
|
Revision is zero base, fp_rev == 1 means Rev.2 ! */
|
||||||
cortex_m->fp_rev = (fpcr >> 28) & 0xf;
|
cortex_m->fp_rev = (fpcr >> 28) & 0xf;
|
||||||
|
|
|
@ -172,7 +172,6 @@ struct cortex_m_common {
|
||||||
/* Flash Patch and Breakpoint (FPB) */
|
/* Flash Patch and Breakpoint (FPB) */
|
||||||
int fp_num_lit;
|
int fp_num_lit;
|
||||||
int fp_num_code;
|
int fp_num_code;
|
||||||
int fp_code_available;
|
|
||||||
int fp_rev;
|
int fp_rev;
|
||||||
bool fpb_enabled;
|
bool fpb_enabled;
|
||||||
struct cortex_m_fp_comparator *fp_comparator_list;
|
struct cortex_m_fp_comparator *fp_comparator_list;
|
||||||
|
|
Loading…
Reference in New Issue