aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcgsfv <cgsfv@users.noreply.github.com>2024-02-13 20:39:58 -0800
committercgsfv <cgsfv@users.noreply.github.com>2024-02-13 20:39:58 -0800
commitc1c46fbcad5e45b0da947fb8b2c2a45a761faab7 (patch)
tree31a9d52cc3f93455ea0cdd8a6e04e7175b69dec7
parentae537889851b0bb03bd61f79b08c74df172c5ec1 (diff)
downloadriscv-openocd-c1c46fbcad5e45b0da947fb8b2c2a45a761faab7.zip
riscv-openocd-c1c46fbcad5e45b0da947fb8b2c2a45a761faab7.tar.gz
riscv-openocd-c1c46fbcad5e45b0da947fb8b2c2a45a761faab7.tar.bz2
Added even more handling of unexamined harts
-rw-r--r--src/target/riscv/riscv-013.c8
-rw-r--r--src/target/riscv/riscv.c5
-rw-r--r--src/target/target.c6
3 files changed, 17 insertions, 2 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 0a68bfe..64ea8ef 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -2056,6 +2056,14 @@ static int examine(struct target *target)
enum riscv_hart_state state_at_examine_start;
if (riscv_get_hart_state(target, &state_at_examine_start) != ERROR_OK)
return ERROR_FAIL;
+
+ /* Skip full examination of hart if it is unavailable */
+ const bool hart_unavailable_at_examine_start = state_at_examine_start == RISCV_STATE_UNAVAILABLE;
+ if (hart_unavailable_at_examine_start) {
+ LOG_TARGET_INFO(target, "Did not fully examine hart %d as it was unavailable, deferring examine.", info->index);
+ target->defer_examine = true;
+ return ERROR_OK;
+ }
const bool hart_halted_at_examine_start = state_at_examine_start == RISCV_STATE_HALTED;
if (!hart_halted_at_examine_start) {
r->prepped = true;
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index 3f35a4f..0b69819 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -3214,6 +3214,11 @@ int riscv_openocd_poll(struct target *target)
if (!target_was_examined(t))
continue;
+ if (target->defer_examine) {
+ target->examined = false;
+ continue;
+ }
+
enum riscv_next_action next_action;
if (riscv_poll_hart(t, &next_action) != ERROR_OK)
return ERROR_FAIL;
diff --git a/src/target/target.c b/src/target/target.c
index 74d1a8a..e8f3cba 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -686,7 +686,8 @@ int target_examine_one(struct target *target)
}
LOG_USER("[%s] Target successfully examined.", target_name(target));
- target_set_examined(target);
+ if (!target->defer_examine)
+ target_set_examined(target);
target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_END);
LOG_TARGET_INFO(target, "Examination succeed");
@@ -5267,7 +5268,8 @@ COMMAND_HANDLER(handle_target_examine)
return retval;
}
- target_set_examined(target);
+ if (!target->defer_examine)
+ target_set_examined(target);
return ERROR_OK;
}