From 35027de4cf7e75f4b876fa1e515bf3cfad93d836 Mon Sep 17 00:00:00 2001 From: Thiago Jung Bauermann Date: Sun, 27 Apr 2025 02:01:44 -0300 Subject: [PATCH] GDB: remote: Update tdesc parameters and packet size ... ... before using the g packet. --- gdb/regcache.c | 9 +++++++++ gdb/regcache.h | 3 +++ gdb/remote.c | 19 +++++++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/gdb/regcache.c b/gdb/regcache.c index eff4267fda8..120de8fd790 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -1408,6 +1408,15 @@ readable_regcache::update_tdesc_parameter (unsigned int param_id) /* See regcache.h. */ +void +readable_regcache::update_tdesc_parameters () +{ + for (unsigned int i = 0; i < m_tdesc_parameter_status.size (); i++) + update_tdesc_parameter (i); +} + +/* See regcache.h. */ + register_status readable_regcache::tdesc_parameter_value (unsigned int param_id, gdb::array_view dst) diff --git a/gdb/regcache.h b/gdb/regcache.h index 7fa40e06e3c..8fc82d1913b 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -405,6 +405,9 @@ public: /* FIXME: Document. */ void update_tdesc_parameter (unsigned int param_id); + /* FIXME: Document. */ + void update_tdesc_parameters (); + /* FIXME: Document. */ register_status tdesc_parameter_value (unsigned int param_id, gdb::array_view dst); diff --git a/gdb/remote.c b/gdb/remote.c index f51f9cf6985..8c6e8085941 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -8608,8 +8608,14 @@ remote_target::supply_expedited_registers (regcache *regcache, } if (regcache->has_variable_size_registers ()) - rs->get_remote_arch_state (regcache->arch ()) - ->update_packet_size (regcache, rs); + { + /* Presumably, the expedited registers allow recalculating the target + description parameters. */ + regcache->update_tdesc_parameters (); + + rs->get_remote_arch_state (regcache->arch ()) + ->update_packet_size (regcache, rs); + } } /* Called when it is decided that STOP_REPLY holds the info of the @@ -9161,6 +9167,15 @@ remote_target::process_g_packet (struct regcache *regcache) void remote_target::fetch_registers_using_g (struct regcache *regcache) { + if (regcache->has_variable_size_registers ()) + { + regcache->update_tdesc_parameters (); + + remote_state *rs = get_remote_state (); + remote_arch_state *rsa = rs->get_remote_arch_state (regcache->arch ()); + rsa->update_packet_size (regcache, rs); + } + send_g_packet (); process_g_packet (regcache); } -- 2.47.2