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