+2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
+
+ * arch/ppc-linux-common.c: New file.
+ * arch/ppc-linux-common.h: New file.
+ * arch/ppc-linux-tdesc.h: New file.
+ * configure.tgt (powerpc*-*-linux*): Add arch/ppc-linux-common.o.
+ * Makefile.in (ALL_TARGET_OBS): Add arch/ppc-linux-common.o.
+ (HFILES_NO_SRCDIR): Add arch/ppc-linux-common.h and
+ arch/ppc-linux-tdesc.h.
+ * ppc-linux-nat.c: Include arch/ppc-linux-common.h and
+ arch/ppc-linux-tdesc.h.
+ (ppc_linux_nat_target::read_description): Remove target
+ description matching code. Fill a ppc_linux_features struct and
+ call ppc_linux_match_description with it. Move comment about ISA
+ 2.05 to ppc-linux-common.c.
+ * ppc-linux-tdep.c: Include arch/ppc-linux-common.h and
+ arch/ppc-linux-tdesc.h.
+ (ppc_linux_core_read_description): Remove target description
+ matching code. Fill a ppc_linux_features struct and call
+ ppc_linux_match_description with it.
+ * ppc-linux-tdep.h (tdesc_powerpc_32l, tdesc_powerpc_64l)
+ (tdesc_powerpc_altivec32l, tdesc_powerpc_altivec64l)
+ (tdesc_powerpc_cell32l, tdesc_powerpc_cell64l)
+ (tdesc_powerpc_vsx32l, tdesc_powerpc_vsx64l)
+ (tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_64l)
+ (tdesc_powerpc_isa205_altivec32l, tdesc_powerpc_isa205_altivec64l)
+ (tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_vsx64l)
+ (tdesc_powerpc_e500l): Remove.
+
2018-05-22 Joel Brobecker <brobecker@adacore.com>
* ada-lang.c (catch_assert_command): Pass empty string instead
arch/arm-get-next-pcs.o \
arch/arm-linux.o \
arch/i386.o \
+ arch/ppc-linux-common.o \
arm-bsd-tdep.o \
arm-fbsd-tdep.o \
arm-linux-tdep.o \
arch/aarch64-insn.h \
arch/arm.h \
arch/i386.h \
+ arch/ppc-linux-common.h \
+ arch/ppc-linux-tdesc.h \
cli/cli-cmds.h \
cli/cli-decode.h \
cli/cli-script.h \
--- /dev/null
+/* Common target dependent code for GNU/Linux on PPC systems.
+
+ Copyright (C) 2018 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/>. */
+
+#include "common-defs.h"
+#include "arch/ppc-linux-common.h"
+#include "arch/ppc-linux-tdesc.h"
+
+/* Decimal Floating Point bit in AT_HWCAP.
+
+ This file can be used by a host with another architecture, e.g.
+ when debugging core files, which might not provide this constant. */
+
+#ifndef PPC_FEATURE_HAS_DFP
+#define PPC_FEATURE_HAS_DFP 0x00000400
+#endif
+
+bool
+ppc_linux_has_isa205 (unsigned long hwcap)
+{
+ /* Power ISA 2.05 (implemented by Power 6 and newer processors)
+ increases the FPSCR from 32 bits to 64 bits. Even though Power 7
+ supports this ISA version, it doesn't have PPC_FEATURE_ARCH_2_05
+ set, only PPC_FEATURE_ARCH_2_06. Since for now the only bits
+ used in the higher half of the register are for Decimal Floating
+ Point, we check if that feature is available to decide the size
+ of the FPSCR. */
+ return ((hwcap & PPC_FEATURE_HAS_DFP) != 0);
+}
+
+const struct target_desc *
+ppc_linux_match_description (struct ppc_linux_features features)
+{
+ struct target_desc *tdesc = NULL;
+
+ if (features.wordsize == 8)
+ {
+ if (features.cell)
+ tdesc = tdesc_powerpc_cell64l;
+ else if (features.vsx)
+ tdesc = features.isa205
+ ? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l;
+ else if (features.altivec)
+ tdesc = features.isa205
+ ? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l;
+ else
+ tdesc = features.isa205?
+ tdesc_powerpc_isa205_64l : tdesc_powerpc_64l;
+ }
+ else
+ {
+ gdb_assert (features.wordsize == 4);
+
+ if (features.cell)
+ tdesc = tdesc_powerpc_cell32l;
+ else if (features.vsx)
+ tdesc = features.isa205
+ ? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l;
+ else if (features.altivec)
+ tdesc = features.isa205
+ ? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l;
+ else
+ tdesc = features.isa205
+ ? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l;
+ }
+
+ gdb_assert (tdesc != NULL);
+
+ return tdesc;
+}
--- /dev/null
+/* Common target dependent code for GNU/Linux on PPC systems.
+
+ Copyright (C) 2018 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 ARCH_PPC_LINUX_COMMON_H
+#define ARCH_PPC_LINUX_COMMON_H
+
+struct target_desc;
+
+/* Check if the hwcap auxv entry indicates that isa205 is supported. */
+bool ppc_linux_has_isa205 (unsigned long hwcap);
+
+/* Features used to determine the target description. */
+struct ppc_linux_features
+{
+ unsigned int wordsize;
+ bool altivec;
+ bool vsx;
+ bool isa205;
+ bool cell;
+};
+
+/* Base value for ppc_linux_features variables. */
+const struct ppc_linux_features ppc_linux_no_features = {
+ 0,
+ 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 /* ARCH_PPC_LINUX_COMMON_H */
--- /dev/null
+/* Target description declarations shared between gdb, gdbserver and IPA.
+
+ Copyright (C) 2018 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 ARCH_PPC_LINUX_TDESC_H
+#define ARCH_PPC_LINUX_TDESC_H
+
+struct target_desc;
+
+extern struct target_desc *tdesc_powerpc_32l;
+extern struct target_desc *tdesc_powerpc_altivec32l;
+extern struct target_desc *tdesc_powerpc_cell32l;
+extern struct target_desc *tdesc_powerpc_vsx32l;
+extern struct target_desc *tdesc_powerpc_isa205_32l;
+extern struct target_desc *tdesc_powerpc_isa205_altivec32l;
+extern struct target_desc *tdesc_powerpc_isa205_vsx32l;
+extern struct target_desc *tdesc_powerpc_e500l;
+
+extern struct target_desc *tdesc_powerpc_64l;
+extern struct target_desc *tdesc_powerpc_altivec64l;
+extern struct target_desc *tdesc_powerpc_cell64l;
+extern struct target_desc *tdesc_powerpc_vsx64l;
+extern struct target_desc *tdesc_powerpc_isa205_64l;
+extern struct target_desc *tdesc_powerpc_isa205_altivec64l;
+extern struct target_desc *tdesc_powerpc_isa205_vsx64l;
+
+#endif /* ARCH_PPC_LINUX_TDESC_H */
spu-multiarch.o \
glibc-tdep.o symfile-mem.o linux-tdep.o \
ravenscar-thread.o ppc-ravenscar-thread.o \
- linux-record.o "
+ linux-record.o \
+ arch/ppc-linux-common.o"
gdb_sim=../sim/ppc/libsim.a
build_gdbserver=yes
;;
+2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
+
+ * configure.srv (srv_tgtobj): Add arch/ppc-linux-common.o.
+ * Makefile.in (SFILES): Add arch/ppc-linux-common.c.
+ * linux-ppc-tdesc.h: Rename to linux-ppc-tdesc-init.h.
+ * linux-ppc-tdesc-init.h (tdesc_powerpc_32l, tdesc_powerpc_64l)
+ (tdesc_powerpc_altivec32l, tdesc_powerpc_altivec64l)
+ (tdesc_powerpc_cell32l, tdesc_powerpc_cell64l)
+ (tdesc_powerpc_vsx32l, tdesc_powerpc_vsx64l)
+ (tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_64l)
+ (tdesc_powerpc_isa205_altivec32l, tdesc_powerpc_isa205_altivec64l)
+ (tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_vsx64l)
+ (tdesc_powerpc_e500l): Remove.
+ * linux-ppc-ipa.c: Include arch/ppc-linux-tdesc.h and
+ linux-ppc-tdesc-init.h. Don't include linux-ppc-tdesc.h.
+ * linux-ppc-low.c: Include arch/ppc-linux-common.h,
+ arch/ppc-linux-tdesc.h, and linux-ppc-tdesc-init.h. Don't include
+ linux-ppc-tdesc.h.
+ (ppc_arch_setup): Remove target description matching code. Fill a
+ ppc_linux_features struct and call ppc_linux_match_description
+ with it.
+
2018-05-22 Maciej W. Rozycki <macro@mips.com>
* linux-mips-low.c (mips_cannot_fetch_register): Return 1 if the
$(srcdir)/arch/arm.c \
$(srcdir)/arch/arm-get-next-pcs.c \
$(srcdir)/arch/arm-linux.c \
+ $(srcdir)/arch/ppc-linux-common.c \
$(srcdir)/common/btrace-common.c \
$(srcdir)/common/buffer.c \
$(srcdir)/common/cleanups.c \
srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o"
srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o"
srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o"
+ srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o"
srv_xmlfiles="rs6000/powerpc-32l.xml"
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-altivec32l.xml"
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-cell32l.xml"
#include "server.h"
#include <sys/mman.h>
#include "tracepoint.h"
-#include "linux-ppc-tdesc.h"
+#include "arch/ppc-linux-tdesc.h"
+#include "linux-ppc-tdesc-init.h"
#include <elf.h>
#ifdef HAVE_GETAUXVAL
#include <sys/auxv.h>
#include <elf.h>
#include <asm/ptrace.h>
+#include "arch/ppc-linux-common.h"
+#include "arch/ppc-linux-tdesc.h"
#include "nat/ppc-linux.h"
-#include "linux-ppc-tdesc.h"
+#include "linux-ppc-tdesc-init.h"
#include "ax.h"
#include "tracepoint.h"
ppc_arch_setup (void)
{
const struct target_desc *tdesc;
+ struct ppc_linux_features features = ppc_linux_no_features;
+
+ features.wordsize = 4;
+
#ifdef __powerpc64__
long msr;
struct regcache *regcache;
free_register_cache (regcache);
if (ppc64_64bit_inferior_p (msr))
{
- ppc_get_auxv (AT_HWCAP, &ppc_hwcap);
- if (ppc_hwcap & PPC_FEATURE_CELL)
- tdesc = tdesc_powerpc_cell64l;
- else if (ppc_hwcap & PPC_FEATURE_HAS_VSX)
- {
- /* Power ISA 2.05 (implemented by Power 6 and newer processors)
- increases the FPSCR from 32 bits to 64 bits. Even though Power 7
- supports this ISA version, it doesn't have PPC_FEATURE_ARCH_2_05
- set, only PPC_FEATURE_ARCH_2_06. Since for now the only bits
- used in the higher half of the register are for Decimal Floating
- Point, we check if that feature is available to decide the size
- of the FPSCR. */
- if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
- tdesc = tdesc_powerpc_isa205_vsx64l;
- else
- tdesc = tdesc_powerpc_vsx64l;
- }
- else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
- {
- if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
- tdesc = tdesc_powerpc_isa205_altivec64l;
- else
- tdesc = tdesc_powerpc_altivec64l;
- }
-
- current_process ()->tdesc = tdesc;
- return;
+ features.wordsize = 8;
}
#endif
- /* OK, we have a 32-bit inferior. */
- tdesc = tdesc_powerpc_32l;
- current_process ()->tdesc = tdesc;
+ if (features.wordsize == 4)
+ {
+ /* OK, we have a 32-bit inferior. */
+ tdesc = tdesc_powerpc_32l;
+ current_process ()->tdesc = tdesc;
+ }
+ /* The value of current_process ()->tdesc needs to be set for this
+ call. */
ppc_get_auxv (AT_HWCAP, &ppc_hwcap);
+
+ features.isa205 = ppc_linux_has_isa205 (ppc_hwcap);
+
+ if (ppc_hwcap & PPC_FEATURE_HAS_VSX)
+ features.vsx = true;
+
+ if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
+ features.altivec = true;
+
if (ppc_hwcap & PPC_FEATURE_CELL)
- tdesc = tdesc_powerpc_cell32l;
- else if (ppc_hwcap & PPC_FEATURE_HAS_VSX)
- {
- if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
- tdesc = tdesc_powerpc_isa205_vsx32l;
- else
- tdesc = tdesc_powerpc_vsx32l;
- }
- else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
- {
- if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
- tdesc = tdesc_powerpc_isa205_altivec32l;
- else
- tdesc = tdesc_powerpc_altivec32l;
- }
+ features.cell = true;
+
+ tdesc = ppc_linux_match_description (features);
/* On 32-bit machines, check for SPE registers.
Set the low target's regmap field as appropriately. */
ppc_regmap_adjusted = 1;
}
#endif
+
current_process ()->tdesc = tdesc;
}
--- /dev/null
+/* Low level support for ppc, shared between gdbserver and IPA.
+
+ Copyright (C) 2016-2018 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/>. */
+
+/* Note: since IPA obviously knows what ABI it's running on (32 vs 64),
+ it's sufficient to pass only the register set here. This, together with
+ the ABI known at IPA compile time, maps to a tdesc. */
+
+enum ppc_linux_tdesc {
+ PPC_TDESC_BASE,
+ PPC_TDESC_ALTIVEC,
+ PPC_TDESC_CELL,
+ PPC_TDESC_VSX,
+ PPC_TDESC_ISA205,
+ PPC_TDESC_ISA205_ALTIVEC,
+ PPC_TDESC_ISA205_VSX,
+ PPC_TDESC_E500,
+};
+
+#if !defined __powerpc64__ || !defined IN_PROCESS_AGENT
+
+/* Defined in auto-generated file powerpc-32l.c. */
+void init_registers_powerpc_32l (void);
+
+/* Defined in auto-generated file powerpc-altivec32l.c. */
+void init_registers_powerpc_altivec32l (void);
+
+/* Defined in auto-generated file powerpc-cell32l.c. */
+void init_registers_powerpc_cell32l (void);
+
+/* Defined in auto-generated file powerpc-vsx32l.c. */
+void init_registers_powerpc_vsx32l (void);
+
+/* Defined in auto-generated file powerpc-isa205-32l.c. */
+void init_registers_powerpc_isa205_32l (void);
+
+/* Defined in auto-generated file powerpc-isa205-altivec32l.c. */
+void init_registers_powerpc_isa205_altivec32l (void);
+
+/* Defined in auto-generated file powerpc-isa205-vsx32l.c. */
+void init_registers_powerpc_isa205_vsx32l (void);
+
+/* Defined in auto-generated file powerpc-e500l.c. */
+void init_registers_powerpc_e500l (void);
+
+#endif
+
+#if defined __powerpc64__
+
+/* Defined in auto-generated file powerpc-64l.c. */
+void init_registers_powerpc_64l (void);
+
+/* Defined in auto-generated file powerpc-altivec64l.c. */
+void init_registers_powerpc_altivec64l (void);
+
+/* Defined in auto-generated file powerpc-cell64l.c. */
+void init_registers_powerpc_cell64l (void);
+
+/* Defined in auto-generated file powerpc-vsx64l.c. */
+void init_registers_powerpc_vsx64l (void);
+
+/* Defined in auto-generated file powerpc-isa205-64l.c. */
+void init_registers_powerpc_isa205_64l (void);
+
+/* Defined in auto-generated file powerpc-isa205-altivec64l.c. */
+void init_registers_powerpc_isa205_altivec64l (void);
+
+/* Defined in auto-generated file powerpc-isa205-vsx64l.c. */
+void init_registers_powerpc_isa205_vsx64l (void);
+
+#endif
+++ /dev/null
-/* Low level support for ppc, shared between gdbserver and IPA.
-
- Copyright (C) 2016-2018 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/>. */
-
-/* Note: since IPA obviously knows what ABI it's running on (32 vs 64),
- it's sufficient to pass only the register set here. This, together with
- the ABI known at IPA compile time, maps to a tdesc. */
-
-enum ppc_linux_tdesc {
- PPC_TDESC_BASE,
- PPC_TDESC_ALTIVEC,
- PPC_TDESC_CELL,
- PPC_TDESC_VSX,
- PPC_TDESC_ISA205,
- PPC_TDESC_ISA205_ALTIVEC,
- PPC_TDESC_ISA205_VSX,
- PPC_TDESC_E500,
-};
-
-#if !defined __powerpc64__ || !defined IN_PROCESS_AGENT
-
-/* Defined in auto-generated file powerpc-32l.c. */
-void init_registers_powerpc_32l (void);
-extern const struct target_desc *tdesc_powerpc_32l;
-
-/* Defined in auto-generated file powerpc-altivec32l.c. */
-void init_registers_powerpc_altivec32l (void);
-extern const struct target_desc *tdesc_powerpc_altivec32l;
-
-/* Defined in auto-generated file powerpc-cell32l.c. */
-void init_registers_powerpc_cell32l (void);
-extern const struct target_desc *tdesc_powerpc_cell32l;
-
-/* Defined in auto-generated file powerpc-vsx32l.c. */
-void init_registers_powerpc_vsx32l (void);
-extern const struct target_desc *tdesc_powerpc_vsx32l;
-
-/* Defined in auto-generated file powerpc-isa205-32l.c. */
-void init_registers_powerpc_isa205_32l (void);
-extern const struct target_desc *tdesc_powerpc_isa205_32l;
-
-/* Defined in auto-generated file powerpc-isa205-altivec32l.c. */
-void init_registers_powerpc_isa205_altivec32l (void);
-extern const struct target_desc *tdesc_powerpc_isa205_altivec32l;
-
-/* Defined in auto-generated file powerpc-isa205-vsx32l.c. */
-void init_registers_powerpc_isa205_vsx32l (void);
-extern const struct target_desc *tdesc_powerpc_isa205_vsx32l;
-
-/* Defined in auto-generated file powerpc-e500l.c. */
-void init_registers_powerpc_e500l (void);
-extern const struct target_desc *tdesc_powerpc_e500l;
-
-#endif
-
-#if defined __powerpc64__
-
-/* Defined in auto-generated file powerpc-64l.c. */
-void init_registers_powerpc_64l (void);
-extern const struct target_desc *tdesc_powerpc_64l;
-
-/* Defined in auto-generated file powerpc-altivec64l.c. */
-void init_registers_powerpc_altivec64l (void);
-extern const struct target_desc *tdesc_powerpc_altivec64l;
-
-/* Defined in auto-generated file powerpc-cell64l.c. */
-void init_registers_powerpc_cell64l (void);
-extern const struct target_desc *tdesc_powerpc_cell64l;
-
-/* Defined in auto-generated file powerpc-vsx64l.c. */
-void init_registers_powerpc_vsx64l (void);
-extern const struct target_desc *tdesc_powerpc_vsx64l;
-
-/* Defined in auto-generated file powerpc-isa205-64l.c. */
-void init_registers_powerpc_isa205_64l (void);
-extern const struct target_desc *tdesc_powerpc_isa205_64l;
-
-/* Defined in auto-generated file powerpc-isa205-altivec64l.c. */
-void init_registers_powerpc_isa205_altivec64l (void);
-extern const struct target_desc *tdesc_powerpc_isa205_altivec64l;
-
-/* Defined in auto-generated file powerpc-isa205-vsx64l.c. */
-void init_registers_powerpc_isa205_vsx64l (void);
-extern const struct target_desc *tdesc_powerpc_isa205_vsx64l;
-
-#endif
#include "elf/common.h"
#include "auxv.h"
+#include "arch/ppc-linux-common.h"
+#include "arch/ppc-linux-tdesc.h"
#include "nat/ppc-linux.h"
/* Similarly for the hardware watchpoint support. These requests are used
const struct target_desc *
ppc_linux_nat_target::read_description ()
{
- int altivec = 0;
- int vsx = 0;
- int isa205 = 0;
- int cell = 0;
-
int tid = ptid_get_lwp (inferior_ptid);
if (tid == 0)
tid = ptid_get_pid (inferior_ptid);
perror_with_name (_("Unable to fetch SPE registers"));
}
+ struct ppc_linux_features features = ppc_linux_no_features;
+
+ features.wordsize = ppc_linux_target_wordsize ();
+
+ unsigned long hwcap = ppc_linux_get_hwcap ();
+
if (have_ptrace_getsetvsxregs
- && (ppc_linux_get_hwcap () & PPC_FEATURE_HAS_VSX))
+ && (hwcap & PPC_FEATURE_HAS_VSX))
{
gdb_vsxregset_t vsxregset;
if (ptrace (PTRACE_GETVSXREGS, tid, 0, &vsxregset) >= 0)
- vsx = 1;
+ features.vsx = true;
/* EIO means that the PTRACE_GETVSXREGS request isn't supported.
Anything else needs to be reported. */
}
if (have_ptrace_getvrregs
- && (ppc_linux_get_hwcap () & PPC_FEATURE_HAS_ALTIVEC))
+ && (hwcap & PPC_FEATURE_HAS_ALTIVEC))
{
gdb_vrregset_t vrregset;
if (ptrace (PTRACE_GETVRREGS, tid, 0, &vrregset) >= 0)
- altivec = 1;
+ features.altivec = true;
/* EIO means that the PTRACE_GETVRREGS request isn't supported.
Anything else needs to be reported. */
perror_with_name (_("Unable to fetch AltiVec registers"));
}
- /* Power ISA 2.05 (implemented by Power 6 and newer processors) increases
- the FPSCR from 32 bits to 64 bits. Even though Power 7 supports this
- ISA version, it doesn't have PPC_FEATURE_ARCH_2_05 set, only
- PPC_FEATURE_ARCH_2_06. Since for now the only bits used in the higher
- half of the register are for Decimal Floating Point, we check if that
- feature is available to decide the size of the FPSCR. */
- if (ppc_linux_get_hwcap () & PPC_FEATURE_HAS_DFP)
- isa205 = 1;
-
- if (ppc_linux_get_hwcap () & PPC_FEATURE_CELL)
- cell = 1;
-
- if (ppc_linux_target_wordsize () == 8)
- {
- if (cell)
- return tdesc_powerpc_cell64l;
- else if (vsx)
- return isa205? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l;
- else if (altivec)
- return isa205
- ? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l;
-
- return isa205? tdesc_powerpc_isa205_64l : tdesc_powerpc_64l;
- }
+ if (hwcap & PPC_FEATURE_CELL)
+ features.cell = true;
- if (cell)
- return tdesc_powerpc_cell32l;
- else if (vsx)
- return isa205? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l;
- else if (altivec)
- return isa205? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l;
+ features.isa205 = ppc_linux_has_isa205 (hwcap);
- return isa205? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l;
+ return ppc_linux_match_description (features);
}
void
#include "ppc-tdep.h"
#include "ppc64-tdep.h"
#include "ppc-linux-tdep.h"
+#include "arch/ppc-linux-common.h"
+#include "arch/ppc-linux-tdesc.h"
#include "glibc-tdep.h"
#include "trad-frame.h"
#include "frame-unwind.h"
struct target_ops *target,
bfd *abfd)
{
+ struct ppc_linux_features features = ppc_linux_no_features;
asection *cell = bfd_sections_find_if (abfd, ppc_linux_spu_section, NULL);
asection *altivec = bfd_get_section_by_name (abfd, ".reg-ppc-vmx");
asection *vsx = bfd_get_section_by_name (abfd, ".reg-ppc-vsx");
asection *section = bfd_get_section_by_name (abfd, ".reg");
+
if (! section)
return NULL;
switch (bfd_section_size (abfd, section))
{
case 48 * 4:
- if (cell)
- return tdesc_powerpc_cell32l;
- else if (vsx)
- return tdesc_powerpc_vsx32l;
- else if (altivec)
- return tdesc_powerpc_altivec32l;
- else
- return tdesc_powerpc_32l;
-
+ features.wordsize = 4;
+ break;
case 48 * 8:
- if (cell)
- return tdesc_powerpc_cell64l;
- else if (vsx)
- return tdesc_powerpc_vsx64l;
- else if (altivec)
- return tdesc_powerpc_altivec64l;
- else
- return tdesc_powerpc_64l;
-
+ features.wordsize = 8;
+ break;
default:
return NULL;
}
+
+ if (cell)
+ features.cell = true;
+
+ if (altivec)
+ features.altivec = true;
+
+ if (vsx)
+ features.vsx = true;
+
+ return ppc_linux_match_description (features);
}
/* Return 1 if PPC_ORIG_R3_REGNUM and PPC_TRAP_REGNUM are usable. */
int ppc_linux_trap_reg_p (struct gdbarch *gdbarch);
-/* Linux target descriptions. */
-extern struct target_desc *tdesc_powerpc_32l;
-extern struct target_desc *tdesc_powerpc_altivec32l;
-extern struct target_desc *tdesc_powerpc_cell32l;
-extern struct target_desc *tdesc_powerpc_vsx32l;
-extern struct target_desc *tdesc_powerpc_isa205_32l;
-extern struct target_desc *tdesc_powerpc_isa205_altivec32l;
-extern struct target_desc *tdesc_powerpc_isa205_vsx32l;
-extern struct target_desc *tdesc_powerpc_e500l;
-extern struct target_desc *tdesc_powerpc_64l;
-extern struct target_desc *tdesc_powerpc_altivec64l;
-extern struct target_desc *tdesc_powerpc_cell64l;
-extern struct target_desc *tdesc_powerpc_vsx64l;
-extern struct target_desc *tdesc_powerpc_isa205_64l;
-extern struct target_desc *tdesc_powerpc_isa205_altivec64l;
-extern struct target_desc *tdesc_powerpc_isa205_vsx64l;
-
#endif /* PPC_LINUX_TDEP_H */