aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2018-06-15 12:23:23 +0100
committerAlan Hayward <alan.hayward@arm.com>2018-06-18 10:10:00 +0100
commit02895270ec7243f46ea3e84dc385515533dc0139 (patch)
treed09192b4503a4bff1fb5ae8a6833765d6eac4c4c
parente9902bfc28b80190c76ffe5fad3bb73fd4a2ba28 (diff)
downloadfsf-binutils-gdb-02895270ec7243f46ea3e84dc385515533dc0139.zip
fsf-binutils-gdb-02895270ec7243f46ea3e84dc385515533dc0139.tar.gz
fsf-binutils-gdb-02895270ec7243f46ea3e84dc385515533dc0139.tar.bz2
Ptrace support for AArch64 SVE gdbserver
Add checks to detect SVE tdesc. Easiest way to do this is by checking the size of the vector registers. Use the common aarch64 ptrace copy functions for reading/writing registers. A wrapper is required due to the common functions using reg_buffer_common. gdbserver/ * linux-aarch64-low.c (is_sve_tdesc): New function. (aarch64_sve_regs_copy_to_regcache): Likewise. (aarch64_sve_regs_copy_from_regcache): Likewise. (aarch64_regs_info): Add SVE checks. (initialize_low_arch): Initialize SVE.
-rw-r--r--gdb/gdbserver/ChangeLog8
-rw-r--r--gdb/gdbserver/linux-aarch64-low.c63
2 files changed, 68 insertions, 3 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index a1c72b2..a85aeac 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,13 @@
2018-06-18 Alan Hayward <alan.hayward@arm.com>
+ * linux-aarch64-low.c (is_sve_tdesc): New function.
+ (aarch64_sve_regs_copy_to_regcache): Likewise.
+ (aarch64_sve_regs_copy_from_regcache): Likewise.
+ (aarch64_regs_info): Add SVE checks.
+ (initialize_low_arch): Initialize SVE.
+
+2018-06-18 Alan Hayward <alan.hayward@arm.com>
+
* Makefile.in: Add aarch64-sve-linux-ptrace.c.
2018-06-11 Alan Hayward <alan.hayward@arm.com>
diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch64-low.c
index 9db9a7c..1d34e31 100644
--- a/gdb/gdbserver/linux-aarch64-low.c
+++ b/gdb/gdbserver/linux-aarch64-low.c
@@ -41,6 +41,7 @@
#include "arch/aarch64.h"
#include "linux-aarch64-tdesc.h"
#include "nat/aarch64-sve-linux-ptrace.h"
+#include "tdesc.h"
#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
@@ -73,6 +74,16 @@ is_64bit_tdesc (void)
return register_size (regcache->tdesc, 0) == 8;
}
+/* Return true if the regcache contains the number of SVE registers. */
+
+static bool
+is_sve_tdesc (void)
+{
+ struct regcache *regcache = get_thread_regcache (current_thread, 0);
+
+ return regcache->tdesc->reg_defs.size () == AARCH64_SVE_NUM_REGS;
+}
+
/* Implementation of linux_target_ops method "cannot_store_register". */
static int
@@ -514,6 +525,22 @@ aarch64_arch_setup (void)
aarch64_linux_get_debug_reg_capacity (lwpid_of (current_thread));
}
+/* Wrapper for aarch64_sve_regs_copy_to_reg_buf. */
+
+static void
+aarch64_sve_regs_copy_to_regcache (struct regcache *regcache, const void *buf)
+{
+ return aarch64_sve_regs_copy_to_reg_buf (regcache, buf);
+}
+
+/* Wrapper for aarch64_sve_regs_copy_from_reg_buf. */
+
+static void
+aarch64_sve_regs_copy_from_regcache (struct regcache *regcache, void *buf)
+{
+ return aarch64_sve_regs_copy_from_reg_buf (regcache, buf);
+}
+
static struct regset_info aarch64_regsets[] =
{
{ PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
@@ -540,15 +567,44 @@ static struct regs_info regs_info_aarch64 =
&aarch64_regsets_info,
};
+static struct regset_info aarch64_sve_regsets[] =
+{
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
+ sizeof (struct user_pt_regs), GENERAL_REGS,
+ aarch64_fill_gregset, aarch64_store_gregset },
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_SVE,
+ SVE_PT_SIZE (AARCH64_MAX_SVE_VQ, SVE_PT_REGS_SVE), EXTENDED_REGS,
+ aarch64_sve_regs_copy_from_regcache, aarch64_sve_regs_copy_to_regcache
+ },
+ NULL_REGSET
+};
+
+static struct regsets_info aarch64_sve_regsets_info =
+ {
+ aarch64_sve_regsets, /* regsets. */
+ 0, /* num_regsets. */
+ NULL, /* disabled_regsets. */
+ };
+
+static struct regs_info regs_info_aarch64_sve =
+ {
+ NULL, /* regset_bitmap. */
+ NULL, /* usrregs. */
+ &aarch64_sve_regsets_info,
+ };
+
/* Implementation of linux_target_ops method "regs_info". */
static const struct regs_info *
aarch64_regs_info (void)
{
- if (is_64bit_tdesc ())
- return &regs_info_aarch64;
- else
+ if (!is_64bit_tdesc ())
return &regs_info_aarch32;
+
+ if (is_sve_tdesc ())
+ return &regs_info_aarch64_sve;
+
+ return &regs_info_aarch64;
}
/* Implementation of linux_target_ops method "supports_tracepoints". */
@@ -3027,6 +3083,7 @@ initialize_low_arch (void)
initialize_low_arch_aarch32 ();
initialize_regsets_info (&aarch64_regsets_info);
+ initialize_regsets_info (&aarch64_sve_regsets_info);
#if GDB_SELF_TEST
initialize_low_tdesc ();