|
From: <sv...@va...> - 2011-08-08 18:27:49
|
Author: florian
Date: 2011-08-08 19:22:58 +0100 (Mon, 08 Aug 2011)
New Revision: 2189
Log:
Handle the invalid opcode 0000.
This is sometimes used by applications on purpose.
Although never executed, we might still decode it because
of chasing unconditional goto/calls.
Modified:
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
===================================================================
--- trunk/priv/guest_s390_defs.h 2011-08-01 22:33:10 UTC (rev 2188)
+++ trunk/priv/guest_s390_defs.h 2011-08-08 18:22:58 UTC (rev 2189)
@@ -74,6 +74,7 @@
/*------------------------------------------------------------*/
/*--- Dirty 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
===================================================================
--- trunk/priv/guest_s390_helpers.c 2011-08-01 22:33:10 UTC (rev 2188)
+++ trunk/priv/guest_s390_helpers.c 2011-08-08 18:22:58 UTC (rev 2189)
@@ -227,6 +227,21 @@
};
/*------------------------------------------------------------*/
+/*--- 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");
+}
+#endif
+
+/*------------------------------------------------------------*/
/*--- Dirty helper for EXecute ---*/
/*------------------------------------------------------------*/
void
Modified: trunk/priv/guest_s390_toIR.c
===================================================================
--- trunk/priv/guest_s390_toIR.c 2011-08-01 22:33:10 UTC (rev 2188)
+++ trunk/priv/guest_s390_toIR.c 2011-08-08 18:22:58 UTC (rev 2189)
@@ -2064,6 +2064,26 @@
/*------------------------------------------------------------*/
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->fxState[0].fx = Ifx_Modify; /* read then write */
+ d->fxState[0].offset = S390X_GUEST_OFFSET(guest_IA);
+ d->fxState[0].size = sizeof(ULong);
+ d->nFxState = 1;
+
+ stmt(IRStmt_Dirty(d));
+
+ return "00";
+}
+
+static HChar *
s390_irgen_AR(UChar r1, UChar r2)
{
IRTemp op1 = newTemp(Ity_I32);
@@ -10688,6 +10708,8 @@
((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;
|