aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote.c
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2018-11-07 15:15:36 +0000
committerAlan Hayward <alan.hayward@arm.com>2018-11-07 15:16:30 +0000
commite8f3f2047b55760c52f786b46780de997a31d002 (patch)
tree6b53906125aad9b7e3e9b6e93af7f52e63faddd1 /gdb/remote.c
parent7a9abb2bce8f2f52f7f59927b18582f67a0c3208 (diff)
downloadbinutils-users/ahayward/variable_sve2.zip
binutils-users/ahayward/variable_sve2.tar.gz
binutils-users/ahayward/variable_sve2.tar.bz2
Aarch64 SVE: Support changing vector lengths in gdbserverusers/ahayward/variable_sve2
There are two parts to this patch - gdbserver and GDB. In gdbserver, there needs to be an equivalent of the thread_architecture method used in GDB. In regcache, validate the tdesc with the use target_validate_tdesc target function. If this fails then re-obtain the target descriptor via general setup. The aarch64 validation step simply checks the value of the VG register to see if it matches the current kernel value. In GDB, we have a similar check when receiving a stop reply. Validate the tdesc using gdbarch_target_description_changed_p. If this fails re-obtain the target descriptor via general setup - which is done by setting up an tdep info structure containing the vector length. The aarch64 validation step checks the value of VG (which is marked as an expediated register, so is in the stop reply). 2018-11-07 Alan Hayward <alan.hayward@arm.com> gdb/ * aarch64-tdep.c (aarch64_target_description_changed_p): Check vector length. (aarch64_target_get_tdep_info): Store vector length. * remote.c (remote_target::process_stop_reply): Validate tdesc. * target-descriptions.c (target_find_description): Pass through info. * target-descriptions.h (target_find_description): Add arg. gdbserver/ * linux-aarch64-low.c (aarch64_validate_tdesc): Check vector length. * regcache.c (get_thread_regcache): Validate tdesc.
Diffstat (limited to 'gdb/remote.c')
-rw-r--r--gdb/remote.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gdb/remote.c b/gdb/remote.c
index c1e95bb..e81b776 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -7686,9 +7686,24 @@ remote_target::process_stop_reply (struct stop_reply *stop_reply,
&& status->kind != TARGET_WAITKIND_SIGNALLED
&& status->kind != TARGET_WAITKIND_NO_RESUMED)
{
+ VEC (cached_reg_t) *stop_regs = stop_reply->regcache;
+
/* Expedited registers. */
- if (stop_reply->regcache)
+ if (stop_regs)
{
+ struct gdbarch *gdbarch = target_gdbarch ();
+
+ /* Check the target descriptor is still valid for the current target.
+ If not, then clear it find the correct one. */
+ if (gdbarch_target_description_changed_p (gdbarch, ptid, stop_regs))
+ {
+ gdbarch_target_info info
+ = gdbarch_target_get_tdep_info (gdbarch, stop_regs);
+ registers_changed ();
+ target_clear_description ();
+ target_find_description (info);
+ }
+
struct regcache *regcache
= get_thread_arch_regcache (ptid, stop_reply->arch);
cached_reg_t *reg;