diff options
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/arch/ppc-linux-common.c | 2 | ||||
-rw-r--r-- | gdb/arch/ppc-linux-common.h | 2 | ||||
-rw-r--r-- | gdb/ppc-linux-nat.c | 10 | ||||
-rw-r--r-- | gdb/ppc-linux-tdep.c | 7 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/powerpc-fpscr-gcore.exp | 93 |
7 files changed, 126 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index db8a6a7..ff5e0a2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,20 @@ 2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com> + * arch/ppc-linux-common.c (ppc_linux_has_isa205): Change the + parameter type to CORE_ADDR. + * arch/ppc-linux-common.h (ppc_linux_has_isa205): Change the + parameter type in declaration to CORE_ADDR. + * ppc-linux-tdep.c (ppc_linux_core_read_description): Call + target_auxv_search to get AT_HWCAP and use the result to get the + target description. + * ppc-linux-nat.c (ppc_linux_get_hwcap): Change the return type + to CORE_ADDR. Remove the cast of the return value to unsigned + long. Fix error predicate of target_auxv_search. + (ppc_linux_nat_target::read_description): Change the type of the + hwcap variable to CORE_ADDR. + +2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com> + * rs6000-tdep.c (rs6000_gdbarch_init): Assign 1 to have_dfp only if the size of fpscr is larger than 32 bits. diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c index 87ccc42..45da105 100644 --- a/gdb/arch/ppc-linux-common.c +++ b/gdb/arch/ppc-linux-common.c @@ -31,7 +31,7 @@ #endif bool -ppc_linux_has_isa205 (unsigned long hwcap) +ppc_linux_has_isa205 (CORE_ADDR 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 diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h index 798781c..2f535e8 100644 --- a/gdb/arch/ppc-linux-common.h +++ b/gdb/arch/ppc-linux-common.h @@ -32,7 +32,7 @@ struct target_desc; #define PPC_LINUX_SIZEOF_VSXREGSET 256 /* Check if the hwcap auxv entry indicates that isa205 is supported. */ -bool ppc_linux_has_isa205 (unsigned long hwcap); +bool ppc_linux_has_isa205 (CORE_ADDR hwcap); /* Features used to determine the target description. */ struct ppc_linux_features diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c index 0f7dd4c..eb21f91 100644 --- a/gdb/ppc-linux-nat.c +++ b/gdb/ppc-linux-nat.c @@ -1165,15 +1165,15 @@ store_ppc_registers (const struct regcache *regcache, int tid) } /* Fetch the AT_HWCAP entry from the aux vector. */ -static unsigned long +static CORE_ADDR ppc_linux_get_hwcap (void) { CORE_ADDR field; - if (target_auxv_search (target_stack, AT_HWCAP, &field)) - return (unsigned long) field; + if (target_auxv_search (target_stack, AT_HWCAP, &field) != 1) + return 0; - return 0; + return field; } /* The cached DABR value, to install in new threads. @@ -2236,7 +2236,7 @@ ppc_linux_nat_target::read_description () features.wordsize = ppc_linux_target_wordsize (tid); - unsigned long hwcap = ppc_linux_get_hwcap (); + CORE_ADDR hwcap = ppc_linux_get_hwcap (); if (have_ptrace_getsetvsxregs && (hwcap & PPC_FEATURE_HAS_VSX)) diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index 293353a..5716f82 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -1058,6 +1058,13 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, if (vsx) features.vsx = true; + CORE_ADDR hwcap; + + if (target_auxv_search (target, AT_HWCAP, &hwcap) != 1) + hwcap = 0; + + features.isa205 = ppc_linux_has_isa205 (hwcap); + return ppc_linux_match_description (features); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 82ab864..208939b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com> + * gdb.arch/powerpc-fpscr-gcore.exp: New file. + +2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com> + * gdb.arch/powerpc-vsx-gcore.exp: New file. 2018-05-18 Tom Tromey <tom@tromey.com> diff --git a/gdb/testsuite/gdb.arch/powerpc-fpscr-gcore.exp b/gdb/testsuite/gdb.arch/powerpc-fpscr-gcore.exp new file mode 100644 index 0000000..d5db532 --- /dev/null +++ b/gdb/testsuite/gdb.arch/powerpc-fpscr-gcore.exp @@ -0,0 +1,93 @@ +# Copyright (C) 2018 Free Software Foundation, Inc. +# +# 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/>. + +# This file is part of the gdb testsuite. + +# This tests checks that generating and loading a core file preserves +# the correct FPSCR size. + +if {![istarget "powerpc*-*-linux*"]} then { + verbose "Skipping PowerPC test for corefiles with FPSCR." + return +} + +standard_testfile .c + +set gen_src [standard_output_file $srcfile] + +gdb_produce_source $gen_src { + int main() { + return 0; + } +} + +if {[build_executable "compile" $binfile $gen_src] == -1} { + return -1 +} + +clean_restart $binfile + +if ![runto_main] then { + fail "could not run to main" + return -1 +} + +# Check if our target has FPSCR +proc check_fpscr_access {} { + global gdb_prompt + + set test "fpscr register access" + gdb_test_multiple "info reg fpscr" "$test" { + -re "Invalid register.*\r\n$gdb_prompt $" { + unsupported "$test" + return 0 + } + -re "\r\nfpscr.*\r\n$gdb_prompt $" { + pass "$test" + return 1 + } + } + return 0 +} + +if { ![check_fpscr_access] } { + return -1 +} + +set fpscr_size_process [get_integer_valueof "sizeof(\$fpscr)" -1] + +set core_filename [standard_output_file "$testfile.core"] +set core_generated [gdb_gcore_cmd "$core_filename" "generate core file"] + +if { !$core_generated } { + return -1 +} + +clean_restart + +set core_loaded [gdb_core_cmd "$core_filename" "load core file"] + +if { $core_loaded != 1 } { + return -1 +} + +set fpscr_size_corefile [get_integer_valueof "sizeof(\$fpscr)" -2] + +set test "fpscr size matches" +if {$fpscr_size_process == $fpscr_size_corefile} { + pass $test +} else { + fail $test +} |