From: Florian Krohm Date: Sun, 26 Aug 2012 03:41:56 +0000 (+0000) Subject: On s390: Terminate the superblock with Ijk_EmFail if an stfle insn X-Git-Tag: svn/VALGRIND_3_9_0^2~276 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cdc8ec73f3ab24821e9b3125c6d3e3bf6366e983;p=thirdparty%2Fvalgrind.git 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 --- diff --git a/VEX/priv/guest_s390_toIR.c b/VEX/priv/guest_s390_toIR.c index c3aa4a05fb..f9ec22caca 100644 --- a/VEX/priv/guest_s390_toIR.c +++ b/VEX/priv/guest_s390_toIR.c @@ -10810,6 +10810,15 @@ s390_irgen_STCKE(IRTemp op2addr) 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/VEX/priv/host_s390_defs.c b/VEX/priv/host_s390_defs.c index 56bb986bf2..aea1073d15 100644 --- a/VEX/priv/host_s390_defs.c +++ b/VEX/priv/host_s390_defs.c @@ -7738,6 +7738,7 @@ s390_insn_xassisted_emit(UChar *buf, const s390_insn *insn, 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/VEX/priv/host_s390_isel.c b/VEX/priv/host_s390_isel.c index 237b755f65..8b673fa61d 100644 --- a/VEX/priv/host_s390_isel.c +++ b/VEX/priv/host_s390_isel.c @@ -2596,6 +2596,7 @@ s390_isel_stmt(ISelEnv *env, IRStmt *stmt) /* 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 @@ iselNext(ISelEnv *env, IRExpr *next, IRJumpKind jk, int offsIP) /* 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/VEX/priv/main_main.c b/VEX/priv/main_main.c index ce7351c65b..33c362e85c 100644 --- a/VEX/priv/main_main.c +++ b/VEX/priv/main_main.c @@ -1026,6 +1026,8 @@ HChar* LibVEX_EmNote_string ( VexEmNote ew ) 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"); } diff --git a/VEX/pub/libvex_emnote.h b/VEX/pub/libvex_emnote.h index f7b68eb040..cdedfe2e78 100644 --- a/VEX/pub/libvex_emnote.h +++ b/VEX/pub/libvex_emnote.h @@ -85,6 +85,9 @@ typedef EmWarn_PPC64_redir_overflow, EmWarn_PPC64_redir_underflow, + /* stfle insn is not supported on this host */ + EmFail_S390X_stfle, + EmNote_NUMBER } VexEmNote;