S390: Fix internal error with stackless inferior

Message ID m3egc118be.fsf@oc1027705133.ibm.com
State New, archived
Headers

Commit Message

Andreas Arnez Feb. 25, 2016, 8:51 a.m. UTC
  This fixes a GDB internal error that may occur when the inferior has no
valid stack pointer in r15.

gdb/testsuite/ChangeLog:

	* gdb.arch/s390-stackless.S: New.
	* gdb.arch/s390-stackless.exp: New.

gdb/ChangeLog:

	* s390-linux-tdep.c (s390_backchain_frame_unwind_cache): Avoid
	exception when attempting to access the inferior's backchain.
---
 gdb/s390-linux-tdep.c                     |  6 +++--
 gdb/testsuite/gdb.arch/s390-stackless.S   | 33 ++++++++++++++++++++++++++
 gdb/testsuite/gdb.arch/s390-stackless.exp | 39 +++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100644 gdb/testsuite/gdb.arch/s390-stackless.S
 create mode 100644 gdb/testsuite/gdb.arch/s390-stackless.exp
  

Comments

Andreas Arnez March 1, 2016, 11:49 a.m. UTC | #1
Pushed:

On Thu, Feb 25 2016, Andreas Arnez wrote:

> This fixes a GDB internal error that may occur when the inferior has no
> valid stack pointer in r15.
>
> gdb/testsuite/ChangeLog:
>
> 	* gdb.arch/s390-stackless.S: New.
> 	* gdb.arch/s390-stackless.exp: New.
>
> gdb/ChangeLog:
>
> 	* s390-linux-tdep.c (s390_backchain_frame_unwind_cache): Avoid
> 	exception when attempting to access the inferior's backchain.
  

Patch

diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
index 57e25b4..7f860b6 100644
--- a/gdb/s390-linux-tdep.c
+++ b/gdb/s390-linux-tdep.c
@@ -2180,7 +2180,7 @@  s390_backchain_frame_unwind_cache (struct frame_info *this_frame,
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR backchain;
   ULONGEST reg;
-  LONGEST sp;
+  LONGEST sp, tmp;
   int i;
 
   /* Set up ABI call-saved/call-clobbered registers.  */
@@ -2193,7 +2193,9 @@  s390_backchain_frame_unwind_cache (struct frame_info *this_frame,
 
   /* Get the backchain.  */
   reg = get_frame_register_unsigned (this_frame, S390_SP_REGNUM);
-  backchain = read_memory_unsigned_integer (reg, word_size, byte_order);
+  if (!safe_read_memory_integer (reg, word_size, byte_order, &tmp))
+    tmp = 0;
+  backchain = (CORE_ADDR) tmp;
 
   /* A zero backchain terminates the frame chain.  As additional
      sanity check, let's verify that the spill slot for SP in the
diff --git a/gdb/testsuite/gdb.arch/s390-stackless.S b/gdb/testsuite/gdb.arch/s390-stackless.S
new file mode 100644
index 0000000..77944ab
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/s390-stackless.S
@@ -0,0 +1,33 @@ 
+/* Copyright 2015-2016 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/>.  */
+
+	.text
+
+	.align	8
+	.globl  main
+	.type	main, @function
+	/* Ensure an invalid stack pointer and link register.  Don't
+	use zero, since that may be handled specially.  */
+main:	la	%r15,3(0,0)
+	la	%r14,1(0,0)
+	j	1f
+	.size	main, .-main
+
+	/* Outside any function.  */
+	.byte	0,1
+1:	st	%r15,0(%r15)
+	br	%r14
diff --git a/gdb/testsuite/gdb.arch/s390-stackless.exp b/gdb/testsuite/gdb.arch/s390-stackless.exp
new file mode 100644
index 0000000..b4aedb5
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/s390-stackless.exp
@@ -0,0 +1,39 @@ 
+# Copyright 2016 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 2 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/>.
+
+if {![istarget "s390*-*-*"]} then {
+    verbose "Skipping s390 stackless test."
+    return
+}
+
+standard_testfile .S
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+# Run until SIGSEGV.
+gdb_run_cmd
+
+set test "run until SIGSEGV"
+gdb_test_multiple "" $test {
+    -re "Program received signal SIGSEGV.*$gdb_prompt $" {
+	pass $test
+    }
+}
+
+# Ensure that 'info registers' works properly and does not generate
+# an internal-error.
+gdb_test "info registers" "r0.*" "info registers"