aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMegan Wachs <megan@sifive.com>2018-05-22 16:27:52 -0700
committerMegan Wachs <megan@sifive.com>2018-05-22 16:27:52 -0700
commitbdc43554934b12a340c82ceb6ce3eb0d1e61681b (patch)
tree978a9593bc68cecf25a7d30c5ef155557f24bbd5 /src
parenta0e811580aac3da626d8396d4021664cfc1de95b (diff)
parentb629bbeade8cb430be8d2b899fd521a02419e393 (diff)
downloadriscv-openocd-bdc43554934b12a340c82ceb6ce3eb0d1e61681b.zip
riscv-openocd-bdc43554934b12a340c82ceb6ce3eb0d1e61681b.tar.gz
riscv-openocd-bdc43554934b12a340c82ceb6ce3eb0d1e61681b.tar.bz2
Merge remote-tracking branch 'origin/trigger_enum' into riscv-complianceriscv-compliance-dev
Diffstat (limited to 'src')
-rw-r--r--src/target/riscv/riscv-013.c11
-rw-r--r--src/target/riscv/riscv.c11
-rw-r--r--src/target/riscv/riscv.h2
3 files changed, 19 insertions, 5 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 465e316..9488b79 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -1460,9 +1460,6 @@ static int examine(struct target *target)
return ERROR_FAIL;
}
- /* Then we check the number of triggers availiable to each hart. */
- riscv_enumerate_triggers(target);
-
/* Resumes all the harts, so the debugger can later pause them. */
/* TODO: Only do this if the harts were halted to start with. */
riscv_resume_all_harts(target);
@@ -1480,8 +1477,8 @@ static int examine(struct target *target)
riscv_count_harts(target));
for (int i = 0; i < riscv_count_harts(target); ++i) {
if (riscv_hart_enabled(target, i)) {
- LOG_INFO(" hart %d: XLEN=%d, misa=0x%" PRIx64 ", %d triggers", i,
- r->xlen[i], r->misa[i], r->trigger_count[i]);
+ LOG_INFO(" hart %d: XLEN=%d, misa=0x%" PRIx64, i, r->xlen[i],
+ r->misa[i]);
} else {
LOG_INFO(" hart %d: currently disabled", i);
}
@@ -2834,6 +2831,10 @@ static enum riscv_halt_reason riscv013_halt_reason(struct target *target)
case CSR_DCSR_CAUSE_SWBP:
return RISCV_HALT_BREAKPOINT;
case CSR_DCSR_CAUSE_TRIGGER:
+ /* We could get here before triggers are enumerated if a trigger was
+ * already set when we connected. Force enumeration now, which has the
+ * side effect of clearing any triggers we did not set. */
+ riscv_enumerate_triggers(target);
return RISCV_HALT_TRIGGER;
case CSR_DCSR_CAUSE_STEP:
return RISCV_HALT_SINGLESTEP;
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index 0182d0e..61b6827 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -407,6 +407,9 @@ static int add_trigger(struct target *target, struct trigger *trigger)
{
RISCV_INFO(r);
+ if (riscv_enumerate_triggers(target) != ERROR_OK)
+ return ERROR_FAIL;
+
/* In RTOS mode, we need to set the same trigger in the same slot on every
* hart, to keep up the illusion that each hart is a thread running on the
* same core. */
@@ -531,6 +534,9 @@ static int remove_trigger(struct target *target, struct trigger *trigger)
{
RISCV_INFO(r);
+ if (riscv_enumerate_triggers(target) != ERROR_OK)
+ return ERROR_FAIL;
+
int first_hart = -1;
for (int hartid = 0; hartid < riscv_count_harts(target); ++hartid) {
if (!riscv_hart_enabled(target, hartid))
@@ -1918,6 +1924,11 @@ int riscv_enumerate_triggers(struct target *target)
{
RISCV_INFO(r);
+ if (r->triggers_enumerated)
+ return ERROR_OK;
+
+ r->triggers_enumerated = true; /* At the very least we tried. */
+
for (int hartid = 0; hartid < riscv_count_harts(target); ++hartid) {
if (!riscv_hart_enabled(target, hartid))
continue;
diff --git a/src/target/riscv/riscv.h b/src/target/riscv/riscv.h
index 48039d0..1e7e328 100644
--- a/src/target/riscv/riscv.h
+++ b/src/target/riscv/riscv.h
@@ -87,6 +87,8 @@ typedef struct {
/* This hart contains an implicit ebreak at the end of the program buffer. */
bool impebreak;
+ bool triggers_enumerated;
+
/* Helper functions that target the various RISC-V debug spec
* implementations. */
int (*get_register)(struct target *target,