On s390: Terminate the superblock with Ijk_EmFail if an stfle insn
is encountered but not supported on the host.


git-svn-id: svn://svn.valgrind.org/vex/trunk@2485 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/guest_s390_toIR.c b/priv/guest_s390_toIR.c
index c3aa4a0..f9ec22c 100644
--- a/priv/guest_s390_toIR.c
+++ b/priv/guest_s390_toIR.c
@@ -10810,6 +10810,15 @@
 static HChar *
 s390_irgen_STFLE(IRTemp op2addr)
 {
+   if (! s390_host_has_stfle) {
+      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE),
+           mkU32(EmFail_S390X_stfle)));
+      put_IA(mkaddr_expr(guest_IA_next_instr));
+      dis_res->whatNext = Dis_StopHere;
+      dis_res->jk_StopHere = Ijk_EmFail;
+      return "stfle";
+   }
+
    IRDirty *d;
    IRTemp cc = newTemp(Ity_I64);
 
diff --git a/priv/host_s390_defs.c b/priv/host_s390_defs.c
index 56bb986..aea1073 100644
--- a/priv/host_s390_defs.c
+++ b/priv/host_s390_defs.c
@@ -7738,6 +7738,7 @@
    case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break;
    case Ijk_Yield:       trcval = VEX_TRC_JMP_YIELD;       break;
    case Ijk_EmWarn:      trcval = VEX_TRC_JMP_EMWARN;      break;
+   case Ijk_EmFail:      trcval = VEX_TRC_JMP_EMFAIL;      break;
    case Ijk_MapFail:     trcval = VEX_TRC_JMP_MAPFAIL;     break;
    case Ijk_NoDecode:    trcval = VEX_TRC_JMP_NODECODE;    break;
    case Ijk_TInval:      trcval = VEX_TRC_JMP_TINVAL;      break;
diff --git a/priv/host_s390_isel.c b/priv/host_s390_isel.c
index 237b755..8b673fa 100644
--- a/priv/host_s390_isel.c
+++ b/priv/host_s390_isel.c
@@ -2596,6 +2596,7 @@
 
       /* Case: assisted transfer to arbitrary address */
       switch (stmt->Ist.Exit.jk) {
+      case Ijk_EmFail:
       case Ijk_NoDecode:
       case Ijk_TInval:
       case Ijk_Sys_syscall:
@@ -2709,6 +2710,7 @@
 
    /* Case: some other kind of transfer to any address */
    switch (jk) {
+   case Ijk_EmFail:
    case Ijk_NoDecode:
    case Ijk_TInval:
    case Ijk_Sys_syscall:
diff --git a/priv/main_main.c b/priv/main_main.c
index ce7351c..33c362e 100644
--- a/priv/main_main.c
+++ b/priv/main_main.c
@@ -1026,6 +1026,8 @@
         return "PPC64 function redirection stack overflow";
      case EmWarn_PPC64_redir_underflow:
         return "PPC64 function redirection stack underflow";
+   case EmFail_S390X_stfle:
+        return "Instruction stfle is not supported on this host";
      default: 
         vpanic("LibVEX_EmNote_string: unknown warning");
    }