aboutsummaryrefslogtreecommitdiff
path: root/src/rtos
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2023-10-10 10:45:15 -0700
committerTim Newsome <tim@sifive.com>2023-10-10 10:51:47 -0700
commit969b30326cf51290e5907ec2e7a9cecfac318b4e (patch)
tree3863ba76342cb9ddbf32ffd1f2ad56d5b755b86f /src/rtos
parent15f399691eff62da2039fb01abeb64f567d04bbd (diff)
downloadriscv-openocd-969b30326cf51290e5907ec2e7a9cecfac318b4e.zip
riscv-openocd-969b30326cf51290e5907ec2e7a9cecfac318b4e.tar.gz
riscv-openocd-969b30326cf51290e5907ec2e7a9cecfac318b4e.tar.bz2
rtos: Refactor rtos_get_gdb_reg()
Exit early if conditions aren't satisfied, instead of putting the core code inside an if(). Also return ERROR_FAIL if conditions are satisfied but no matching registers were found. Change-Id: I77aa63d9f707bc38d1a71899275ba603914b52c9 Signed-off-by: Tim Newsome <tim@sifive.com>
Diffstat (limited to 'src/rtos')
-rw-r--r--src/rtos/rtos.c114
1 files changed, 58 insertions, 56 deletions
diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c
index 87d23f9..c3870b7 100644
--- a/src/rtos/rtos.c
+++ b/src/rtos/rtos.c
@@ -529,69 +529,71 @@ int rtos_get_gdb_reg(struct connection *connection, int reg_num)
{
struct target *target = get_target_from_connection(connection);
threadid_t current_threadid = target->rtos->current_threadid;
- if ((target->rtos) && (current_threadid != -1) &&
- (current_threadid != 0) &&
- ((current_threadid != target->rtos->current_thread) ||
- (target->smp))) { /* in smp several current thread are possible */
- struct rtos_reg *reg_list;
- int num_regs;
+ if (!target->rtos ||
+ current_threadid == -1 ||
+ current_threadid == 0 ||
+ (current_threadid == target->rtos->current_thread &&
+ !target->smp)) { /* in smp several current thread are possible */
+ return ERROR_NOT_IMPLEMENTED;
+ }
- LOG_DEBUG("getting register %d for thread 0x%" PRIx64
- ", target->rtos->current_thread=0x%" PRIx64,
- reg_num,
- current_threadid,
- target->rtos->current_thread);
-
- int retval;
- if (target->rtos->type->get_thread_reg_value) {
- uint32_t reg_size;
- uint8_t *reg_value;
- retval = target->rtos->type->get_thread_reg_value(target->rtos,
- current_threadid, reg_num, &reg_size, &reg_value);
- if (retval != ERROR_OK) {
- LOG_ERROR("RTOS: failed to get register %d", reg_num);
- return retval;
- }
+ struct rtos_reg *reg_list;
+ int num_regs;
- /* Create a reg_list with one register that can
- * accommodate the full size of the one we just got the
- * value for. To do that we allocate extra space off the
- * end of the struct, relying on the fact that
- * rtos_reg.value is the last element in the struct. */
- reg_list = calloc(1, sizeof(*reg_list) + DIV_ROUND_UP(reg_size, 8));
- if (!reg_list) {
- free(reg_value);
- LOG_ERROR("Failed to allocated reg_list for %d-byte register.",
- reg_size);
- return ERROR_FAIL;
- }
- reg_list[0].number = reg_num;
- reg_list[0].size = reg_size;
- memcpy(&reg_list[0].value, reg_value, DIV_ROUND_UP(reg_size, 8));
- free(reg_value);
- num_regs = 1;
- } else {
- retval = target->rtos->type->get_thread_reg_list(target->rtos,
- current_threadid,
- &reg_list,
- &num_regs);
- if (retval != ERROR_OK) {
- LOG_ERROR("RTOS: failed to get register list");
- return retval;
- }
+ LOG_TARGET_DEBUG(target, "getting register %d for thread 0x%" PRIx64
+ ", target->rtos->current_thread=0x%" PRIx64,
+ reg_num, current_threadid, target->rtos->current_thread);
+
+ int retval;
+ if (target->rtos->type->get_thread_reg_value) {
+ uint32_t reg_size;
+ uint8_t *reg_value;
+ retval = target->rtos->type->get_thread_reg_value(target->rtos,
+ current_threadid, reg_num, &reg_size, &reg_value);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("RTOS: failed to get register %d", reg_num);
+ return retval;
}
- for (int i = 0; i < num_regs; ++i) {
- if (reg_list[i].number == (uint32_t)reg_num) {
- rtos_put_gdb_reg_list(connection, reg_list + i, 1);
- free(reg_list);
- return ERROR_OK;
- }
+ /* Create a reg_list with one register that can
+ * accommodate the full size of the one we just got the
+ * value for. To do that we allocate extra space off the
+ * end of the struct, relying on the fact that
+ * rtos_reg.value is the last element in the struct. */
+ reg_list = calloc(1, sizeof(*reg_list) + DIV_ROUND_UP(reg_size, 8));
+ if (!reg_list) {
+ free(reg_value);
+ LOG_ERROR("Failed to allocated reg_list for %d-byte register.",
+ reg_size);
+ return ERROR_FAIL;
+ }
+ reg_list[0].number = reg_num;
+ reg_list[0].size = reg_size;
+ memcpy(&reg_list[0].value, reg_value, DIV_ROUND_UP(reg_size, 8));
+ free(reg_value);
+ num_regs = 1;
+ } else {
+ retval = target->rtos->type->get_thread_reg_list(target->rtos,
+ current_threadid,
+ &reg_list,
+ &num_regs);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("RTOS: failed to get register list");
+ return retval;
}
+ }
- free(reg_list);
+ for (int i = 0; i < num_regs; ++i) {
+ if (reg_list[i].number == (uint32_t)reg_num) {
+ rtos_put_gdb_reg_list(connection, reg_list + i, 1);
+ free(reg_list);
+ return ERROR_OK;
+ }
}
- return ERROR_NOT_IMPLEMENTED;
+
+ free(reg_list);
+
+ return ERROR_FAIL;
}
/** Return a list of general registers. */