]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390x: Fix disassembly for various insns (BZ 495817)
authorFlorian Krohm <flo2030@eich-krohm.de>
Wed, 26 Mar 2025 18:32:12 +0000 (18:32 +0000)
committerFlorian Krohm <flo2030@eich-krohm.de>
Wed, 26 Mar 2025 18:32:12 +0000 (18:32 +0000)
Specifically: KMA, KMCTR, CU12, CU14, CU21, CU24, LCBB, TRE,
TROO, TROT, TRTO, TRTT

Part of fixing https://bugs.kde.org/show_bug.cgi?id=495817

VEX/priv/guest_s390_toIR.c
VEX/priv/s390_disasm.c

index 835d81dd76d180558f505fb7abb0f45d2bb98e22..f8caf53164eb337b863a3a252d6215395bd72a4a 100644 (file)
@@ -58,6 +58,8 @@ static const HChar *s390_irgen_VCGD(UChar, UChar, UChar, UChar, UChar);
 static const HChar *s390_irgen_VCDG(UChar, UChar, UChar, UChar, UChar);
 static const HChar *s390_irgen_VCDLG(UChar, UChar, UChar, UChar, UChar);
 static const HChar *s390_irgen_VCLGD(UChar, UChar, UChar, UChar, UChar);
+static const HChar *s390_irgen_KMA(UChar, UChar, UChar);
+static const HChar *s390_irgen_KMCTR(UChar, UChar, UChar);
 
 /*------------------------------------------------------------*/
 /*--- Globals                                              ---*/
@@ -3061,7 +3063,7 @@ s390_format_RRF_M0RERE(const HChar *(*irgen)(UChar m3, UChar r1, UChar r2),
    const HChar *mnm = irgen(m3, r1, r2);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
-      S390_DISASM(MNM(mnm), GPR(r1), GPR(r2), UINT(m3));
+      S390_DISASM(XMNM(mnm, mask0_disasm), GPR(r1), GPR(r2), MASK(m3));
 }
 
 static void
@@ -3208,8 +3210,12 @@ s390_format_RRF_R0RR2(const HChar *(*irgen)(UChar r3, UChar r1, UChar r2),
 {
    const HChar *mnm = irgen(r3, r1, r2);
 
-   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
-      S390_DISASM(MNM(mnm), GPR(r1), GPR(r2), GPR(r3));
+   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE)) {
+      if (irgen == s390_irgen_KMA || irgen == s390_irgen_KMCTR)
+         S390_DISASM(MNM(mnm), GPR(r1), GPR(r3), GPR(r2));
+      else
+         S390_DISASM(MNM(mnm), GPR(r1), GPR(r2), GPR(r3));
+   }
 }
 
 static void
@@ -3475,7 +3481,7 @@ s390_format_RXE_RRRDR(const HChar *(*irgen)(UChar r1, IRTemp op2addr, UChar m3),
    mnm = irgen(r1, op2addr, m3);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
-      S390_DISASM(MNM(mnm), GPR(r1), UDXB(d2, x2, b2));
+      S390_DISASM(MNM(mnm), GPR(r1), UDXB(d2, x2, b2), UINT(m3));
 }
 
 static void
@@ -20627,7 +20633,7 @@ s390_decode_4byte_and_irgen(const UChar *bytes)
                                  goto ok;
    case 0xb29d: s390_format_S_RD(s390_irgen_LFPC, S_b2(ovl), S_d2(ovl));
                                  goto ok;
-   case 0xb2a5: s390_format_RRE_FF(s390_irgen_TRE, RRE_r1(ovl), RRE_r2(ovl));  goto ok;
+   case 0xb2a5: s390_format_RRE_RR(s390_irgen_TRE, RRE_r1(ovl), RRE_r2(ovl));  goto ok;
    case 0xb2a6: s390_format_RRF_M0RERE(s390_irgen_CU21, RRF3_r3(ovl),
                                        RRF3_r1(ovl), RRF3_r2(ovl));
       goto ok;
index d55ca5b79114a3d031cb30a21f9ce3a67a36e645..3812de0e9a97523812a6310f639a41e7d323da02 100644 (file)
@@ -457,6 +457,11 @@ mask0_disasm(const s390_opnd *opnds, HChar *p)
 
    const HChar *mnm = opnds[0].xmnm.base;
 
+   if (vex_streq(mnm, "cu12") && opnds[unique_mask_index(opnds)].mask == 0)
+      mnm = "cutfu";
+   if (vex_streq(mnm, "cu21") && opnds[unique_mask_index(opnds)].mask == 0)
+      mnm = "cuutf";
+
    return s390_disasm_aux(opnds, mnm, p, mask0_mh);
 }