xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/arch/ppc-linux-common.c (revision 6881a4007f077b54e5f51159c52b9b25f57deb0d)
17f2ac410Schristos /* Common target dependent code for GNU/Linux on PPC systems.
27f2ac410Schristos 
3*6881a400Schristos    Copyright (C) 2018-2023 Free Software Foundation, Inc.
47f2ac410Schristos 
57f2ac410Schristos    This file is part of GDB.
67f2ac410Schristos 
77f2ac410Schristos    This program is free software; you can redistribute it and/or modify
87f2ac410Schristos    it under the terms of the GNU General Public License as published by
97f2ac410Schristos    the Free Software Foundation; either version 3 of the License, or
107f2ac410Schristos    (at your option) any later version.
117f2ac410Schristos 
127f2ac410Schristos    This program is distributed in the hope that it will be useful,
137f2ac410Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
147f2ac410Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
157f2ac410Schristos    GNU General Public License for more details.
167f2ac410Schristos 
177f2ac410Schristos    You should have received a copy of the GNU General Public License
187f2ac410Schristos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
197f2ac410Schristos 
207d62b00eSchristos #include "gdbsupport/common-defs.h"
217f2ac410Schristos #include "arch/ppc-linux-common.h"
227f2ac410Schristos #include "arch/ppc-linux-tdesc.h"
237f2ac410Schristos 
247f2ac410Schristos /* Decimal Floating Point bit in AT_HWCAP.
257f2ac410Schristos 
267f2ac410Schristos    This file can be used by a host with another architecture, e.g.
277f2ac410Schristos    when debugging core files, which might not provide this constant.  */
287f2ac410Schristos 
297f2ac410Schristos #ifndef PPC_FEATURE_HAS_DFP
307f2ac410Schristos #define PPC_FEATURE_HAS_DFP	0x00000400
317f2ac410Schristos #endif
327f2ac410Schristos 
337f2ac410Schristos bool
347f2ac410Schristos ppc_linux_has_isa205 (CORE_ADDR hwcap)
357f2ac410Schristos {
367f2ac410Schristos   /* Power ISA 2.05 (implemented by Power 6 and newer processors)
377f2ac410Schristos      increases the FPSCR from 32 bits to 64 bits.  Even though Power 7
387f2ac410Schristos      supports this ISA version, it doesn't have PPC_FEATURE_ARCH_2_05
397f2ac410Schristos      set, only PPC_FEATURE_ARCH_2_06.  Since for now the only bits
407f2ac410Schristos      used in the higher half of the register are for Decimal Floating
417f2ac410Schristos      Point, we check if that feature is available to decide the size
427f2ac410Schristos      of the FPSCR.  */
437f2ac410Schristos   return ((hwcap & PPC_FEATURE_HAS_DFP) != 0);
447f2ac410Schristos }
457f2ac410Schristos 
467f2ac410Schristos const struct target_desc *
477f2ac410Schristos ppc_linux_match_description (struct ppc_linux_features features)
487f2ac410Schristos {
49*6881a400Schristos   const struct target_desc *tdesc = NULL;
507f2ac410Schristos 
517f2ac410Schristos   if (features.wordsize == 8)
527f2ac410Schristos     {
537d62b00eSchristos       if (features.vsx)
547f2ac410Schristos 	tdesc = (features.htm? tdesc_powerpc_isa207_htm_vsx64l
557f2ac410Schristos 		 : features.isa207? tdesc_powerpc_isa207_vsx64l
567f2ac410Schristos 		 : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l
577f2ac410Schristos 		 : features.isa205? tdesc_powerpc_isa205_vsx64l
587f2ac410Schristos 		 : tdesc_powerpc_vsx64l);
597f2ac410Schristos       else if (features.altivec)
607f2ac410Schristos 	tdesc = (features.isa205? tdesc_powerpc_isa205_altivec64l
617f2ac410Schristos 		 : tdesc_powerpc_altivec64l);
627f2ac410Schristos       else
637f2ac410Schristos 	tdesc = (features.isa205? tdesc_powerpc_isa205_64l
647f2ac410Schristos 		 : tdesc_powerpc_64l);
657f2ac410Schristos     }
667f2ac410Schristos   else
677f2ac410Schristos     {
687f2ac410Schristos       gdb_assert (features.wordsize == 4);
697f2ac410Schristos 
707d62b00eSchristos       if (features.vsx)
717f2ac410Schristos 	tdesc = (features.htm? tdesc_powerpc_isa207_htm_vsx32l
727f2ac410Schristos 		 : features.isa207? tdesc_powerpc_isa207_vsx32l
737f2ac410Schristos 		 : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l
747f2ac410Schristos 		 : features.isa205? tdesc_powerpc_isa205_vsx32l
757f2ac410Schristos 		 : tdesc_powerpc_vsx32l);
767f2ac410Schristos       else if (features.altivec)
777f2ac410Schristos 	tdesc = (features.isa205? tdesc_powerpc_isa205_altivec32l
787f2ac410Schristos 		 : tdesc_powerpc_altivec32l);
797f2ac410Schristos       else
807f2ac410Schristos 	tdesc = (features.isa205? tdesc_powerpc_isa205_32l
817f2ac410Schristos 		 : tdesc_powerpc_32l);
827f2ac410Schristos     }
837f2ac410Schristos 
847f2ac410Schristos   gdb_assert (tdesc != NULL);
857f2ac410Schristos 
867f2ac410Schristos   return tdesc;
877f2ac410Schristos }
88