target: poll() failure does not mean the target halted.
Poll failure just means poll failed. It's safer to assume the target is still running, because then if it is running and subsequently halts we can relay this to gdb correctly. We can't do the other way around, because once gdb thinks the target has halted, it can't deal with it spontaneously running. Change-Id: Idb56137f1d6baa9afc1b0e55e4a48f407b8ebe83 Signed-off-by: Tim Newsome <tim@sifive.com>
This commit is contained in:
parent
82ed02f92a
commit
21433e83ee
|
@ -589,17 +589,15 @@ static int dmi_op_timeout(struct target *target, uint32_t *data_in,
|
|||
} else if (status == DMI_STATUS_SUCCESS) {
|
||||
break;
|
||||
} else {
|
||||
LOG_ERROR("failed %s at 0x%x, status=%d", op_name, address, status);
|
||||
dtmcontrol_scan(target, DTM_DTMCS_DMIRESET);
|
||||
return ERROR_FAIL;
|
||||
break;
|
||||
}
|
||||
if (time(NULL) - start > timeout_sec)
|
||||
return ERROR_TIMEOUT_REACHED;
|
||||
}
|
||||
|
||||
if (status != DMI_STATUS_SUCCESS) {
|
||||
LOG_ERROR("Failed %s at 0x%x; status=%d", op_name, address, status);
|
||||
dtmcontrol_scan(target, DTM_DTMCS_DMIRESET);
|
||||
LOG_TARGET_ERROR(target, "Failed DMI %s at 0x%x; status=%d", op_name, address, status);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
|
@ -618,10 +616,12 @@ static int dmi_op_timeout(struct target *target, uint32_t *data_in,
|
|||
break;
|
||||
} else {
|
||||
if (data_in) {
|
||||
LOG_ERROR("Failed %s (NOP) at 0x%x; value=0x%x, status=%d",
|
||||
LOG_TARGET_ERROR(target,
|
||||
"Failed DMI %s (NOP) at 0x%x; value=0x%x, status=%d",
|
||||
op_name, address, *data_in, status);
|
||||
} else {
|
||||
LOG_ERROR("Failed %s (NOP) at 0x%x; status=%d", op_name, address,
|
||||
LOG_TARGET_ERROR(target,
|
||||
"Failed DMI %s (NOP) at 0x%x; status=%d", op_name, address,
|
||||
status);
|
||||
}
|
||||
dtmcontrol_scan(target, DTM_DTMCS_DMIRESET);
|
||||
|
|
|
@ -3055,9 +3055,12 @@ static int handle_target(void *priv)
|
|||
/* Increase interval between polling up to 5000ms */
|
||||
target->backoff.interval = MAX(polling_interval,
|
||||
MIN(target->backoff.interval * 2 + 1, 5000));
|
||||
/* Tell GDB to halt the debugger. This allows the user to run
|
||||
* monitor commands to handle the situation. */
|
||||
target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
|
||||
/* Do *not* tell gdb the target halted. This might just
|
||||
* be a hiccup. We have no reason to believe the target
|
||||
* is halted, and if it is running while gdb thinks it's
|
||||
* halted things just get unnecessarily confused. gdb
|
||||
* users can hit ^C if the need to interact with the
|
||||
* target. */
|
||||
}
|
||||
target->backoff.next_attempt = timeval_ms() + target->backoff.interval;
|
||||
LOG_TARGET_DEBUG(target, "target_poll() -> %d, next attempt in %dms",
|
||||
|
@ -3067,8 +3070,7 @@ static int handle_target(void *priv)
|
|||
target_reset_examined(target);
|
||||
retval = target_examine_one(target);
|
||||
if (retval != ERROR_OK) {
|
||||
LOG_TARGET_DEBUG(target, "Examination failed, GDB will be halted. "
|
||||
"Polling again in %dms",
|
||||
LOG_TARGET_DEBUG(target, "Examination failed. Polling again in %dms",
|
||||
target->backoff.interval);
|
||||
return retval;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue