/* Common target dependent code for GNU/Linux on PPC systems.

   Copyright (C) 2018-2024 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 GDB_ARCH_PPC_LINUX_COMMON_H
#define GDB_ARCH_PPC_LINUX_COMMON_H

struct target_desc;

/* The core file VMX regset has 34 16-byte fields (32 16-byte vector
   registers, plus two fields containing 4-byte registers, VSCR and
   VRSAVE), while the ptrace calls return or read 33 16-byte fields
   plus a 4-byte field for VRSAVE. For simplicity we use the longer
   length for both cases.  */
#define PPC_LINUX_SIZEOF_VRREGSET 544

#define PPC_LINUX_SIZEOF_VSXREGSET 256
#define PPC_LINUX_SIZEOF_PPRREGSET 8
#define PPC_LINUX_SIZEOF_DSCRREGSET 8
#define PPC_LINUX_SIZEOF_TARREGSET 8
#define PPC_LINUX_SIZEOF_EBBREGSET (3*8)
#define PPC_LINUX_SIZEOF_PMUREGSET (5*8)
#define PPC_LINUX_SIZEOF_TM_SPRREGSET (3*8)
#define PPC32_LINUX_SIZEOF_CGPRREGSET (48*4)
#define PPC64_LINUX_SIZEOF_CGPRREGSET (48*8)
#define PPC_LINUX_SIZEOF_CFPRREGSET (32*8+8)
#define PPC_LINUX_SIZEOF_CVMXREGSET (34*16)
#define PPC_LINUX_SIZEOF_CVSXREGSET (32*8)
#define PPC_LINUX_SIZEOF_CPPRREGSET 8
#define PPC_LINUX_SIZEOF_CDSCRREGSET 8
#define PPC_LINUX_SIZEOF_CTARREGSET 8

/* Check if the hwcap auxv entry indicates that isa205 is supported.  */
bool ppc_linux_has_isa205 (CORE_ADDR hwcap);

/* Features used to determine the target description.  */
struct ppc_linux_features
{
  unsigned int wordsize;
  bool altivec;
  bool vsx;
  bool isa205;
  bool ppr_dscr;
  bool isa207;
  bool htm;
};

/* Base value for ppc_linux_features variables.  */
const struct ppc_linux_features ppc_linux_no_features = {
  0,
  false,
  false,
  false,
  false,
  false,
  false,
};

/* Return a target description that matches FEATURES.  */
const struct target_desc * ppc_linux_match_description
(struct ppc_linux_features features);

#endif /* GDB_ARCH_PPC_LINUX_COMMON_H */
