diff options
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 22 | ||||
-rw-r--r-- | gdb/gdbserver/Makefile.in | 1 | ||||
-rw-r--r-- | gdb/gdbserver/configure.srv | 1 | ||||
-rw-r--r-- | gdb/gdbserver/linux-ppc-ipa.c | 3 | ||||
-rw-r--r-- | gdb/gdbserver/linux-ppc-low.c | 75 | ||||
-rw-r--r-- | gdb/gdbserver/linux-ppc-tdesc-init.h (renamed from gdb/gdbserver/linux-ppc-tdesc.h) | 15 |
6 files changed, 55 insertions, 62 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index c577b3d..7d2281b 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,25 @@ +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 diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index c377378..675faa4 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -196,6 +196,7 @@ SFILES = \ $(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 \ diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index ffeefb9..7153ff3 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -225,6 +225,7 @@ case "${target}" in 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" diff --git a/gdb/gdbserver/linux-ppc-ipa.c b/gdb/gdbserver/linux-ppc-ipa.c index c993e76..f6861f0 100644 --- a/gdb/gdbserver/linux-ppc-ipa.c +++ b/gdb/gdbserver/linux-ppc-ipa.c @@ -21,7 +21,8 @@ #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> diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c index 36bd373..5361baf 100644 --- a/gdb/gdbserver/linux-ppc-low.c +++ b/gdb/gdbserver/linux-ppc-low.c @@ -23,8 +23,10 @@ #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" @@ -617,6 +619,10 @@ static void 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; @@ -634,57 +640,33 @@ ppc_arch_setup (void) 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. */ @@ -707,6 +689,7 @@ ppc_arch_setup (void) ppc_regmap_adjusted = 1; } #endif + current_process ()->tdesc = tdesc; } diff --git a/gdb/gdbserver/linux-ppc-tdesc.h b/gdb/gdbserver/linux-ppc-tdesc-init.h index 4a561f5..422e7bd 100644 --- a/gdb/gdbserver/linux-ppc-tdesc.h +++ b/gdb/gdbserver/linux-ppc-tdesc-init.h @@ -36,35 +36,27 @@ enum ppc_linux_tdesc { /* 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 @@ -72,30 +64,23 @@ extern const struct target_desc *tdesc_powerpc_e500l; /* 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 |