Function for reading the Aarch64 SVE vector length
authorAlan Hayward <alan.hayward@arm.com>
Thu, 31 May 2018 13:36:48 +0000 (14:36 +0100)
committerAlan Hayward <alan.hayward@arm.com>
Thu, 31 May 2018 13:36:48 +0000 (14:36 +0100)
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.

gdb/ChangeLog
gdb/Makefile.in
gdb/arch/aarch64.h
gdb/configure.nat
gdb/gdbserver/ChangeLog
gdb/gdbserver/configure.srv
gdb/nat/aarch64-sve-linux-ptrace.c [new file with mode: 0644]
gdb/nat/aarch64-sve-linux-ptrace.h [new file with mode: 0644]

index 2f4dae0664bc3ba5a464e0687e3e7d9b89fdf83c..eaf0ce1fa7f519000da471226241cd959e4c5086 100644 (file)
@@ -1,3 +1,16 @@
+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):
index 627944f9c41f44059897c7e9e1be6431d62c80e4..a0e5b7edba658349beef34f2eeec7ccb8b223e27 100644 (file)
@@ -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 \
index b291a09770ee3c5e787a001a9eaf19b5725f6cfa..2f80a293bb940bdcdf3c4ea5374fd3f44eb9026a 100644 (file)
@@ -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
 
index bcaeaf45833fbd9986cdafd89b5962ec8ef7d7cd..7611266d86f3ab8ae780cab010c90df9d95f5b8e 100644 (file)
@@ -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
index c61609bbd7c948663e9db4dc6a87f27652330c23..ff385e44f623cfcbe773d0376951d607282165f6 100644 (file)
@@ -1,3 +1,7 @@
+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
index 7153ff339d73dcc96f5e9651779369dc9c6252a2..72e6a0d87f46d7af052cac841582849089d14734 100644 (file)
@@ -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 (file)
index 0000000..3a1dbae
--- /dev/null
@@ -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 (file)
index 0000000..a32ddf1
--- /dev/null
@@ -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 */