20#include <sys/utsname.h>
22#include "gdbsupport/common-defs.h"
23#include "elf/external.h"
24#include "elf/common.h"
26#include "arch/aarch64.h"
27#include "gdbsupport/common-regcache.h"
28#include "gdbsupport/byte-vector.h"
39 iovec.iov_len =
sizeof (header);
40 iovec.iov_base = &header;
52 uint64_t vq = sve_vq_from_vl (header.
vl);
56 warning (_(
"Invalid SVE state from kernel; SVE disabled."));
71 iovec.iov_len =
sizeof (header);
72 iovec.iov_base = &header;
80 header.
vl = sve_vl_from_vq (vq);
102 if (reg_buf->get_register_status (AARCH64_SVE_VG_REGNUM) != REG_VALID)
112 reg_vg = sve_vg_from_vq (vq);
115 reg_buf->raw_collect (AARCH64_SVE_VG_REGNUM, ®_vg);
122std::unique_ptr<gdb_byte[]>
129 perror_with_name (_(
"Unable to fetch SVE register header"));
137 std::unique_ptr<gdb_byte[]> buf (
new gdb_byte[iovec.iov_len]);
138 iovec.iov_base = buf.get ();
141 perror_with_name (_(
"Unable to fetch SVE registers"));
153 gdb_assert (src !=
nullptr && dst !=
nullptr);
154 gdb_assert (size > 1);
156#if (__BYTE_ORDER == __BIG_ENDIAN)
157 for (
int i = 0; i < size - 1; i++)
158 dst[i] = src[size - i];
160 memcpy (dst, src, size);
170 char *base = (
char *) buf;
173 uint64_t vq = sve_vq_from_vl (header->
vl);
174 uint64_t vg = sve_vg_from_vl (header->
vl);
179 error (_(
"Invalid SVE header from kernel."));
183 reg_buf->raw_supply (AARCH64_SVE_VG_REGNUM, &vg);
189 for (
int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
190 reg_buf->raw_supply (AARCH64_SVE_Z0_REGNUM + i,
193 for (
int i = 0; i < AARCH64_SVE_P_REGS_NUM; i++)
194 reg_buf->raw_supply (AARCH64_SVE_P0_REGNUM + i,
197 reg_buf->raw_supply (AARCH64_SVE_FFR_REGNUM,
199 reg_buf->raw_supply (AARCH64_FPSR_REGNUM,
201 reg_buf->raw_supply (AARCH64_FPCR_REGNUM,
222 struct user_fpsimd_state *fpsimd
232 for (
int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
237 reg_buf->raw_supply (AARCH64_SVE_Z0_REGNUM + i, reg);
240 reg_buf->raw_supply (AARCH64_FPSR_REGNUM, &fpsimd->fpsr);
241 reg_buf->raw_supply (AARCH64_FPCR_REGNUM, &fpsimd->fpcr);
246 for (
int i = 0; i < AARCH64_SVE_P_REGS_NUM; i++)
247 reg_buf->raw_supply (AARCH64_SVE_P0_REGNUM + i, reg);
249 reg_buf->raw_supply (AARCH64_SVE_FFR_REGNUM, reg);
260 char *base = (
char *) buf;
261 uint64_t vq = sve_vq_from_vl (header->
vl);
266 error (_(
"Invalid SVE header from kernel."));
277 bool has_sve_state =
false;
279 struct user_fpsimd_state *fpsimd
287 for (
int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
289 has_sve_state |= reg_buf->raw_compare (AARCH64_SVE_Z0_REGNUM + i,
290 reg,
sizeof (__int128_t));
296 for (
int i = 0; i < AARCH64_SVE_P_REGS_NUM; i++)
298 has_sve_state |= reg_buf->raw_compare (AARCH64_SVE_P0_REGNUM + i,
305 has_sve_state |= reg_buf->raw_compare (AARCH64_SVE_FFR_REGNUM,
329 for (
int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
332 == reg_buf->get_register_status (AARCH64_SVE_Z0_REGNUM + i))
334 reg_buf->raw_collect (AARCH64_SVE_Z0_REGNUM + i, reg);
341 if (REG_VALID == reg_buf->get_register_status (AARCH64_FPSR_REGNUM))
342 reg_buf->raw_collect (AARCH64_FPSR_REGNUM, &fpsimd->fpsr);
343 if (REG_VALID == reg_buf->get_register_status (AARCH64_FPCR_REGNUM))
344 reg_buf->raw_collect (AARCH64_FPCR_REGNUM, &fpsimd->fpcr);
363 for (
int i = AARCH64_SVE_Z_REGS_NUM; i >= 0 ; i--)
366 sizeof (__int128_t));
372 for (
int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
373 if (REG_VALID == reg_buf->get_register_status (AARCH64_SVE_Z0_REGNUM + i))
374 reg_buf->raw_collect (AARCH64_SVE_Z0_REGNUM + i,
377 for (
int i = 0; i < AARCH64_SVE_P_REGS_NUM; i++)
378 if (REG_VALID == reg_buf->get_register_status (AARCH64_SVE_P0_REGNUM + i))
379 reg_buf->raw_collect (AARCH64_SVE_P0_REGNUM + i,
382 if (REG_VALID == reg_buf->get_register_status (AARCH64_SVE_FFR_REGNUM))
383 reg_buf->raw_collect (AARCH64_SVE_FFR_REGNUM,
385 if (REG_VALID == reg_buf->get_register_status (AARCH64_FPSR_REGNUM))
386 reg_buf->raw_collect (AARCH64_FPSR_REGNUM,
388 if (REG_VALID == reg_buf->get_register_status (AARCH64_FPCR_REGNUM))
389 reg_buf->raw_collect (AARCH64_FPCR_REGNUM,
void aarch64_sve_regs_copy_to_reg_buf(struct reg_buffer_common *reg_buf, const void *buf)
static void aarch64_maybe_swab128(gdb_byte *dst, const gdb_byte *src, size_t size)
std::unique_ptr< gdb_byte[]> aarch64_sve_get_sveregs(int tid)
void aarch64_sve_regs_copy_from_reg_buf(const struct reg_buffer_common *reg_buf, void *buf)
uint64_t aarch64_sve_get_vq(int tid)
bool aarch64_sve_set_vq(int tid, uint64_t vq)
#define HAS_SVE_STATE(header)
#define SVE_PT_SVE_FPSR_OFFSET(vq)
#define SVE_PT_SVE_FPCR_OFFSET(vq)
#define SVE_PT_SVE_FFR_OFFSET(vq)
#define SVE_PT_SVE_PREG_OFFSET(vq, n)
#define SVE_PT_SIZE(vq, flags)
#define SVE_PT_SVE_ZREG_SIZE(vq)
#define SVE_PT_FPSIMD_OFFSET
#define SVE_PT_SVE_ZREG_OFFSET(vq, n)
#define ptrace(request, pid, addr, data)