[commit, s390] Fix regression in gdb.base/callfuncs.exp [Re: [commit, s390] Proper handling of PSW address/mask everywhere]

Ulrich Weigand uweigand@de.ibm.com
Mon Dec 19 22:39:00 GMT 2011


Jan Kratochvil wrote:

> On Wed, 30 Nov 2011 17:09:25 +0100, Ulrich Weigand wrote:
> > Tested with no regression on s390x-ibm-linux (with -m31 and -m64) and
> > on s390-ibm-linux, all both native and gdbserver.  Fixes the above
> > step-resume-infcall.exp regressions.
> 
> I see a regression for s390x with -m31, RHEL-6.2, kernel-2.6.32-220.el6.s390x.

Interesting, I had tested with a current kernel where I don't see that regression.
But I do see it with an older kernel as well ...

>  return 7
>  Make add return now? (y or n) y
> -#0  main () at ./gdb.base/callfuncs.c:655
> -655      t_structs_c(struct_val1);
> -(gdb) PASS: gdb.base/callfuncs.exp: back at main after return from call dummy breakpoint
> +Couldn't write registers: Invalid argument.
> +(gdb) FAIL: gdb.base/callfuncs.exp: back at main after return from call dummy breakpoint
> 
> GDB reads PC as 0x8aaabbbb and triess to write it back as 0x0aaabbbb.
> 
> I rather did not try to fix it.
> 
> #0  error (string=0x80d7b3aa "%s.") at utils.c:810
> #1  in perror_with_name (string=0x80daa600 "Couldn't write registers") at utils.c:1195
> #2  in store_regs (regcache=0x8cb90eb0, tid=51221, regnum=1) at s390-nat.c:269
> #3  in s390_linux_store_inferior_registers (ops=0x8c8ca340, regcache=0x8cb90eb0, regnum=1) at s390-nat.c:411
> #4  in target_store_registers (regcache=0x8cb90eb0, regno=1) at target.c:3585
> #5  in regcache_raw_write (regcache=0x8cb90eb0, regnum=1, buf=0x3ffff8d2b20 "") at regcache.c:877
> #6  in regcache_cooked_write (regcache=0x8cb90eb0, regnum=1, buf=0x3ffff8d2b20 "") at regcache.c:889
> #7  in regcache_restore (dst=0x8cb90eb0, cooked_read=0x8033a870 <do_cooked_read>, cooked_read_context=0x8cc55e80) at regcache.c:358
> #8  in regcache_cpy (dst=0x8cb90eb0, src=0x8cc55e80) at regcache.c:382
> #9  in frame_pop (this_frame=0x8c9350e8) at frame.c:835
> #10 in return_command (retval_exp=0x8c709777 "7", from_tty=0) at stack.c:2402

Looks like there is a place where I forgot to preserve the addressing mode bit.
Fixed by the following patch.

Tested with no regression (fixing the callfuncs.exp one) on s390x (-m31,-m64).
Committed to mainline and 7.4 branch.

Bye,
Ulrich


ChangeLog:

	* s390-tdep.c (s390_push_dummy_call): Set addressing mode bit
	in return PSWA.

Index: gdb/s390-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/s390-tdep.c,v
retrieving revision 1.201
diff -u -p -r1.201 s390-tdep.c
--- gdb/s390-tdep.c	7 Dec 2011 13:31:05 -0000	1.201
+++ gdb/s390-tdep.c	19 Dec 2011 20:59:28 -0000
@@ -2749,9 +2749,15 @@ s390_push_dummy_call (struct gdbarch *gd
       }
   }
 
-  /* Store return address.  */
+  /* Store return PSWA.  In 31-bit mode, keep addressing mode bit.  */
+  if (word_size == 4)
+    {
+      ULONGEST pswa;
+      regcache_cooked_read_unsigned (regcache, S390_PSWA_REGNUM, &pswa);
+      bp_addr = (bp_addr & 0x7fffffff) | (pswa & 0x80000000);
+    }
   regcache_cooked_write_unsigned (regcache, S390_RETADDR_REGNUM, bp_addr);
-  
+
   /* Store updated stack pointer.  */
   regcache_cooked_write_unsigned (regcache, S390_SP_REGNUM, sp);
 


-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com



More information about the Gdb-patches mailing list