Blame SOURCES/gdb-rhbz1420304-s390x-32of35.patch

e1d87d
commit 55efceabc6149e96134c10676adb2b1e79e0ae13
e1d87d
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
e1d87d
Date:   Thu Jul 13 20:17:03 2017 +0200
e1d87d
e1d87d
    S390: Add record/replay support for arch12 instructions
e1d87d
    
e1d87d
    Support record/replay of the z/Architecture instructions that were
e1d87d
    introduced with arch12.
e1d87d
    
e1d87d
    gdb/ChangeLog:
e1d87d
    
e1d87d
            * s390-linux-tdep.c (s390_process_record): Add support for
e1d87d
            instructions new in arch12.
e1d87d
e1d87d
### a/gdb/ChangeLog
e1d87d
### b/gdb/ChangeLog
e1d87d
## -1,3 +1,8 @@
e1d87d
+2017-07-13  Andreas Arnez  <arnez@linux.vnet.ibm.com>
e1d87d
+
e1d87d
+	* s390-linux-tdep.c (s390_process_record): Add support for
e1d87d
+	instructions new in arch12.
e1d87d
+
e1d87d
 2017-07-11  John Baldwin  <jhb@FreeBSD.org>
e1d87d
 
e1d87d
 	* amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use
e1d87d
--- a/gdb/s390-linux-tdep.c
e1d87d
+++ b/gdb/s390-linux-tdep.c
e1d87d
@@ -4992,6 +4992,8 @@ ex:
e1d87d
         case 0xb9e9: /* SGRK - subtract */
e1d87d
         case 0xb9ea: /* ALGRK - add logical */
e1d87d
         case 0xb9eb: /* SLGRK - subtract logical */
e1d87d
+	case 0xb9ed: /* MSGRKC - multiply single 64x64 -> 64 */
e1d87d
+	case 0xb9fd: /* MSRKC - multiply single 32x32 -> 32 */
e1d87d
           /* 64-bit gpr destination + flags */
e1d87d
           if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
e1d87d
             return -1;
e1d87d
@@ -5019,7 +5021,7 @@ ex:
e1d87d
         case 0xb914: /* LGFR - load */
e1d87d
         case 0xb916: /* LLGFR - load logical */
e1d87d
         case 0xb917: /* LLGTR - load logical thirty one bits */
e1d87d
-        case 0xb91c: /* MSGFR - load */
e1d87d
+	case 0xb91c: /* MSGFR - multiply single 64<32 */
e1d87d
         case 0xb946: /* BCTGR - branch on count */
e1d87d
         case 0xb984: /* LLGCR - load logical character */
e1d87d
         case 0xb985: /* LLGHR - load logical halfword */
e1d87d
@@ -5038,6 +5040,7 @@ ex:
e1d87d
         case 0xb91d: /* DSGFR - divide single */
e1d87d
         case 0xb986: /* MLGR - multiply logical */
e1d87d
         case 0xb987: /* DLGR - divide logical */
e1d87d
+	case 0xb9ec: /* MGRK - multiply 64x64 -> 128 */
e1d87d
           /* 64-bit gpr pair destination  */
e1d87d
           if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
e1d87d
             return -1;
e1d87d
@@ -5106,8 +5109,8 @@ ex:
e1d87d
         /* 0xb922-0xb924 undefined */
e1d87d
         /* 0xb925 privileged */
e1d87d
         /* 0xb928 privileged */
e1d87d
-        /* 0xb929 undefined */
e1d87d
 
e1d87d
+	case 0xb929: /* KMA - cipher message with authentication */
e1d87d
         case 0xb92a: /* KMF - cipher message with cipher feedback [partial] */
e1d87d
         case 0xb92b: /* KMO - cipher message with output feedback [partial] */
e1d87d
         case 0xb92f: /* KMC - cipher message with chaining [partial] */
e1d87d
@@ -5170,6 +5173,15 @@ ex:
e1d87d
               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
e1d87d
                 return -1;
e1d87d
             }
e1d87d
+	  if (tmp != 0 && insn[0] == 0xb929)
e1d87d
+	    {
e1d87d
+	      if (record_full_arch_list_add_reg (regcache,
e1d87d
+						 S390_R0_REGNUM + inib[4]))
e1d87d
+		return -1;
e1d87d
+	      if (record_full_arch_list_add_reg (regcache,
e1d87d
+						 S390_R0_REGNUM + (inib[4] | 1)))
e1d87d
+		return -1;
e1d87d
+	    }
e1d87d
           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
e1d87d
             return -1;
e1d87d
           break;
e1d87d
@@ -5571,10 +5583,11 @@ ex:
e1d87d
 
e1d87d
         /* 0xb9e3 undefined */
e1d87d
         /* 0xb9e5 undefined */
e1d87d
-        /* 0xb9ec-0xb9f1 undefined */
e1d87d
+	/* 0xb9ee-0xb9f1 undefined */
e1d87d
         /* 0xb9f3 undefined */
e1d87d
         /* 0xb9f5 undefined */
e1d87d
-        /* 0xb9fc-0xb9ff undefined */
e1d87d
+	/* 0xb9fc undefined */
e1d87d
+	/* 0xb9fe -0xb9ff undefined */
e1d87d
 
e1d87d
         default:
e1d87d
           goto UNKNOWN_OP;
e1d87d
@@ -5962,6 +5975,7 @@ ex:
e1d87d
       break;
e1d87d
 
e1d87d
     case 0xe3:
e1d87d
+    case 0xe6:
e1d87d
     case 0xe7:
e1d87d
     case 0xeb:
e1d87d
     case 0xed:
e1d87d
@@ -6006,6 +6020,7 @@ ex:
e1d87d
         case 0xe31c: /* MSGF - multiply single */
e1d87d
         case 0xe32a: /* LZRG - load and zero rightmost byte */
e1d87d
         case 0xe33a: /* LLZRGF - load logical and zero rightmost byte */
e1d87d
+	case 0xe33c: /* MGH - multiply halfword 64x16mem -> 64 */
e1d87d
         case 0xe346: /* BCTG - branch on count */
e1d87d
         case 0xe377: /* LGB - load byte */
e1d87d
         case 0xe390: /* LLGC - load logical character */
e1d87d
@@ -6036,6 +6051,7 @@ ex:
e1d87d
 
e1d87d
         case 0xe30d: /* DSG - divide single */
e1d87d
         case 0xe31d: /* DSGF - divide single */
e1d87d
+	case 0xe384: /* MG - multiply 64x64mem -> 128 */
e1d87d
         case 0xe386: /* MLG - multiply logical */
e1d87d
         case 0xe387: /* DLG - divide logical */
e1d87d
         case 0xe38f: /* LPQ - load pair from quadword */
e1d87d
@@ -6057,6 +6073,9 @@ ex:
e1d87d
         /* 0xe310-0xe311 undefined */
e1d87d
 
e1d87d
         case 0xe312: /* LT - load and test */
e1d87d
+	case 0xe338: /* AGH - add halfword to 64 bit value */
e1d87d
+	case 0xe339: /* SGH - subtract halfword from 64 bit value */
e1d87d
+	case 0xe353: /* MSC - multiply single 32x32mem -> 32 */
e1d87d
         case 0xe354: /* NY - and */
e1d87d
         case 0xe356: /* OY - or */
e1d87d
         case 0xe357: /* XY - xor */
e1d87d
@@ -6066,13 +6085,14 @@ ex:
e1d87d
         case 0xe35f: /* SLY - subtract logical */
e1d87d
         case 0xe37a: /* AHY - add halfword */
e1d87d
         case 0xe37b: /* SHY - subtract halfword */
e1d87d
+	case 0xe383: /* MSGC - multiply single 64x64mem -> 64 */
e1d87d
         case 0xe398: /* ALC - add logical with carry */
e1d87d
         case 0xe399: /* SLB - subtract logical with borrow */
e1d87d
         case 0xe727: /* LCBB - load count to block bounduary */
e1d87d
         case 0xeb81: /* ICMY - insert characters under mask */
e1d87d
         case 0xebdc: /* SRAK - shift left single */
e1d87d
         case 0xebdd: /* SLAK - shift left single */
e1d87d
-          /* 32-bit gpr destination + flags */
e1d87d
+	  /* 32/64-bit gpr destination + flags */
e1d87d
           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
e1d87d
             return -1;
e1d87d
           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
e1d87d
@@ -6160,7 +6180,7 @@ ex:
e1d87d
         case 0xe336: /* PFD - prefetch data */
e1d87d
           break;
e1d87d
 
e1d87d
-        /* 0xe337-0xe339 undefined */
e1d87d
+	/* 0xe337 undefined */
e1d87d
         /* 0xe33c-0xe33d undefined */
e1d87d
 
e1d87d
         case 0xe33e: /* STRV - store reversed */
e1d87d
@@ -6183,8 +6203,12 @@ ex:
e1d87d
           break;
e1d87d
 
e1d87d
         /* 0xe340-0xe345 undefined */
e1d87d
-        /* 0xe347-0xe34f undefined */
e1d87d
-        /* 0xe352-0xe353 undefined */
e1d87d
+
e1d87d
+	case 0xe347: /* BIC - branch indirect on condition */
e1d87d
+	  break;
e1d87d
+
e1d87d
+	/* 0xe348-0xe34f undefined */
e1d87d
+	/* 0xe352 undefined */
e1d87d
 
e1d87d
         case 0xe35c: /* MFY - multiply */
e1d87d
         case 0xe396: /* ML - multiply logical */
e1d87d
@@ -6216,11 +6240,12 @@ ex:
e1d87d
           break;
e1d87d
 
e1d87d
         /* 0xe37d-0xe37f undefined */
e1d87d
-        /* 0xe383-0xe384 undefined */
e1d87d
 
e1d87d
         case 0xe385: /* LGAT - load and trap */
e1d87d
         case 0xe39c: /* LLGTAT - load logical thirty one bits and trap */
e1d87d
         case 0xe39d: /* LLGFAT - load logical and trap */
e1d87d
+	case 0xe650: /* VCVB - vector convert to binary 32 bit*/
e1d87d
+	case 0xe652: /* VCVBG - vector convert to binary 64 bit*/
e1d87d
         case 0xe721: /* VLGV - vector load gr from vr element */
e1d87d
           /* 64-bit gpr destination + fpc for possible DXC write */
e1d87d
           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
e1d87d
@@ -6271,6 +6296,10 @@ ex:
e1d87d
         /* 0xe3ce undefined */
e1d87d
         /* 0xe3d0-0xe3ff undefined */
e1d87d
 
e1d87d
+	case 0xe634: /* VPKZ - vector pack zoned */
e1d87d
+	case 0xe635: /* VLRL - vector load rightmost with immed. length */
e1d87d
+	case 0xe637: /* VLRLR - vector load rightmost with length */
e1d87d
+	case 0xe649: /* VLIP - vector load immediate decimal */
e1d87d
         case 0xe700: /* VLEB - vector load element */
e1d87d
         case 0xe701: /* VLEH - vector load element */
e1d87d
         case 0xe702: /* VLEG - vector load element */
e1d87d
@@ -6311,7 +6340,10 @@ ex:
e1d87d
         case 0xe769: /* VNC - vector and with complement */
e1d87d
         case 0xe76a: /* VO - vector or */
e1d87d
         case 0xe76b: /* VNO - vector nor */
e1d87d
+	case 0xe76c: /* VNX - vector not exclusive or */
e1d87d
         case 0xe76d: /* VX - vector xor */
e1d87d
+	case 0xe76e: /* VNN - vector nand */
e1d87d
+	case 0xe76f: /* VOC - vector or with complement */
e1d87d
         case 0xe770: /* VESLV - vector element shift left */
e1d87d
         case 0xe772: /* VERIM - vector element rotate and insert under mask */
e1d87d
         case 0xe773: /* VERLLV - vector element rotate left logical */
e1d87d
@@ -6325,11 +6357,14 @@ ex:
e1d87d
         case 0xe77e: /* VSRA - vector shift right arithmetic */
e1d87d
         case 0xe77f: /* VSRAB - vector shift right arithmetic by byte */
e1d87d
         case 0xe784: /* VPDI - vector permute doubleword immediate */
e1d87d
+	case 0xe785: /* VBPERM - vector bit permute */
e1d87d
         case 0xe78c: /* VPERM - vector permute */
e1d87d
         case 0xe78d: /* VSEL - vector select */
e1d87d
         case 0xe78e: /* VFMS - vector fp multiply and subtract */
e1d87d
         case 0xe78f: /* VFMA - vector fp multiply and add */
e1d87d
         case 0xe794: /* VPK - vector pack */
e1d87d
+	case 0xe79e: /* VFNMS - vector fp negative multiply and subtract */
e1d87d
+	case 0xe79f: /* VFNMA - vector fp negative multiply and add */
e1d87d
         case 0xe7a1: /* VMLH - vector multiply logical high */
e1d87d
         case 0xe7a2: /* VML - vector multiply low */
e1d87d
         case 0xe7a3: /* VMH - vector multiply high */
e1d87d
@@ -6345,6 +6380,7 @@ ex:
e1d87d
         case 0xe7ae: /* VMAE - vector multiply and add even */
e1d87d
         case 0xe7af: /* VMAO - vector multiply and add odd */
e1d87d
         case 0xe7b4: /* VGFM - vector Galois field multiply sum */
e1d87d
+	case 0xe7b8: /* VMSL - vector multiply sum logical */
e1d87d
         case 0xe7b9: /* VACCC - vector add with carry compute carry */
e1d87d
         case 0xe7bb: /* VAC - vector add with carry */
e1d87d
         case 0xe7bc: /* VGFMA - vector Galois field multiply sum and accumulate */
e1d87d
@@ -6354,8 +6390,8 @@ ex:
e1d87d
         case 0xe7c1: /* VCDLG - vector convert from logical 64-bit */
e1d87d
         case 0xe7c2: /* VCGD - vector convert to fixed 64-bit */
e1d87d
         case 0xe7c3: /* VCDG - vector convert from fixed 64-bit */
e1d87d
-        case 0xe7c4: /* VLDE - vector fp load lengthened */
e1d87d
-        case 0xe7c5: /* VLED - vector fp load rounded */
e1d87d
+	case 0xe7c4: /* VLDE/VFLL - vector fp load lengthened */
e1d87d
+	case 0xe7c5: /* VLED/VFLR - vector fp load rounded */
e1d87d
         case 0xe7c7: /* VFI - vector load fp integer */
e1d87d
         case 0xe7cc: /* VFPSO - vector fp perform sign operation */
e1d87d
         case 0xe7ce: /* VFSQ - vector fp square root */
e1d87d
@@ -6369,6 +6405,8 @@ ex:
e1d87d
         case 0xe7e3: /* VFA - vector fp add */
e1d87d
         case 0xe7e5: /* VFD - vector fp divide */
e1d87d
         case 0xe7e7: /* VFM - vector fp multiply */
e1d87d
+	case 0xe7ee: /* VFMIN - vector fp minimum */
e1d87d
+	case 0xe7ef: /* VFMAX - vector fp maximum */
e1d87d
         case 0xe7f0: /* VAVGL - vector average logical */
e1d87d
         case 0xe7f1: /* VACC - vector add and compute carry */
e1d87d
         case 0xe7f2: /* VAVG - vector average */
e1d87d
@@ -6386,6 +6424,14 @@ ex:
e1d87d
             return -1;
e1d87d
           break;
e1d87d
 
e1d87d
+	case 0xe63d: /* VSTRL - vector store rightmost with immed. length */
e1d87d
+	  oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
e1d87d
+	  if (record_full_arch_list_add_mem (oaddr, inib[3] + 1))
e1d87d
+	    return -1;
e1d87d
+	  if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
e1d87d
+	    return -1;
e1d87d
+	  break;
e1d87d
+
e1d87d
         case 0xe708: /* VSTEB - vector store element */
e1d87d
           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
e1d87d
           if (record_full_arch_list_add_mem (oaddr, 1))
e1d87d
@@ -6480,13 +6526,22 @@ ex:
e1d87d
             return -1;
e1d87d
           break;
e1d87d
 
e1d87d
+	case 0xe63c: /* VUPKZ - vector unpack zoned */
e1d87d
+	  oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
e1d87d
+	  if (record_full_arch_list_add_mem (oaddr, (ibyte[1] + 1) & 31))
e1d87d
+	    return -1;
e1d87d
+	  if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
e1d87d
+	    return -1;
e1d87d
+	  break;
e1d87d
+
e1d87d
+	case 0xe63f: /* VSTRLR - vector store rightmost with length */
e1d87d
         case 0xe73f: /* VSTL - vector store with length */
e1d87d
           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
e1d87d
           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[3], &tmp);
e1d87d
           tmp &= 0xffffffffu;
e1d87d
-          if (tmp > 16)
e1d87d
-            tmp = 16;
e1d87d
-          if (record_full_arch_list_add_mem (oaddr, tmp))
e1d87d
+	  if (tmp > 15)
e1d87d
+	    tmp = 15;
e1d87d
+	  if (record_full_arch_list_add_mem (oaddr, tmp + 1))
e1d87d
             return -1;
e1d87d
           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
e1d87d
             return -1;
e1d87d
@@ -6494,6 +6549,17 @@ ex:
e1d87d
 
e1d87d
         /* 0xe747-0xe749 undefined */
e1d87d
 
e1d87d
+	case 0xe658: /* VCVD - vector convert to decimal 32 bit */
e1d87d
+	case 0xe659: /* VSRP - vector shift and round decimal */
e1d87d
+	case 0xe65a: /* VCVDG - vector convert to decimal 64 bit*/
e1d87d
+	case 0xe65b: /* VPSOP - vector perform sign operation decimal */
e1d87d
+	case 0xe671: /* VAP - vector add decimal */
e1d87d
+	case 0xe673: /* VSP - vector subtract decimal */
e1d87d
+	case 0xe678: /* VMP - vector multiply decimal */
e1d87d
+	case 0xe679: /* VMSP - vector multiply decimal */
e1d87d
+	case 0xe67a: /* VDP - vector divide decimal */
e1d87d
+	case 0xe67b: /* VRP - vector remainder decimal */
e1d87d
+	case 0xe67e: /* VSDP - vector shift and divide decimal */
e1d87d
         case 0xe74a: /* VFTCI - vector fp test data class immediate */
e1d87d
         case 0xe75c: /* VISTR - vector isolate string */
e1d87d
         case 0xe780: /* VFEE - vector find element equal */
e1d87d
@@ -6504,7 +6570,7 @@ ex:
e1d87d
         case 0xe797: /* VPKS - vector pack saturate */
e1d87d
         case 0xe7e8: /* VFCE - vector fp compare equal */
e1d87d
         case 0xe7ea: /* VFCHE - vector fp compare high or equal */
e1d87d
-        case 0xe7eb: /* VFCE - vector fp compare high */
e1d87d
+	case 0xe7eb: /* VFCH - vector fp compare high */
e1d87d
         case 0xe7f8: /* VCEQ - vector compare equal */
e1d87d
         case 0xe7f9: /* VCHL - vector compare high logical */
e1d87d
         case 0xe7fb: /* VCH - vector compare high */
e1d87d
@@ -6517,6 +6583,14 @@ ex:
e1d87d
             return -1;
e1d87d
           break;
e1d87d
 
e1d87d
+	case 0xe65f: /* VTP - vector test decimal */
e1d87d
+	  /* flags + FPC */
e1d87d
+	  if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
e1d87d
+	    return -1;
e1d87d
+	  if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
e1d87d
+	    return -1;
e1d87d
+	  break;
e1d87d
+
e1d87d
         /* 0xe74b-0xe74c undefined */
e1d87d
         /* 0xe74e-0xe74f undefined */
e1d87d
         /* 0xe751 undefined */
e1d87d
@@ -6524,26 +6598,26 @@ ex:
e1d87d
         /* 0xe757-0xe75b undefined */
e1d87d
         /* 0xe75d-0xe75e undefined */
e1d87d
         /* 0xe763 undefined */
e1d87d
-        /* 0xe76c undefined */
e1d87d
-        /* 0xe76e-0xe76f undefined */
e1d87d
         /* 0xe771 undefined */
e1d87d
         /* 0xe776 undefined */
e1d87d
         /* 0xe779 undefined */
e1d87d
         /* 0xe77b undefined */
e1d87d
         /* 0xe783 undefined */
e1d87d
-        /* 0xe785-0xe789 undefined */
e1d87d
+	/* 0xe786-0xe789 undefined */
e1d87d
         /* 0xe78b undefined */
e1d87d
         /* 0xe790-0xe793 undefined */
e1d87d
         /* 0xe796 undefined */
e1d87d
-        /* 0xe798-0xe7a0 undefined */
e1d87d
-        /* 0xe7a8 undefined */
e1d87d
+	/* 0xe798-0xe79d undefined */
e1d87d
+	/* 0xe7a0 undefined */
e1d87d
+	/* 0xe7a8 undefined */
e1d87d
         /* 0xe7b0-0xe7b3 undefined */
e1d87d
-        /* 0xe7b5-0xe7b8 undefined */
e1d87d
+	/* 0xe7b5-0xe7b7 undefined */
e1d87d
         /* 0xe7ba undefined */
e1d87d
         /* 0xe7be undefined */
e1d87d
         /* 0xe7c6 undefined */
e1d87d
         /* 0xe7c8-0xe7c9 undefined */
e1d87d
 
e1d87d
+	case 0xe677: /* VCP - vector compare decimal */
e1d87d
         case 0xe7ca: /* WFK - vector fp compare and signal scalar */
e1d87d
         case 0xe7cb: /* WFC - vector fp compare scalar */
e1d87d
         case 0xe7d8: /* VTM - vector test under mask */
e1d87d
@@ -6568,7 +6642,7 @@ ex:
e1d87d
         /* 0xe7e4 undefined */
e1d87d
         /* 0xe7e6 undefined */
e1d87d
         /* 0xe7e9 undefined */
e1d87d
-        /* 0xe7ec-0xe7ef undefined */
e1d87d
+	/* 0xe7ec-0xe7ed undefined */
e1d87d
         /* 0xe7f4 undefined */
e1d87d
         /* 0xe7f6 undefined */
e1d87d
         /* 0xe7fa undefined */
e1d87d
@@ -7048,8 +7122,6 @@ ex:
e1d87d
         }
e1d87d
       break;
e1d87d
 
e1d87d
-    /* 0xe6 undefined */
e1d87d
-
e1d87d
     case 0xec:
e1d87d
       /* RIE/RIS/RRS-format instruction */
e1d87d
       switch (ibyte[0] << 8 | ibyte[5])