aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2018-06-11 10:32:52 +0100
committerAlan Hayward <alan.hayward@arm.com>2018-06-11 13:25:15 +0100
commitfefa175e8f518f17121a1870270a415c851cbacc (patch)
treef00eb06861b69ed98104d91d72f5cb7f8e7dcb34 /gdb
parent5a485b38994ca09481863fa509cff4643552e1ed (diff)
downloadgdb-fefa175e8f518f17121a1870270a415c851cbacc.zip
gdb-fefa175e8f518f17121a1870270a415c851cbacc.tar.gz
gdb-fefa175e8f518f17121a1870270a415c851cbacc.tar.bz2
Enable Aarch64 SVE for gdbserver
gdbserver/ * linux-aarch64-ipa.c (get_ipa_tdesc): Add null VQ param. (initialize_low_tracepoint): Likewise * linux-aarch64-low.c (aarch64_arch_setup): Get VQ. * linux-aarch64-tdesc-selftest.c (aarch64_tdesc_test): Add null VQ param. * linux-aarch64-tdesc.c (aarch64_linux_read_description): Add VQ checks. * linux-aarch64-tdesc.h (aarch64_linux_read_description): Add VQ.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/gdbserver/ChangeLog11
-rw-r--r--gdb/gdbserver/linux-aarch64-ipa.c7
-rw-r--r--gdb/gdbserver/linux-aarch64-low.c6
-rw-r--r--gdb/gdbserver/linux-aarch64-tdesc-selftest.c2
-rw-r--r--gdb/gdbserver/linux-aarch64-tdesc.c30
-rw-r--r--gdb/gdbserver/linux-aarch64-tdesc.h2
6 files changed, 44 insertions, 14 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index fac340e..ac1eb1c 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,16 @@
2018-06-11 Alan Hayward <alan.hayward@arm.com>
+ * linux-aarch64-ipa.c (get_ipa_tdesc): Add null VQ param.
+ (initialize_low_tracepoint): Likewise
+ * linux-aarch64-low.c (aarch64_arch_setup): Get VQ.
+ * linux-aarch64-tdesc-selftest.c (aarch64_tdesc_test): Add null VQ
+ param.
+ * linux-aarch64-tdesc.c (aarch64_linux_read_description): Add VQ
+ checks.
+ * linux-aarch64-tdesc.h (aarch64_linux_read_description): Add VQ.
+
+2018-06-11 Alan Hayward <alan.hayward@arm.com>
+
* server.h (PBUFSIZ): Increase size
2018-06-11 Alan Hayward <alan.hayward@arm.com>
diff --git a/gdb/gdbserver/linux-aarch64-ipa.c b/gdb/gdbserver/linux-aarch64-ipa.c
index 3095408..efdc051 100644
--- a/gdb/gdbserver/linux-aarch64-ipa.c
+++ b/gdb/gdbserver/linux-aarch64-ipa.c
@@ -147,12 +147,12 @@ get_raw_reg (const unsigned char *raw_regs, int regnum)
/* Return target_desc to use for IPA, given the tdesc index passed by
gdbserver. Index is ignored, since we have only one tdesc
- at the moment. */
+ at the moment. SVE not yet supported. */
const struct target_desc *
get_ipa_tdesc (int idx)
{
- return aarch64_linux_read_description ();
+ return aarch64_linux_read_description (0);
}
/* Allocate buffer for the jump pads. The branch instruction has a reach
@@ -204,5 +204,6 @@ alloc_jump_pad_buffer (size_t size)
void
initialize_low_tracepoint (void)
{
- aarch64_linux_read_description ();
+ /* SVE not yet supported. */
+ aarch64_linux_read_description (0);
}
diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch64-low.c
index 7ea24c2..9db9a7c 100644
--- a/gdb/gdbserver/linux-aarch64-low.c
+++ b/gdb/gdbserver/linux-aarch64-low.c
@@ -40,6 +40,7 @@
#include "gdb_proc_service.h"
#include "arch/aarch64.h"
#include "linux-aarch64-tdesc.h"
+#include "nat/aarch64-sve-linux-ptrace.h"
#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
@@ -503,7 +504,10 @@ aarch64_arch_setup (void)
is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
if (is_elf64)
- current_process ()->tdesc = aarch64_linux_read_description ();
+ {
+ uint64_t vq = aarch64_sve_get_vq (tid);
+ current_process ()->tdesc = aarch64_linux_read_description (vq);
+ }
else
current_process ()->tdesc = tdesc_arm_with_neon;
diff --git a/gdb/gdbserver/linux-aarch64-tdesc-selftest.c b/gdb/gdbserver/linux-aarch64-tdesc-selftest.c
index 379951a..eef0b9c 100644
--- a/gdb/gdbserver/linux-aarch64-tdesc-selftest.c
+++ b/gdb/gdbserver/linux-aarch64-tdesc-selftest.c
@@ -29,7 +29,7 @@ namespace tdesc {
static void
aarch64_tdesc_test ()
{
- const target_desc *tdesc = aarch64_linux_read_description ();
+ const target_desc *tdesc = aarch64_linux_read_description (0);
SELF_CHECK (*tdesc == *tdesc_aarch64);
}
}
diff --git a/gdb/gdbserver/linux-aarch64-tdesc.c b/gdb/gdbserver/linux-aarch64-tdesc.c
index f076179..f538543 100644
--- a/gdb/gdbserver/linux-aarch64-tdesc.c
+++ b/gdb/gdbserver/linux-aarch64-tdesc.c
@@ -21,23 +21,37 @@
#include "tdesc.h"
#include "arch/aarch64.h"
#include "linux-aarch32-low.h"
+#include <inttypes.h>
+
+/* All possible aarch64 target descriptors. */
+struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1];
/* Create the aarch64 target description. */
const target_desc *
-aarch64_linux_read_description ()
+aarch64_linux_read_description (uint64_t vq)
{
- static target_desc *aarch64_tdesc = NULL;
- target_desc **tdesc = &aarch64_tdesc;
+ if (vq > AARCH64_MAX_SVE_VQ)
+ error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq,
+ AARCH64_MAX_SVE_VQ);
+
+ struct target_desc *tdesc = tdesc_aarch64_list[vq];
- if (*tdesc == NULL)
+ if (tdesc == NULL)
{
- /* SVE not yet supported. */
- *tdesc = aarch64_create_target_description (0);
+ tdesc = aarch64_create_target_description (vq);
static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL };
- init_target_desc (*tdesc, expedite_regs_aarch64);
+ static const char *expedite_regs_aarch64_sve[] = { "x29", "sp", "pc",
+ "vg", NULL };
+
+ if (vq == 0)
+ init_target_desc (tdesc, expedite_regs_aarch64);
+ else
+ init_target_desc (tdesc, expedite_regs_aarch64_sve);
+
+ tdesc_aarch64_list[vq] = tdesc;
}
- return *tdesc;
+ return tdesc;
}
diff --git a/gdb/gdbserver/linux-aarch64-tdesc.h b/gdb/gdbserver/linux-aarch64-tdesc.h
index dc36299..4d2b883 100644
--- a/gdb/gdbserver/linux-aarch64-tdesc.h
+++ b/gdb/gdbserver/linux-aarch64-tdesc.h
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-const target_desc * aarch64_linux_read_description ();
+const target_desc * aarch64_linux_read_description (uint64_t vq);
#if GDB_SELF_TEST
void initialize_low_tdesc ();