|
From: <sv...@va...> - 2012-07-23 18:03:59
|
florian 2012-07-23 19:03:47 +0100 (Mon, 23 Jul 2012)
New Revision: 2444
Log:
Back out special handling for opcode 00 (VEX r2189).
This was added based on the following analysis at the time:
(1) during decoding a sequence of insns we run into a 00 opcode (as that
opcode is sometimes used on purpose to force an abort)
(2) #1 only happens when chasing through unconditional gotos
(3) the path that was decoded in #1 would not be executed because an earlier
side exit in the super block was taken
But chasing through an unconditional branch should not reach an insn that is
not reached at execution time, because
(a) conditional gotos are supposed to terminate a superblock
(b) side exits that appear in the IR of complex insns will transfer control
to the very same address (for insns that have implicit loops) and/or to
the address that immediately follows the current insn (fall through)
Therefore, the special handling of opcode 00 was just fighting the
symptom but not the cause.
Most likely a super block was not correctly terminated.
Modified files:
trunk/priv/guest_s390_defs.h
trunk/priv/guest_s390_helpers.c
trunk/priv/guest_s390_toIR.c
Modified: trunk/priv/guest_s390_defs.h (+0 -1)
===================================================================
--- trunk/priv/guest_s390_defs.h 2012-07-21 21:32:57 +01:00 (rev 2443)
+++ trunk/priv/guest_s390_defs.h 2012-07-23 19:03:47 +01:00 (rev 2444)
@@ -74,7 +74,6 @@
/*------------------------------------------------------------*/
/*--- Helper functions. ---*/
/*------------------------------------------------------------*/
-void s390x_dirtyhelper_00(VexGuestS390XState *guest_state);
void s390x_dirtyhelper_EX(ULong torun);
ULong s390x_dirtyhelper_STCK(ULong *addr);
ULong s390x_dirtyhelper_STCKF(ULong *addr);
Modified: trunk/priv/guest_s390_helpers.c (+0 -17)
===================================================================
--- trunk/priv/guest_s390_helpers.c 2012-07-21 21:32:57 +01:00 (rev 2443)
+++ trunk/priv/guest_s390_helpers.c 2012-07-23 19:03:47 +01:00 (rev 2444)
@@ -231,23 +231,6 @@
};
/*------------------------------------------------------------*/
-/*--- Dirty helper for invalid opcode 00 ---*/
-/*------------------------------------------------------------*/
-#if defined(VGA_s390x)
-void
-s390x_dirtyhelper_00(VexGuestS390XState *guest_state)
-{
- /* Avoid infinite loop in case SIGILL is caught. See also
- none/tests/s390x/op_exception.c */
- guest_state->guest_IA += 2;
-
- asm volatile(".hword 0\n");
-}
-#else
-void s390x_dirtyhelper_00(VexGuestS390XState *guest_state) { }
-#endif
-
-/*------------------------------------------------------------*/
/*--- Dirty helper for EXecute ---*/
/*------------------------------------------------------------*/
void
Modified: trunk/priv/guest_s390_toIR.c (+0 -24)
===================================================================
--- trunk/priv/guest_s390_toIR.c 2012-07-21 21:32:57 +01:00 (rev 2443)
+++ trunk/priv/guest_s390_toIR.c 2012-07-23 19:03:47 +01:00 (rev 2444)
@@ -2110,28 +2110,6 @@
/*------------------------------------------------------------*/
static HChar *
-s390_irgen_00(UChar r1 __attribute__((unused)),
- UChar r2 __attribute__((unused)))
-{
- IRDirty *d;
-
- d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_00", &s390x_dirtyhelper_00,
- mkIRExprVec_0());
- d->needsBBP = 1; /* Need to pass pointer to guest state to helper */
-
- d->nFxState = 1;
- vex_bzero(&d->fxState, sizeof(d->fxState));
-
- d->fxState[0].fx = Ifx_Modify; /* read then write */
- d->fxState[0].offset = S390X_GUEST_OFFSET(guest_IA);
- d->fxState[0].size = sizeof(ULong);
-
- stmt(IRStmt_Dirty(d));
-
- return "00";
-}
-
-static HChar *
s390_irgen_AR(UChar r1, UChar r2)
{
IRTemp op1 = newTemp(Ity_I32);
@@ -11509,8 +11487,6 @@
((char *)(&ovl.value))[1] = bytes[1];
switch (ovl.value & 0xffff) {
- case 0x0000: /* invalid opcode */
- s390_format_RR_RR(s390_irgen_00, 0, 0); goto ok;
case 0x0101: /* PR */ goto unimplemented;
case 0x0102: /* UPT */ goto unimplemented;
case 0x0104: /* PTFF */ goto unimplemented;
|