From 71b32bc43e882d3d8680d114f85751d9b87c7430 Mon Sep 17 00:00:00 2001 From: wangyanwen Date: Mon, 3 Jun 2024 18:19:44 +0800 Subject: [PATCH] Revert "server/gdb_server.c: support unavailable registers" This reverts commit 236c54c94a53ff76537a1bf91cfe74a264a2756f. Change-Id: I59ac4e3907547356e08c567fc2c8f50a13902bd9 --- src/server/gdb_server.c | 55 ++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 6ddee0a93..801ea899b 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -1260,29 +1260,6 @@ static void gdb_target_to_reg(struct target *target, } } -/* get register value if needed and fill the buffer accordingly */ -static int gdb_get_reg_value_as_str(struct target *target, char *tstr, struct reg *reg) -{ - int retval = ERROR_OK; - - if (!reg->valid) - retval = reg->type->get(reg); - - const unsigned int len = DIV_ROUND_UP(reg->size, 8) * 2; - switch (retval) { - case ERROR_OK: - gdb_str_to_target(target, tstr, reg); - return ERROR_OK; - case ERROR_TARGET_RESOURCE_NOT_AVAILABLE: - memset(tstr, 'x', len); - tstr[len] = '\0'; - return ERROR_OK; - } - memset(tstr, '0', len); - tstr[len] = '\0'; - return ERROR_FAIL; -} - static int gdb_get_registers_packet(struct connection *connection, char const *packet, int packet_size) { @@ -1324,13 +1301,16 @@ static int gdb_get_registers_packet(struct connection *connection, for (i = 0; i < reg_list_size; i++) { if (!reg_list[i] || !reg_list[i]->exist || reg_list[i]->hidden) continue; - retval = gdb_get_reg_value_as_str(target, reg_packet_p, reg_list[i]); - if (retval != ERROR_OK && gdb_report_register_access_error) { - LOG_DEBUG("Couldn't get register %s.", reg_list[i]->name); - free(reg_packet); - free(reg_list); - return gdb_error(connection, retval); + if (!reg_list[i]->valid) { + retval = reg_list[i]->type->get(reg_list[i]); + if (retval != ERROR_OK && gdb_report_register_access_error) { + LOG_DEBUG("Couldn't get register %s.", reg_list[i]->name); + free(reg_packet); + free(reg_list); + return gdb_error(connection, retval); + } } + gdb_str_to_target(target, reg_packet_p, reg_list[i]); reg_packet_p += DIV_ROUND_UP(reg_list[i]->size, 8) * 2; } @@ -1447,15 +1427,18 @@ static int gdb_get_register_packet(struct connection *connection, return gdb_error(connection, ERROR_FAIL); } + if (!reg_list[reg_num]->valid) { + retval = reg_list[reg_num]->type->get(reg_list[reg_num]); + if (retval != ERROR_OK && gdb_report_register_access_error) { + LOG_DEBUG("Couldn't get register %s.", reg_list[reg_num]->name); + free(reg_list); + return gdb_error(connection, retval); + } + } + reg_packet = calloc(DIV_ROUND_UP(reg_list[reg_num]->size, 8) * 2 + 1, 1); /* plus one for string termination null */ - retval = gdb_get_reg_value_as_str(target, reg_packet, reg_list[reg_num]); - if (retval != ERROR_OK && gdb_report_register_access_error) { - LOG_DEBUG("Couldn't get register %s.", reg_list[reg_num]->name); - free(reg_packet); - free(reg_list); - return gdb_error(connection, retval); - } + gdb_str_to_target(target, reg_packet, reg_list[reg_num]); gdb_put_packet(connection, reg_packet, DIV_ROUND_UP(reg_list[reg_num]->size, 8) * 2);