This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [PowerPC] Recognize isa205 in linux core files


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0ec848ad25bb77edd9c9c3c097c3dd5b8874a6c0

commit 0ec848ad25bb77edd9c9c3c097c3dd5b8874a6c0
Author: Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
Date:   Tue May 22 11:09:06 2018 -0300

    [PowerPC] Recognize isa205 in linux core files
    
    Currently the ppc linux core file target doesn't return target
    descriptions with the lager FPSCR introduced in isa205.
    
    This patch changes the core file target so that the auxv is read from
    the core file to determine the size of FPSCR, so that the appropriate
    target description is selected.
    
    gdb/ChangeLog:
    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.
    
    gdb/testsuite/ChangeLog:
    2018-05-22  Pedro Franco de Carvalho  <pedromfc@linux.vnet.ibm.com>
    
    	* gdb.arch/powerpc-fpscr-gcore.exp: New file.

Diff:
---
 gdb/ChangeLog                                  | 15 +++++
 gdb/arch/ppc-linux-common.c                    |  2 +-
 gdb/arch/ppc-linux-common.h                    |  2 +-
 gdb/ppc-linux-nat.c                            | 10 +--
 gdb/ppc-linux-tdep.c                           |  7 ++
 gdb/testsuite/ChangeLog                        |  4 ++
 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
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]