/* Common target dependent for AArch64 systems.

   Copyright (C) 2018-2021 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 NAT_AARCH64_SVE_LINUX_PTRACE_H
#define NAT_AARCH64_SVE_LINUX_PTRACE_H

#include <signal.h>
#include <sys/utsname.h>

/* The order in which <sys/ptrace.h> and <asm/ptrace.h> are included
   can be important.  <sys/ptrace.h> often declares various PTRACE_*
   enums.  <asm/ptrace.h> often defines preprocessor constants for
   these very same symbols.  When that's the case, build errors will
   result when <asm/ptrace.h> is included before <sys/ptrace.h>.  */
#include <sys/ptrace.h>
#include <asm/ptrace.h>

#ifndef SVE_SIG_ZREGS_SIZE
#include "aarch64-sve-linux-sigcontext.h"
#endif

/* Indicates whether a SVE ptrace header is followed by SVE registers or a
   fpsimd structure.  */

#define HAS_SVE_STATE(header) ((header).flags & SVE_PT_REGS_SVE)

/* 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).  */

uint64_t aarch64_sve_get_vq (int tid);

/* Set VQ in the kernel for the given tid, using either the value VQ or
   reading from the register VG in the register buffer.  */

bool aarch64_sve_set_vq (int tid, uint64_t vq);
bool aarch64_sve_set_vq (int tid, struct reg_buffer_common *reg_buf);

/* Read the current SVE register set using ptrace, allocating space as
   required.  */

extern std::unique_ptr<gdb_byte[]> aarch64_sve_get_sveregs (int tid);

/* Put the registers from linux structure buf into register buffer.  Assumes the
   vector lengths in the register buffer match the size in the kernel.  */

extern void aarch64_sve_regs_copy_to_reg_buf (struct reg_buffer_common *reg_buf,
					      const void *buf);

/* Put the registers from register buffer into linux structure buf.  Assumes the
   vector lengths in the register buffer match the size in the kernel.  */

extern void
aarch64_sve_regs_copy_from_reg_buf (const struct reg_buffer_common *reg_buf,
				    void *buf);

#endif /* NAT_AARCH64_SVE_LINUX_PTRACE_H */
