diff options
author | Alan Hayward <alan.hayward@arm.com> | 2018-05-31 14:36:48 +0100 |
---|---|---|
committer | Alan Hayward <alan.hayward@arm.com> | 2018-05-31 14:36:48 +0100 |
commit | 122394f1476b1c925a281b15399119500c8231c1 (patch) | |
tree | eeacb0f62658c8cf48d8b300b729090337b837b1 /gdb/nat/aarch64-sve-linux-ptrace.c | |
parent | 95228a0d790f16deae3436e18f41b70fc711a5b2 (diff) | |
download | gdb-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.
Diffstat (limited to 'gdb/nat/aarch64-sve-linux-ptrace.c')
-rw-r--r-- | gdb/nat/aarch64-sve-linux-ptrace.c | 58 |
1 files changed, 58 insertions, 0 deletions
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; +} |