aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Matyas <50193733+JanMatCodasip@users.noreply.github.com>2024-01-11 07:56:29 +0100
committerGitHub <noreply@github.com>2024-01-11 07:56:29 +0100
commitb6fa69bedd52b76aa8d5115c66ba6cc8c7dd8bf9 (patch)
tree4d2b6cac57fb69d0032b6cd919d3128ca56365de
parent6a614465d02195be7b7f659a71ec96ca2a01f04e (diff)
parent8dbb1250f587484774752e8610f04a98157ca10a (diff)
downloadriscv-openocd-b6fa69bedd52b76aa8d5115c66ba6cc8c7dd8bf9.zip
riscv-openocd-b6fa69bedd52b76aa8d5115c66ba6cc8c7dd8bf9.tar.gz
riscv-openocd-b6fa69bedd52b76aa8d5115c66ba6cc8c7dd8bf9.tar.bz2
Merge pull request #971 from en-sc/en-sc/keep-alive
Break from long loops on shutdown request
-rw-r--r--src/server/server.h1
-rw-r--r--src/target/image.c3
-rw-r--r--src/target/riscv/batch.c3
-rw-r--r--src/target/riscv/program.c3
-rw-r--r--src/target/riscv/riscv-013.c6
-rw-r--r--src/target/riscv/riscv.c6
-rw-r--r--src/target/target.c20
7 files changed, 41 insertions, 1 deletions
diff --git a/src/server/server.h b/src/server/server.h
index c9d4698..ea1e94e 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -118,5 +118,6 @@ COMMAND_HELPER(server_port_command, unsigned short *out);
#define ERROR_SERVER_REMOTE_CLOSED (-400)
#define ERROR_CONNECTION_REJECTED (-401)
+#define ERROR_SERVER_INTERRUPTED (-402)
#endif /* OPENOCD_SERVER_SERVER_H */
diff --git a/src/target/image.c b/src/target/image.c
index 9175c20..440fe17 100644
--- a/src/target/image.c
+++ b/src/target/image.c
@@ -24,6 +24,7 @@
#include "image.h"
#include "target.h"
#include <helper/log.h>
+#include <server/server.h>
/* convert ELF header field to host endianness */
#define field16(elf, field) \
@@ -1295,6 +1296,8 @@ int image_calculate_checksum(const uint8_t *buffer, uint32_t nbytes, uint32_t *c
crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buffer++) & 255];
}
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
}
LOG_DEBUG("Calculating checksum done; checksum=0x%" PRIx32, crc);
diff --git a/src/target/riscv/batch.c b/src/target/riscv/batch.c
index 290ce37..7abe8ad 100644
--- a/src/target/riscv/batch.c
+++ b/src/target/riscv/batch.c
@@ -111,6 +111,9 @@ int riscv_batch_run(struct riscv_batch *batch)
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
+
if (bscan_tunnel_ir_width != 0) {
/* need to right-shift "in" by one bit, because of clock skew between BSCAN TAP and DM TAP */
for (size_t i = 0; i < batch->used_scans; ++i) {
diff --git a/src/target/riscv/program.c b/src/target/riscv/program.c
index 22962fa..4543495 100644
--- a/src/target/riscv/program.c
+++ b/src/target/riscv/program.c
@@ -47,6 +47,9 @@ int riscv_program_exec(struct riscv_program *p, struct target *t)
{
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
+
p->execution_result = RISCV_PROGBUF_EXEC_RESULT_UNKNOWN;
riscv_reg_t saved_registers[GDB_REGNO_XPR31 + 1];
for (size_t i = GDB_REGNO_ZERO + 1; i <= GDB_REGNO_XPR31; ++i) {
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 2b8d381..651342a 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -595,6 +595,9 @@ static int dmi_op_timeout(struct target *target, uint32_t *data_in,
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
+
time_t start = time(NULL);
/* This first loop performs the request. Note that if for some reason this
* stays busy, it is actually due to the previous access. */
@@ -3241,6 +3244,9 @@ static int read_memory_bus_v1(struct target *target, target_addr_t address,
return ERROR_FAIL;
}
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
+
dmi_status_t status = dmi_scan(target, NULL, &sbvalue[next_read_j],
DMI_OP_READ, sbdata[j], 0, false);
/* By reading from sbdata0, we have just initiated another system bus read.
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index dd9ee43..47674ad 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -5141,6 +5141,9 @@ static int riscv_set_or_write_register(struct target *target,
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
+
if (regid == GDB_REGNO_PC) {
return riscv_set_or_write_register(target, GDB_REGNO_DPC, value, write_through);
} else if (regid == GDB_REGNO_PRIV) {
@@ -5238,6 +5241,9 @@ int riscv_get_register(struct target *target, riscv_reg_t *value,
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
+
if (regid == GDB_REGNO_PC) {
return riscv_get_register(target, value, GDB_REGNO_DPC);
} else if (regid == GDB_REGNO_PRIV) {
diff --git a/src/target/target.c b/src/target/target.c
index 216dcb2..5e93c78 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1214,6 +1214,10 @@ int target_run_read_async_algorithm(struct target *target,
/* Avoid GDB timeouts */
keep_alive();
+ if (openocd_is_shutdown_pending()) {
+ retval = ERROR_SERVER_INTERRUPTED;
+ break;
+ }
}
if (retval != ERROR_OK) {
@@ -3225,8 +3229,11 @@ int target_wait_state(struct target *target, enum target_state state, unsigned i
nvp_value2name(nvp_target_state, state)->name);
}
- if (cur-then > 500)
+ if (cur - then > 500) {
keep_alive();
+ if (openocd_is_shutdown_pending())
+ return ERROR_SERVER_INTERRUPTED;
+ }
if ((cur-then) > ms) {
LOG_ERROR("timed out while waiting for target %s",
@@ -3509,6 +3516,11 @@ static int target_fill_mem(struct target *target,
break;
/* avoid GDB timeouts */
keep_alive();
+
+ if (openocd_is_shutdown_pending()) {
+ retval = ERROR_SERVER_INTERRUPTED;
+ break;
+ }
}
free(target_buf);
@@ -3851,6 +3863,12 @@ static COMMAND_HELPER(handle_verify_image_command_internal, enum verify_mode ver
}
}
keep_alive();
+ if (openocd_is_shutdown_pending()) {
+ retval = ERROR_SERVER_INTERRUPTED;
+ free(data);
+ free(buffer);
+ goto done;
+ }
}
}
free(data);