aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2018-05-31 14:36:48 +0100
committerAlan Hayward <alan.hayward@arm.com>2018-05-31 14:36:48 +0100
commit122394f1476b1c925a281b15399119500c8231c1 (patch)
treeeeacb0f62658c8cf48d8b300b729090337b837b1
parent95228a0d790f16deae3436e18f41b70fc711a5b2 (diff)
downloadgdb-122394f1476b1c925a281b15399119500c8231c1.zip
gdb-122394f1476b1c925a281b15399119500c8231c1.tar.gz
gdb-122394f1476b1c925a281b15399119500c8231c1.tar.bz2
Function for reading the Aarch64 SVE vector length
Returns 0 for systems without SVE support. Note the defines taken from Linux kernel headers in aarch64-sve-linux-ptrace.h. gdb/ * Makefile.in: Add new header. * gdb/arch/aarch64.h (sve_vg_from_vl): New macro. (sve_vl_from_vg): Likewise. (sve_vq_from_vl): Likewise. (sve_vl_from_vq): Likewise. (sve_vq_from_vg): Likewise. (sve_vg_from_vq): Likewise. * configure.nat: Add new c file. * nat/aarch64-sve-linux-ptrace.c: New file. * nat/aarch64-sve-linux-ptrace.h: New file. gdbserver/ * configure.srv: Add new c/h file.
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/Makefile.in1
-rw-r--r--gdb/arch/aarch64.h17
-rw-r--r--gdb/configure.nat3
-rw-r--r--gdb/gdbserver/ChangeLog4
-rw-r--r--gdb/gdbserver/configure.srv1
-rw-r--r--gdb/nat/aarch64-sve-linux-ptrace.c58
-rw-r--r--gdb/nat/aarch64-sve-linux-ptrace.h73
8 files changed, 169 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2f4dae0..eaf0ce1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,18 @@
2018-05-31 Alan Hayward <alan.hayward@arm.com>
+ * Makefile.in: Add new header.
+ * gdb/arch/aarch64.h (sve_vg_from_vl): New macro.
+ (sve_vl_from_vg): Likewise.
+ (sve_vq_from_vl): Likewise.
+ (sve_vl_from_vq): Likewise.
+ (sve_vq_from_vg): Likewise.
+ (sve_vg_from_vq): Likewise.
+ * configure.nat: Add new c file.
+ * nat/aarch64-sve-linux-ptrace.c: New file.
+ * nat/aarch64-sve-linux-ptrace.h: New file.
+
+2018-05-31 Alan Hayward <alan.hayward@arm.com>
+
* aarch64-linux-nat.c (aarch64_linux_read_description):
Add parmeter zero.
* aarch64-linux-tdep.c (aarch64_linux_core_read_description):
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 627944f..a0e5b7e 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1483,6 +1483,7 @@ HFILES_NO_SRCDIR = \
mi/mi-parse.h \
nat/aarch64-linux.h \
nat/aarch64-linux-hw-point.h \
+ nat/aarch64-sve-linux-ptrace.h \
nat/amd64-linux-siginfo.h \
nat/gdb_ptrace.h \
nat/gdb_thread_db.h \
diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h
index b291a09..2f80a29 100644
--- a/gdb/arch/aarch64.h
+++ b/gdb/arch/aarch64.h
@@ -52,6 +52,23 @@ enum aarch64_regnum
#define AARCH64_V_REGS_NUM 32
#define AARCH64_NUM_REGS AARCH64_FPCR_REGNUM + 1
+/* There are a number of ways of expressing the current SVE vector size:
+
+ VL : Vector Length.
+ The number of bytes in an SVE Z register.
+ VQ : Vector Quotient.
+ The number of 128bit chunks in an SVE Z register.
+ VG : Vector Gradient.
+ The number of 64bit chunks in an SVE Z register. */
+
+#define sve_vg_from_vl(vl) ((vl) / 8)
+#define sve_vl_from_vg(vg) ((vg) * 8)
+#define sve_vq_from_vl(vl) ((vl) / 0x10)
+#define sve_vl_from_vq(vq) ((vq) * 0x10)
+#define sve_vq_from_vg(vg) (sve_vq_from_vl (sve_vl_from_vg (vg)))
+#define sve_vg_from_vq(vq) (sve_vg_from_vl (sve_vl_from_vq (vq)))
+
+
/* Maximum supported VQ value. Increase if required. */
#define AARCH64_MAX_SVE_VQ 16
diff --git a/gdb/configure.nat b/gdb/configure.nat
index bcaeaf4..7611266 100644
--- a/gdb/configure.nat
+++ b/gdb/configure.nat
@@ -228,7 +228,8 @@ case ${gdb_host} in
aarch64)
# Host: AArch64 based machine running GNU/Linux
NATDEPFILES="${NATDEPFILES} aarch64-linux-nat.o \
- aarch32-linux-nat.o aarch64-linux-hw-point.o aarch64-linux.o"
+ aarch32-linux-nat.o aarch64-linux-hw-point.o aarch64-linux.o \
+ aarch64-sve-linux-ptrace.o"
;;
arm)
# Host: ARM based machine running GNU/Linux
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index c61609b..ff385e4 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,9 @@
2018-05-31 Alan Hayward <alan.hayward@arm.com>
+ * configure.srv: Add new c/h file.
+
+2018-05-31 Alan Hayward <alan.hayward@arm.com>
+
* linux-aarch64-tdesc.c (aarch64_linux_read_description): Add
null VQ.
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 7153ff3..72e6a0d 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -54,6 +54,7 @@ case "${target}" in
srv_tgtobj="$srv_tgtobj arch/aarch64-insn.o"
srv_tgtobj="$srv_tgtobj arch/aarch64.o"
srv_tgtobj="$srv_tgtobj linux-aarch64-tdesc.o"
+ srv_tgtobj="$srv_tgtobj aarch64-sve-linux-ptrace.o"
srv_tgtobj="${srv_tgtobj} $srv_linux_obj"
srv_linux_regsets=yes
srv_linux_thread_db=yes
diff --git a/gdb/nat/aarch64-sve-linux-ptrace.c b/gdb/nat/aarch64-sve-linux-ptrace.c
new file mode 100644
index 0000000..3a1dbae
--- /dev/null
+++ b/gdb/nat/aarch64-sve-linux-ptrace.c
@@ -0,0 +1,58 @@
+/* Common target dependent for AArch64 systems.
+
+ Copyright (C) 2018 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <sys/utsname.h>
+#include <sys/uio.h>
+#include "common-defs.h"
+#include "elf/external.h"
+#include "elf/common.h"
+#include "aarch64-sve-linux-ptrace.h"
+#include "arch/aarch64.h"
+
+/* See nat/aarch64-sve-linux-ptrace.h. */
+
+unsigned long
+aarch64_sve_get_vq (int tid)
+{
+ struct iovec iovec;
+ struct user_sve_header header;
+
+ iovec.iov_len = sizeof (header);
+ iovec.iov_base = &header;
+
+ /* Ptrace gives the vector length in bytes. Convert it to VQ, the number of
+ 128bit chunks in a Z register. We use VQ because 128bits is the minimum
+ a Z register can increase in size. */
+
+ if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_SVE, &iovec) < 0)
+ {
+ /* SVE is not supported. */
+ return 0;
+ }
+
+ long vq = sve_vq_from_vl (header.vl);
+
+ if (!sve_vl_valid (header.vl))
+ {
+ warning (_("Invalid SVE state from kernel; SVE disabled."));
+ return 0;
+ }
+
+ return vq;
+}
diff --git a/gdb/nat/aarch64-sve-linux-ptrace.h b/gdb/nat/aarch64-sve-linux-ptrace.h
new file mode 100644
index 0000000..a32ddf1
--- /dev/null
+++ b/gdb/nat/aarch64-sve-linux-ptrace.h
@@ -0,0 +1,73 @@
+/* Common target dependent for AArch64 systems.
+
+ Copyright (C) 2018 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef AARCH64_SVE_LINUX_PTRACE_H
+#define AARCH64_SVE_LINUX_PTRACE_H
+
+/* Where indicated, this file contains defines and macros lifted directly from
+ the Linux kernel headers, with no modification.
+ Refer to Linux kernel documentation for details. */
+
+#include <asm/sigcontext.h>
+#include <sys/utsname.h>
+#include <sys/ptrace.h>
+#include <asm/ptrace.h>
+
+/* Read VQ for the given tid using ptrace. If SVE is not supported then zero
+ is returned (on a system that supports SVE, then VQ cannot be zero). */
+
+extern unsigned long aarch64_sve_get_vq (int tid);
+
+/* Structures and defines taken from sigcontext.h. */
+
+#ifndef SVE_SIG_ZREGS_SIZE
+
+#define SVE_VQ_BYTES 16 /* number of bytes per quadword */
+
+#define SVE_VQ_MIN 1
+#define SVE_VQ_MAX 512
+
+#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES)
+#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES)
+
+#define SVE_NUM_ZREGS 32
+#define SVE_NUM_PREGS 16
+
+#define sve_vl_valid(vl) \
+ ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
+
+#endif /* SVE_SIG_ZREGS_SIZE. */
+
+
+/* Structures and defines taken from ptrace.h. */
+
+#ifndef SVE_PT_SVE_ZREG_SIZE
+
+struct user_sve_header {
+ __u32 size; /* total meaningful regset content in bytes */
+ __u32 max_size; /* maxmium possible size for this thread */
+ __u16 vl; /* current vector length */
+ __u16 max_vl; /* maximum possible vector length */
+ __u16 flags;
+ __u16 __reserved;
+};
+
+#endif /* SVE_PT_SVE_ZREG_SIZE. */
+
+#endif /* aarch64-sve-linux-ptrace.h */