]> sourceware.org Git - valgrind.git/commitdiff
s390x: Make z16 machine model known to Valgrind
authorAndreas Arnez <arnez@linux.ibm.com>
Fri, 29 Sep 2023 14:11:31 +0000 (16:11 +0200)
committerAndreas Arnez <arnez@linux.ibm.com>
Fri, 29 Sep 2023 14:11:31 +0000 (16:11 +0200)
The z16 machine model hasn't been fully introduced to Valgrind yet.  Add
the missing support:

* Add z16 to the list of machine models in each of `libvex.h',
  `tests/s390x_features.c', and `s390-check-opcodes.pl'.

* Starting with z16, the "store facility list extended" (STFLE)
  instruction can write four instead of three words.  Reflect this in the
  STFLE-helper and in the `stfle' test case.

* Pass the new STFLE-bits unchanged, except for the vector-packed-decimal
  facility, which is unsupported by Valgrind.

VEX/priv/guest_s390_helpers.c
VEX/pub/libvex.h
VEX/pub/libvex_s390x_common.h
auxprogs/s390-check-opcodes.pl
coregrind/m_machine.c
none/tests/s390x/Makefile.am
none/tests/s390x/stfle.c
none/tests/s390x/stfle.stdout.exp-z16 [new file with mode: 0644]
tests/s390x_features.c

index 95bb653274a87360e3072e917a1796beb38df6eb..df565ffa7fe2dec7b7a9133f3bc6a1745c1352b4 100644 (file)
@@ -324,8 +324,9 @@ s390_stfle_range(UInt lo, UInt hi)
 ULong
 s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, ULong *addr)
 {
-   ULong hoststfle[S390_NUM_FACILITY_DW], cc, num_dw, i;
-   register ULong reg0 asm("0") = guest_state->guest_r0 & 0xF;  /* r0[56:63] */
+   ULong hoststfle[S390_NUM_FACILITY_DW], cc, last_dw, i;
+   register ULong reg0 asm("0") = guest_state->guest_r0;
+   last_dw = reg0 & 0xf;
 
    /* Restrict to facilities that we know about and that we assume to be
       compatible with Valgrind.  Of course, in this way we may reject features
@@ -393,26 +394,31 @@ s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, ULong *addr)
        /* 157-167: unassigned */
        | s390_stfle_range(168, 168)
        /* 168-191: unassigned */ ),
-   };
-
-   /* We cannot store more than S390_NUM_FACILITY_DW
-      (and it makes not much sense to do so anyhow) */
-   if (reg0 > S390_NUM_FACILITY_DW - 1)
-      reg0 = S390_NUM_FACILITY_DW - 1;
 
-   num_dw = reg0 + 1;  /* number of double words written */
+      /* ===  192 .. 255  === */
+      /* 192: vector-packed-decimal, not supported */
+      (s390_stfle_range(193, 194)
+       /* 195: unassigned */
+       | s390_stfle_range(196, 197)),
+   };
 
-   asm volatile(" .insn s,0xb2b00000,%0\n"   /* stfle */
-                "ipm    %2\n"
-                "srl    %2,28\n"
-                : "=m" (hoststfle), "+d"(reg0), "=d"(cc) : : "cc", "memory");
+   asm(".insn s,0xb2b00000,%0\n" /* stfle */
+       "ipm   %2\n"
+       "srl   %2,28\n"
+       : "=Q"(hoststfle), "+d"(reg0), "=d"(cc)
+       :
+       : "cc");
 
    /* Update guest register 0  with what STFLE set r0 to */
    guest_state->guest_r0 = reg0;
 
    /* VM facilities = host facilities, filtered by acceptance */
-   for (i = 0; i < num_dw; ++i)
-      addr[i] = hoststfle[i] & accepted_facility[i];
+   for (i = 0; i <= last_dw; ++i) {
+      if (i < S390_NUM_FACILITY_DW)
+         addr[i] = hoststfle[i] & accepted_facility[i];
+      else
+         addr[i] = 0; /* mask out any excess doublewords */
+   }
 
    return cc;
 }
index ec50d52ca955f91dd2e777836a70a6eb804d34ce..27bb6e0f4624fe467f8cd17b7fdb38e7b33e1b40 100644 (file)
@@ -154,7 +154,8 @@ typedef
 #define VEX_S390X_MODEL_Z14      14
 #define VEX_S390X_MODEL_Z14_ZR1  15
 #define VEX_S390X_MODEL_Z15      16
-#define VEX_S390X_MODEL_UNKNOWN  17     /* always last in list */
+#define VEX_S390X_MODEL_Z16      17
+#define VEX_S390X_MODEL_UNKNOWN  18     /* always last in list */
 #define VEX_S390X_MODEL_MASK     0x3F
 
 #define VEX_HWCAPS_S390X_LDISP (1<<6)   /* Long-displacement facility */
index 289421677a357949be852e29922f76a956126e9c..0fbe4145a9e2e181200432359870f61c0d591193 100644 (file)
 #define S390_NUM_GPRPARMS 5
 
 /* Number of double words needed to store all facility bits. */
-#define S390_NUM_FACILITY_DW 3
+#define S390_NUM_FACILITY_DW 4
 
 #endif /* __LIBVEX_PUB_S390X_H */
 
index 515ff9a71a9f6ec5a0c27c49996f95829942c678..3abb0c8fbb6d6b574c7e6d9a3f32f68b36c77930 100755 (executable)
@@ -28,7 +28,7 @@ my %csv_implemented = ();
 my %toir_implemented = ();
 my %toir_decoded = ();
 my %known_arch = map {($_ => 1)}
-    qw(g5 z900 z990 z9-109 z9-ec z10 z196 zEC12 z13 arch12 arch13);
+    qw(g5 z900 z990 z9-109 z9-ec z10 z196 zEC12 z13 arch12 arch13 arch14);
 
 # Patterns for identifying certain extended mnemonics that shall be
 # skipped in "s390-opc.txt" and "s390-opcodes.csv".
index 661a3f10748705d588da39469f3cfc8582f4e4c1..a4c2218bfb575b4126344caa132b870af0884589 100644 (file)
@@ -584,6 +584,8 @@ static UInt VG_(get_machine_model)(void)
       { "3907", VEX_S390X_MODEL_Z14_ZR1 },
       { "8561", VEX_S390X_MODEL_Z15 },
       { "8562", VEX_S390X_MODEL_Z15 },
+      { "3931", VEX_S390X_MODEL_Z16 },
+      { "3932", VEX_S390X_MODEL_Z16 },
    };
 
    Int    model, n, fh;
@@ -1541,9 +1543,10 @@ Bool VG_(machine_get_hwcaps)( void )
      } else {
          register ULong reg0 asm("0") = S390_NUM_FACILITY_DW - 1;
 
-         __asm__ __volatile__(" .insn s,0xb2b00000,%0\n"   /* stfle */
-                              : "=m" (hoststfle), "+d"(reg0)
-                              : : "cc", "memory");
+         __asm__(".insn s,0xb2b00000,%0" /* stfle */
+                 : "=Q"(hoststfle), "+d"(reg0)
+                 :
+                 : "cc");
      }
 
      /* Restore signals */
index 8bbbbd1e272ccaf408b9e4a2c339563b3fdd236e..88ee52e7a123715047fa45d83b1ebd2341bf3579 100644 (file)
@@ -51,6 +51,7 @@ EXTRA_DIST = \
        dfpext.stderr.exp dfpext.stdout.exp dfpext.vgtest \
        dfpconv.stderr.exp dfpconv.stdout.exp dfpconv.vgtest \
        srnmt.stderr.exp srnmt.stdout.exp srnmt.vgtest \
+       stfle.stdout.exp-z16 \
        pfpo.stderr.exp pfpo.stdout.exp pfpo.vgtest
 
 AM_CFLAGS    += @FLAG_M64@
index 19f2c61f71f11fcd2d979f22f170db8602e47113..22ddf86635b7828a4c9c2b59148ed2983fd45567 100644 (file)
@@ -1,7 +1,7 @@
 #include <stdio.h>
 
 /* Number of double words needed to store all facility bits. */
-#define S390_NUM_FACILITY_DW 3
+#define S390_NUM_FACILITY_DW 4
 
 
 unsigned long long stfle(unsigned long dw, unsigned bit_to_test)
diff --git a/none/tests/s390x/stfle.stdout.exp-z16 b/none/tests/s390x/stfle.stdout.exp-z16
new file mode 100644 (file)
index 0000000..b857fae
--- /dev/null
@@ -0,0 +1,10 @@
+the value of cc is 0 and #double words is 4
+the value of cc is 0 and #double words is 4
+The z/Architecture architectural mode is installed and active
+the value of cc is 0 and #double words is 4
+STFLE facility is installed
+the value of cc is 3 and #double words is 4
+the value of cc is 3 and #double words is 4
+The z/Architecture architectural mode is installed and active
+the value of cc is 3 and #double words is 4
+No MSA facility available
index 6a45199c9dd15fe3ff4b8268cac43c37dcb6a77d..507f3ab2f8ce6cc6cbfafa955095f42a0cad0e74 100644 (file)
@@ -118,6 +118,8 @@ model_info models[] = {
    { "3907", "z14 ZR1"},
    { "8561", "z15"    },
    { "8562", "z15"    },
+   { "3931", "z16"    },
+   { "3932", "z16"    },
 };
 
 
This page took 0.040712 seconds and 5 git commands to generate.