Blame SOURCES/gdb-rhbz1903375-s390x-store-on-condition.patch

0a406a
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
0a406a
From: Andreas Arnez <arnez@linux.ibm.com>
0a406a
Date: Thu, 19 Nov 2020 19:10:58 +0100
0a406a
Subject: gdb-rhbz1903375-s390x-store-on-condition.patch
0a406a
0a406a
;; Backport of "Correct recording of 'store on condition' insns"
0a406a
;; Andreas Arnaz (RH BZ 1903374)
0a406a
0a406a
gdb/s390: Correct recording of "store on condition" insns
0a406a
0a406a
The "store on condition" instructions STOC, STOCG, and STOCFH are recorded
0a406a
as if their instruction formats resembled that of STG.  This is wrong,
0a406a
usually resulting in "failed to record execution log" errors when trying
0a406a
to record code with any of these instructions.
0a406a
0a406a
This patch fixes the recording of these instructions.
0a406a
0a406a
gdb/ChangeLog:
0a406a
0a406a
	PR tdep/26916
0a406a
	* s390-tdep.c (s390_process_record): Fix recording of STOC, STOCG,
0a406a
	and STOCFH.
0a406a
0a406a
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
0a406a
--- a/gdb/s390-tdep.c
0a406a
+++ b/gdb/s390-tdep.c
0a406a
@@ -5382,7 +5382,6 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
0a406a
 	case 0xe325: /* NTSTG - nontransactional store */
0a406a
 	case 0xe326: /* CVDY - convert to decimal */
0a406a
 	case 0xe32f: /* STRVG - store reversed */
0a406a
-	case 0xebe3: /* STOCG - store on condition */
0a406a
 	case 0xed67: /* STDY - store */
0a406a
 	  oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
0a406a
 	  if (record_full_arch_list_add_mem (oaddr, 8))
0a406a
@@ -5411,8 +5410,6 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
0a406a
 	case 0xe33e: /* STRV - store reversed */
0a406a
 	case 0xe350: /* STY - store */
0a406a
 	case 0xe3cb: /* STFH - store high */
0a406a
-	case 0xebe1: /* STOCFH - store high on condition */
0a406a
-	case 0xebf3: /* STOC - store on condition */
0a406a
 	case 0xed66: /* STEY - store */
0a406a
 	  oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
0a406a
 	  if (record_full_arch_list_add_mem (oaddr, 4))
0a406a
@@ -6125,6 +6122,20 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
0a406a
 
0a406a
 	/* 0xeb9c-0xebbf undefined */
0a406a
 	/* 0xebc1-0xebdb undefined */
0a406a
+
0a406a
+	case 0xebe1: /* STOCFH - store high on condition */
0a406a
+	case 0xebf3: /* STOC - store on condition */
0a406a
+	  oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
0a406a
+	  if (record_full_arch_list_add_mem (oaddr, 4))
0a406a
+	    return -1;
0a406a
+	  break;
0a406a
+
0a406a
+	case 0xebe3: /* STOCG - store on condition */
0a406a
+	  oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
0a406a
+	  if (record_full_arch_list_add_mem (oaddr, 8))
0a406a
+	    return -1;
0a406a
+	  break;
0a406a
+
0a406a
 	/* 0xebe5 undefined */
0a406a
 	/* 0xebe9 undefined */
0a406a
 	/* 0xebeb-0xebf1 undefined */