|
[Valgrind-developers] vex: r2485: On s390: Terminate the superblock
with Ijk_EmFail if an stfle insn
From: <sv...@va...> - 2012-08-26 03:42:05
|
florian 2012-08-26 04:41:56 +0100 (Sun, 26 Aug 2012)
New Revision: 2485
Log:
On s390: Terminate the superblock with Ijk_EmFail if an stfle insn
is encountered but not supported on the host.
Modified files:
trunk/priv/guest_s390_toIR.c
trunk/priv/host_s390_defs.c
trunk/priv/host_s390_isel.c
trunk/priv/main_main.c
trunk/pub/libvex_emnote.h
Modified: trunk/priv/main_main.c (+2 -0)
===================================================================
--- trunk/priv/main_main.c 2012-08-26 04:20:07 +01:00 (rev 2484)
+++ trunk/priv/main_main.c 2012-08-26 04:41:56 +01:00 (rev 2485)
@@ -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");
}
Modified: trunk/priv/host_s390_defs.c (+1 -0)
===================================================================
--- trunk/priv/host_s390_defs.c 2012-08-26 04:20:07 +01:00 (rev 2484)
+++ trunk/priv/host_s390_defs.c 2012-08-26 04:41:56 +01:00 (rev 2485)
@@ -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;
Modified: trunk/pub/libvex_emnote.h (+3 -0)
===================================================================
--- trunk/pub/libvex_emnote.h 2012-08-26 04:20:07 +01:00 (rev 2484)
+++ trunk/pub/libvex_emnote.h 2012-08-26 04:41:56 +01:00 (rev 2485)
@@ -85,6 +85,9 @@
EmWarn_PPC64_redir_overflow,
EmWarn_PPC64_redir_underflow,
+ /* stfle insn is not supported on this host */
+ EmFail_S390X_stfle,
+
EmNote_NUMBER
}
VexEmNote;
Modified: trunk/priv/host_s390_isel.c (+2 -0)
===================================================================
--- trunk/priv/host_s390_isel.c 2012-08-26 04:20:07 +01:00 (rev 2484)
+++ trunk/priv/host_s390_isel.c 2012-08-26 04:41:56 +01:00 (rev 2485)
@@ -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:
Modified: trunk/priv/guest_s390_toIR.c (+9 -0)
===================================================================
--- trunk/priv/guest_s390_toIR.c 2012-08-26 04:20:07 +01:00 (rev 2484)
+++ trunk/priv/guest_s390_toIR.c 2012-08-26 04:41:56 +01:00 (rev 2485)
@@ -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);
|