diff -ur valgrind-3.8.1.orig/coregrind/m_main.c valgrind-3.8.1/coregrind/m_main.c --- valgrind-3.8.1.orig/coregrind/m_main.c 2012-11-04 21:57:03.722415879 +0100 +++ valgrind-3.8.1/coregrind/m_main.c 2012-11-04 21:57:37.250896792 +0100 @@ -198,6 +198,7 @@ " To use a non-libc malloc library that is\n" " in the main exe: --soname-synonyms=somalloc=NONE\n" " in libxyzzy.so: --soname-synonyms=somalloc=libxyzzy.so\n" +" --sigill-diagnostics=yes|no warn about illegal instructions? [yes]\n" "\n"; Char* usage2 = @@ -422,6 +423,10 @@ Char* log_fsname_unexpanded = NULL; Char* xml_fsname_unexpanded = NULL; + /* Whether the user has explicitly provided --sigill-diagnostics. + If not explicitly given depends on general verbosity setting. */ + Bool sigill_diag_set = False; + /* Log to stderr by default, but usage message goes to stdout. XML output is initially disabled. */ tmp_log_fd = 2; @@ -516,6 +521,9 @@ VG_STREQ(arg, "--quiet")) VG_(clo_verbosity)--; + else if VG_BOOL_CLO(arg, "--sigill-diagnostics", VG_(clo_sigill_diag)) + sigill_diag_set = True; + else if VG_BOOL_CLO(arg, "--stats", VG_(clo_stats)) {} else if VG_BOOL_CLO(arg, "--xml", VG_(clo_xml)) VG_(debugLog_setXml)(VG_(clo_xml)); @@ -777,6 +785,9 @@ if (VG_(clo_verbosity) < 0) VG_(clo_verbosity) = 0; + if (!sigill_diag_set) + VG_(clo_sigill_diag) = (VG_(clo_verbosity) > 0); + if (VG_(clo_trace_notbelow) == -1) { if (VG_(clo_trace_notabove) == -1) { /* [] */ diff -ur valgrind-3.8.1.orig/coregrind/m_main.c.orig valgrind-3.8.1/coregrind/m_main.c.orig --- valgrind-3.8.1.orig/coregrind/m_main.c.orig 2012-11-04 21:57:03.719415834 +0100 +++ valgrind-3.8.1/coregrind/m_main.c.orig 2012-11-04 21:56:19.950788253 +0100 @@ -2537,7 +2537,7 @@ /* terminate gdbserver if ever it was started. We terminate it here so that it get the output above if output was redirected to gdb */ - VG_(gdbserver) (0); + VG_(gdbserver_exit) (tid, tids_schedretcode); /* Ok, finally exit in the os-specific way, according to the scheduler's return code. In short, if the (last) thread exited by calling diff -ur valgrind-3.8.1.orig/coregrind/m_options.c valgrind-3.8.1/coregrind/m_options.c --- valgrind-3.8.1.orig/coregrind/m_options.c 2012-11-04 21:57:03.709415680 +0100 +++ valgrind-3.8.1/coregrind/m_options.c 2012-11-04 21:57:37.251896807 +0100 @@ -118,7 +118,7 @@ VgSmc VG_(clo_smc_check) = Vg_SmcStack; HChar* VG_(clo_kernel_variant) = NULL; Bool VG_(clo_dsymutil) = False; - +Bool VG_(clo_sigill_diag) = True; /*====================================================================*/ /*=== File expansion ===*/ diff -ur valgrind-3.8.1.orig/coregrind/m_scheduler/scheduler.c valgrind-3.8.1/coregrind/m_scheduler/scheduler.c --- valgrind-3.8.1.orig/coregrind/m_scheduler/scheduler.c 2012-11-04 21:57:03.720415849 +0100 +++ valgrind-3.8.1/coregrind/m_scheduler/scheduler.c 2012-11-04 21:57:37.252896823 +0100 @@ -1427,9 +1427,10 @@ case VEX_TRC_JMP_NODECODE: { Addr addr = VG_(get_IP)(tid); - VG_(umsg)( - "valgrind: Unrecognised instruction at address %#lx.\n", addr); - VG_(get_and_pp_StackTrace)(tid, VG_(clo_backtrace_size)); + if (VG_(clo_sigill_diag)) { + VG_(umsg)( + "valgrind: Unrecognised instruction at address %#lx.\n", addr); + VG_(get_and_pp_StackTrace)(tid, VG_(clo_backtrace_size)); #define M(a) VG_(umsg)(a "\n"); M("Your program just tried to execute an instruction that Valgrind" ); M("did not recognise. There are two possible reasons for this." ); @@ -1442,6 +1443,7 @@ M("Either way, Valgrind will now raise a SIGILL signal which will" ); M("probably kill your program." ); #undef M + } #if defined(VGA_s390x) /* Now that the complaint is out we need to adjust the guest_IA. The Only in valgrind-3.8.1/coregrind/m_scheduler: scheduler.c.orig diff -ur valgrind-3.8.1.orig/coregrind/m_translate.c valgrind-3.8.1/coregrind/m_translate.c --- valgrind-3.8.1.orig/coregrind/m_translate.c 2012-11-04 21:57:03.721415864 +0100 +++ valgrind-3.8.1/coregrind/m_translate.c 2012-11-04 21:57:37.261896960 +0100 @@ -1524,6 +1524,7 @@ vta.needs_self_check = needs_self_check; vta.preamble_function = preamble_fn; vta.traceflags = verbosity; + vta.sigill_diag = VG_(clo_sigill_diag); vta.addProfInc = VG_(clo_profile_flags) > 0 && kind != T_NoRedir; Only in valgrind-3.8.1/coregrind: m_translate.c.orig diff -ur valgrind-3.8.1.orig/coregrind/pub_core_options.h valgrind-3.8.1/coregrind/pub_core_options.h --- valgrind-3.8.1.orig/coregrind/pub_core_options.h 2012-11-04 21:57:03.704415605 +0100 +++ valgrind-3.8.1/coregrind/pub_core_options.h 2012-11-04 21:57:37.300897526 +0100 @@ -275,6 +275,11 @@ extern Bool VG_(should_we_trace_this_child) ( HChar* child_exe_name, HChar** child_argv ); +/* Whether illegal instructions should be reported/diagnosed. + Can be explicitly set through --sigill-diagnostics otherwise + depends on verbosity (False if -q). */ +extern Bool VG_(clo_sigill_diag); + #endif // __PUB_CORE_OPTIONS_H /*--------------------------------------------------------------------*/ diff -ur valgrind-3.8.1.orig/docs/xml/manual-core.xml valgrind-3.8.1/docs/xml/manual-core.xml --- valgrind-3.8.1.orig/docs/xml/manual-core.xml 2012-11-04 21:57:03.689415507 +0100 +++ valgrind-3.8.1/docs/xml/manual-core.xml 2012-11-04 21:57:37.302897560 +0100 @@ -1036,6 +1036,26 @@ + + + + + + Enable/disable printing of illegal instruction diagnostics. + Enabled by default, but defaults to disabled when + is given. The default can always be explicitly + overridden by giving this option. + + When enabled a warning message will be printed with some + diagnostics whenever some instruction is encountered that valgrind + cannot decode or translate before the program is given a SIGILL signal. + Often an illegal instruction indicates a bug in the program or missing + support for the particular instruction in Valgrind. But some programs + do deliberately try to execute an instruction that might be missing + and trap the SIGILL signal to detect processor features. + + + Only in valgrind-3.8.1/docs/xml: manual-core.xml.orig diff -ur valgrind-3.8.1.orig/none/tests/cmdline1.stdout.exp valgrind-3.8.1/none/tests/cmdline1.stdout.exp --- valgrind-3.8.1.orig/none/tests/cmdline1.stdout.exp 2012-11-04 21:57:03.844417741 +0100 +++ valgrind-3.8.1/none/tests/cmdline1.stdout.exp 2012-11-04 21:57:37.385898730 +0100 @@ -87,6 +87,7 @@ To use a non-libc malloc library that is in the main exe: --soname-synonyms=somalloc=NONE in libxyzzy.so: --soname-synonyms=somalloc=libxyzzy.so + --sigill-diagnostics=yes|no warn about illegal instructions? [yes] user options for Nulgrind: (none) diff -ur valgrind-3.8.1.orig/none/tests/cmdline2.stdout.exp valgrind-3.8.1/none/tests/cmdline2.stdout.exp --- valgrind-3.8.1.orig/none/tests/cmdline2.stdout.exp 2012-11-04 21:57:03.811417238 +0100 +++ valgrind-3.8.1/none/tests/cmdline2.stdout.exp 2012-11-04 21:57:37.386898745 +0100 @@ -87,6 +87,7 @@ To use a non-libc malloc library that is in the main exe: --soname-synonyms=somalloc=NONE in libxyzzy.so: --soname-synonyms=somalloc=libxyzzy.so + --sigill-diagnostics=yes|no warn about illegal instructions? [yes] user options for Nulgrind: (none) diff -ur valgrind-3.8.1.orig/VEX/priv/guest_amd64_defs.h valgrind-3.8.1/VEX/priv/guest_amd64_defs.h --- valgrind-3.8.1.orig/VEX/priv/guest_amd64_defs.h 2012-11-04 21:57:03.782416795 +0100 +++ valgrind-3.8.1/VEX/priv/guest_amd64_defs.h 2012-11-04 21:57:36.328883370 +0100 @@ -56,7 +56,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian ); + Bool host_bigendian, + Bool sigill_diag ); /* Used by the optimiser to specialise calls to helpers. */ extern Only in valgrind-3.8.1/VEX/priv: guest_amd64_defs.h.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_amd64_toIR.c valgrind-3.8.1/VEX/priv/guest_amd64_toIR.c --- valgrind-3.8.1.orig/VEX/priv/guest_amd64_toIR.c 2012-11-04 21:57:03.784416825 +0100 +++ valgrind-3.8.1/VEX/priv/guest_amd64_toIR.c 2012-11-04 21:57:36.465885366 +0100 @@ -30426,7 +30426,8 @@ void* callback_opaque, Long delta64, VexArchInfo* archinfo, - VexAbiInfo* vbi + VexAbiInfo* vbi, + Bool sigill_diag ) { IRTemp t1, t2, t3, t4, t5, t6; @@ -30956,29 +30957,31 @@ //default: decode_failure: /* All decode failures end up here. */ - vex_printf("vex amd64->IR: unhandled instruction bytes: " - "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", - (Int)getUChar(delta_start+0), - (Int)getUChar(delta_start+1), - (Int)getUChar(delta_start+2), - (Int)getUChar(delta_start+3), - (Int)getUChar(delta_start+4), - (Int)getUChar(delta_start+5), - (Int)getUChar(delta_start+6), - (Int)getUChar(delta_start+7) ); - vex_printf("vex amd64->IR: REX=%d REX.W=%d REX.R=%d REX.X=%d REX.B=%d\n", - haveREX(pfx) ? 1 : 0, getRexW(pfx), getRexR(pfx), - getRexX(pfx), getRexB(pfx)); - vex_printf("vex amd64->IR: VEX=%d VEX.L=%d VEX.nVVVV=0x%x ESC=%s\n", - haveVEX(pfx) ? 1 : 0, getVexL(pfx), - getVexNvvvv(pfx), - esc==ESC_NONE ? "NONE" : - esc==ESC_0F ? "0F" : - esc==ESC_0F38 ? "0F38" : - esc==ESC_0F3A ? "0F3A" : "???"); - vex_printf("vex amd64->IR: PFX.66=%d PFX.F2=%d PFX.F3=%d\n", - have66(pfx) ? 1 : 0, haveF2(pfx) ? 1 : 0, - haveF3(pfx) ? 1 : 0); + if (sigill_diag) { + vex_printf("vex amd64->IR: unhandled instruction bytes: " + "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", + (Int)getUChar(delta_start+0), + (Int)getUChar(delta_start+1), + (Int)getUChar(delta_start+2), + (Int)getUChar(delta_start+3), + (Int)getUChar(delta_start+4), + (Int)getUChar(delta_start+5), + (Int)getUChar(delta_start+6), + (Int)getUChar(delta_start+7) ); + vex_printf("vex amd64->IR: REX=%d REX.W=%d REX.R=%d REX.X=%d REX.B=%d\n", + haveREX(pfx) ? 1 : 0, getRexW(pfx), getRexR(pfx), + getRexX(pfx), getRexB(pfx)); + vex_printf("vex amd64->IR: VEX=%d VEX.L=%d VEX.nVVVV=0x%x ESC=%s\n", + haveVEX(pfx) ? 1 : 0, getVexL(pfx), + getVexNvvvv(pfx), + esc==ESC_NONE ? "NONE" : + esc==ESC_0F ? "0F" : + esc==ESC_0F38 ? "0F38" : + esc==ESC_0F3A ? "0F3A" : "???"); + vex_printf("vex amd64->IR: PFX.66=%d PFX.F2=%d PFX.F3=%d\n", + have66(pfx) ? 1 : 0, haveF2(pfx) ? 1 : 0, + haveF3(pfx) ? 1 : 0); + } /* Tell the dispatcher that this insn cannot be decoded, and so has not been executed, and (is currently) the next to be executed. @@ -31041,7 +31044,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian_IN ) + Bool host_bigendian_IN, + Bool sigill_diag_IN ) { Int i, x1, x2; Bool expect_CAS, has_CAS; @@ -31064,7 +31068,7 @@ dres = disInstr_AMD64_WRK ( &expect_CAS, resteerOkFn, resteerCisOk, callback_opaque, - delta, archinfo, abiinfo ); + delta, archinfo, abiinfo, sigill_diag_IN ); x2 = irsb_IN->stmts_used; vassert(x2 >= x1); @@ -31097,7 +31101,7 @@ dres = disInstr_AMD64_WRK ( &expect_CAS, resteerOkFn, resteerCisOk, callback_opaque, - delta, archinfo, abiinfo ); + delta, archinfo, abiinfo, sigill_diag_IN ); for (i = x1; i < x2; i++) { vex_printf("\t\t"); ppIRStmt(irsb_IN->stmts[i]); diff -ur valgrind-3.8.1.orig/VEX/priv/guest_amd64_toIR.c.orig valgrind-3.8.1/VEX/priv/guest_amd64_toIR.c.orig --- valgrind-3.8.1.orig/VEX/priv/guest_amd64_toIR.c.orig 2012-11-04 21:57:03.788416887 +0100 +++ valgrind-3.8.1/VEX/priv/guest_amd64_toIR.c.orig 2012-11-04 21:56:20.017789271 +0100 @@ -20986,6 +20986,14 @@ delta = dis_movx_E_G ( vbi, pfx, delta, 2, sz, True ); return delta; + case 0xC0: { /* XADD Gb,Eb */ + Bool decode_OK = False; + delta = dis_xadd_G_E ( &decode_OK, vbi, pfx, 1, delta ); + if (!decode_OK) + goto decode_failure; + return delta; + } + case 0xC1: { /* XADD Gv,Ev */ Bool decode_OK = False; delta = dis_xadd_G_E ( &decode_OK, vbi, pfx, sz, delta ); @@ -30932,14 +30940,6 @@ /* =-=-=-=-=-=-=-=-=- XADD -=-=-=-=-=-=-=-=-=-= */ - case 0xC0: { /* XADD Gb,Eb */ - Bool decode_OK = False; - delta = dis_xadd_G_E ( &decode_OK, vbi, pfx, 1, delta ); - if (!decode_OK) - goto decode_failure; - break; - } - /* =-=-=-=-=-=-=-=-=- SGDT and SIDT =-=-=-=-=-=-=-=-=-=-= */ /* =-=-=-=-=-=-=-=-=- unimp2 =-=-=-=-=-=-=-=-=-=-= */ diff -ur valgrind-3.8.1.orig/VEX/priv/guest_arm_defs.h valgrind-3.8.1/VEX/priv/guest_arm_defs.h --- valgrind-3.8.1.orig/VEX/priv/guest_arm_defs.h 2012-11-04 21:57:03.790416917 +0100 +++ valgrind-3.8.1/VEX/priv/guest_arm_defs.h 2012-11-04 21:57:36.588887153 +0100 @@ -50,7 +50,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian ); + Bool host_bigendian, + Bool sigill_diag ); /* Used by the optimiser to specialise calls to helpers. */ extern Only in valgrind-3.8.1/VEX/priv: guest_arm_defs.h.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_arm_toIR.c valgrind-3.8.1/VEX/priv/guest_arm_toIR.c --- valgrind-3.8.1.orig/VEX/priv/guest_arm_toIR.c 2012-11-04 21:57:03.787416871 +0100 +++ valgrind-3.8.1/VEX/priv/guest_arm_toIR.c 2012-11-04 21:57:36.812890419 +0100 @@ -12564,7 +12564,8 @@ void* callback_opaque, UChar* guest_instr, VexArchInfo* archinfo, - VexAbiInfo* abiinfo + VexAbiInfo* abiinfo, + Bool sigill_diag ) { // A macro to fish bits out of 'insn'. @@ -14643,15 +14644,17 @@ decode_failure: /* All decode failures end up here. */ - vex_printf("disInstr(arm): unhandled instruction: " - "0x%x\n", insn); - vex_printf(" cond=%d(0x%x) 27:20=%u(0x%02x) " - "4:4=%d " - "3:0=%u(0x%x)\n", - (Int)INSN_COND, (UInt)INSN_COND, - (Int)INSN(27,20), (UInt)INSN(27,20), - (Int)INSN(4,4), - (Int)INSN(3,0), (UInt)INSN(3,0) ); + if (sigill_diag) { + vex_printf("disInstr(arm): unhandled instruction: " + "0x%x\n", insn); + vex_printf(" cond=%d(0x%x) 27:20=%u(0x%02x) " + "4:4=%d " + "3:0=%u(0x%x)\n", + (Int)INSN_COND, (UInt)INSN_COND, + (Int)INSN(27,20), (UInt)INSN(27,20), + (Int)INSN(4,4), + (Int)INSN(3,0), (UInt)INSN(3,0) ); + } /* Tell the dispatcher that this insn cannot be decoded, and so has not been executed, and (is currently) the next to be executed. @@ -14760,7 +14763,8 @@ void* callback_opaque, UChar* guest_instr, VexArchInfo* archinfo, - VexAbiInfo* abiinfo + VexAbiInfo* abiinfo, + Bool sigill_diag ) { /* A macro to fish bits out of insn0. There's also INSN1, to fish @@ -18746,8 +18750,9 @@ decode_failure: /* All decode failures end up here. */ - vex_printf("disInstr(thumb): unhandled instruction: " - "0x%04x 0x%04x\n", (UInt)insn0, (UInt)insn1); + if (sigill_diag) + vex_printf("disInstr(thumb): unhandled instruction: " + "0x%04x 0x%04x\n", (UInt)insn0, (UInt)insn1); /* Back up ITSTATE to the initial value for this instruction. If we don't do that, any subsequent restart of the instruction @@ -18892,7 +18897,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian_IN ) + Bool host_bigendian_IN, + Bool sigill_diag_IN ) { DisResult dres; Bool isThumb = (Bool)(guest_IP_ENCODED & 1); @@ -18914,12 +18920,12 @@ dres = disInstr_THUMB_WRK ( resteerOkFn, resteerCisOk, callback_opaque, &guest_code_IN[delta_ENCODED - 1], - archinfo, abiinfo ); + archinfo, abiinfo, sigill_diag_IN ); } else { dres = disInstr_ARM_WRK ( resteerOkFn, resteerCisOk, callback_opaque, &guest_code_IN[delta_ENCODED], - archinfo, abiinfo ); + archinfo, abiinfo, sigill_diag_IN ); } return dres; Only in valgrind-3.8.1/VEX/priv: guest_arm_toIR.c.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_generic_bb_to_IR.c valgrind-3.8.1/VEX/priv/guest_generic_bb_to_IR.c --- valgrind-3.8.1.orig/VEX/priv/guest_generic_bb_to_IR.c 2012-11-04 21:57:03.790416917 +0100 +++ valgrind-3.8.1/VEX/priv/guest_generic_bb_to_IR.c 2012-11-04 21:57:36.918891974 +0100 @@ -187,6 +187,7 @@ /*IN*/ Addr64 guest_IP_bbstart, /*IN*/ Bool (*chase_into_ok)(void*,Addr64), /*IN*/ Bool host_bigendian, + /*IN*/ Bool sigill_diag, /*IN*/ VexArch arch_guest, /*IN*/ VexArchInfo* archinfo_guest, /*IN*/ VexAbiInfo* abiinfo_both, @@ -361,7 +362,8 @@ arch_guest, archinfo_guest, abiinfo_both, - host_bigendian ); + host_bigendian, + sigill_diag ); /* stay sane ... */ vassert(dres.whatNext == Dis_StopHere diff -ur valgrind-3.8.1.orig/VEX/priv/guest_generic_bb_to_IR.h valgrind-3.8.1/VEX/priv/guest_generic_bb_to_IR.h --- valgrind-3.8.1.orig/VEX/priv/guest_generic_bb_to_IR.h 2012-11-04 21:57:03.790416917 +0100 +++ valgrind-3.8.1/VEX/priv/guest_generic_bb_to_IR.h 2012-11-04 21:57:36.970892726 +0100 @@ -150,7 +150,10 @@ /*IN*/ VexAbiInfo* abiinfo, /* Is the host bigendian? */ - /*IN*/ Bool host_bigendian + /*IN*/ Bool host_bigendian, + + /* Should diagnostics be printed for illegal instructions? */ + /*IN*/ Bool sigill_diag ); @@ -171,6 +174,7 @@ /*IN*/ Addr64 guest_IP_bbstart, /*IN*/ Bool (*chase_into_ok)(void*,Addr64), /*IN*/ Bool host_bigendian, + /*IN*/ Bool sigill_diag, /*IN*/ VexArch arch_guest, /*IN*/ VexArchInfo* archinfo_guest, /*IN*/ VexAbiInfo* abiinfo_both, Only in valgrind-3.8.1/VEX/priv: guest_generic_bb_to_IR.h.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_mips_defs.h valgrind-3.8.1/VEX/priv/guest_mips_defs.h --- valgrind-3.8.1.orig/VEX/priv/guest_mips_defs.h 2012-11-04 21:57:03.790416917 +0100 +++ valgrind-3.8.1/VEX/priv/guest_mips_defs.h 2012-11-04 21:57:36.984892934 +0100 @@ -49,7 +49,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian ); + Bool host_bigendian, + Bool sigill_diag ); /* Used by the optimiser to specialise calls to helpers. */ extern IRExpr *guest_mips32_spechelper(HChar * function_name, IRExpr ** args, Only in valgrind-3.8.1/VEX/priv: guest_mips_defs.h.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_mips_toIR.c valgrind-3.8.1/VEX/priv/guest_mips_toIR.c --- valgrind-3.8.1.orig/VEX/priv/guest_mips_toIR.c 2012-11-04 21:57:03.785416840 +0100 +++ valgrind-3.8.1/VEX/priv/guest_mips_toIR.c 2012-11-04 21:57:36.986892956 +0100 @@ -1195,7 +1195,8 @@ void* callback_opaque, Long delta64, VexArchInfo* archinfo, - VexAbiInfo* abiinfo ) + VexAbiInfo* abiinfo, + Bool sigill_diag ) { IRTemp t0, t1, t2, t3, t4, t5, t6, t7, t8; UInt opcode, cins, rs, rt, rd, sa, ft, fs, fd, fmt, tf, nd, function, @@ -3399,12 +3400,13 @@ decode_failure: /* All decode failures end up here. */ - DIP("vex mips->IR: unhandled instruction bytes: " - "0x%x 0x%x 0x%x 0x%x\n", - (Int) getIByte(delta_start + 0), - (Int) getIByte(delta_start + 1), - (Int) getIByte(delta_start + 2), - (Int) getIByte(delta_start + 3)); + if (sigill_diag) + vex_printf("vex mips->IR: unhandled instruction bytes: " + "0x%x 0x%x 0x%x 0x%x\n", + (Int) getIByte(delta_start + 0), + (Int) getIByte(delta_start + 1), + (Int) getIByte(delta_start + 2), + (Int) getIByte(delta_start + 3)); /* Tell the dispatcher that this insn cannot be decoded, and so has not been executed, and (is currently) the next to be executed. @@ -3494,7 +3496,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian_IN) + Bool host_bigendian_IN, + Bool sigill_diag_IN) { DisResult dres; @@ -3510,7 +3513,7 @@ guest_PC_bbstart = (Addr32) toUInt(guest_IP - delta); dres = disInstr_MIPS_WRK(resteerOkFn, resteerCisOk, callback_opaque, - delta, archinfo, abiinfo); + delta, archinfo, abiinfo, sigill_diag_IN); return dres; } Only in valgrind-3.8.1/VEX/priv: guest_mips_toIR.c.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_ppc_defs.h valgrind-3.8.1/VEX/priv/guest_ppc_defs.h --- valgrind-3.8.1.orig/VEX/priv/guest_ppc_defs.h 2012-11-04 21:57:03.782416795 +0100 +++ valgrind-3.8.1/VEX/priv/guest_ppc_defs.h 2012-11-04 21:57:37.030893654 +0100 @@ -57,7 +57,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian ); + Bool host_bigendian, + Bool sigill_diag ); /* Used by the optimiser to specialise calls to helpers. */ extern Only in valgrind-3.8.1/VEX/priv: guest_ppc_defs.h.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_ppc_toIR.c valgrind-3.8.1/VEX/priv/guest_ppc_toIR.c --- valgrind-3.8.1.orig/VEX/priv/guest_ppc_toIR.c 2012-11-04 21:57:03.784416825 +0100 +++ valgrind-3.8.1/VEX/priv/guest_ppc_toIR.c 2012-11-04 21:57:37.034893677 +0100 @@ -16475,7 +16475,8 @@ void* callback_opaque, Long delta64, VexArchInfo* archinfo, - VexAbiInfo* abiinfo + VexAbiInfo* abiinfo, + Bool sigill_diag ) { UChar opc1; @@ -17688,10 +17689,12 @@ decode_failure: /* All decode failures end up here. */ opc2 = (theInstr) & 0x7FF; - vex_printf("disInstr(ppc): unhandled instruction: " - "0x%x\n", theInstr); - vex_printf(" primary %d(0x%x), secondary %u(0x%x)\n", - opc1, opc1, opc2, opc2); + if (sigill_diag) { + vex_printf("disInstr(ppc): unhandled instruction: " + "0x%x\n", theInstr); + vex_printf(" primary %d(0x%x), secondary %u(0x%x)\n", + opc1, opc1, opc2, opc2); + } /* Tell the dispatcher that this insn cannot be decoded, and so has not been executed, and (is currently) the next to be executed. @@ -17752,7 +17755,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian_IN ) + Bool host_bigendian_IN, + Bool sigill_diag_IN ) { IRType ty; DisResult dres; @@ -17788,7 +17792,7 @@ guest_CIA_bbstart = mkSzAddr(ty, guest_IP - delta); dres = disInstr_PPC_WRK ( resteerOkFn, resteerCisOk, callback_opaque, - delta, archinfo, abiinfo ); + delta, archinfo, abiinfo, sigill_diag_IN ); return dres; } diff -ur valgrind-3.8.1.orig/VEX/priv/guest_ppc_toIR.c.orig valgrind-3.8.1/VEX/priv/guest_ppc_toIR.c.orig --- valgrind-3.8.1.orig/VEX/priv/guest_ppc_toIR.c.orig 2012-11-04 21:57:03.786416855 +0100 +++ valgrind-3.8.1/VEX/priv/guest_ppc_toIR.c.orig 2012-11-04 21:56:20.081790240 +0100 @@ -16629,6 +16629,7 @@ /* 64bit Integer Rotate Instructions */ case 0x1E: // rldcl, rldcr, rldic, rldicl, rldicr, rldimi + if (!mode64) goto decode_failure; if (dis_int_rot( theInstr )) goto decode_success; goto decode_failure; @@ -16663,7 +16664,12 @@ goto decode_failure; /* Trap Instructions */ - case 0x02: case 0x03: // tdi, twi + case 0x02: // tdi + if (!mode64) goto decode_failure; + if (dis_trapi(theInstr, &dres)) goto decode_success; + goto decode_failure; + + case 0x03: // twi if (dis_trapi(theInstr, &dres)) goto decode_success; goto decode_failure; @@ -17264,7 +17270,12 @@ goto decode_failure; /* 64bit Integer Parity Instructions */ - case 0xba: case 0x9a: // prtyd, prtyw + case 0xba: // prtyd + if (!mode64) goto decode_failure; + if (dis_int_parity( theInstr )) goto decode_success; + goto decode_failure; + + case 0x9a: // prtyw if (dis_int_parity( theInstr )) goto decode_success; goto decode_failure; @@ -17309,9 +17320,13 @@ goto decode_failure; /* Integer Load and Store with Byte Reverse Instructions */ - case 0x316: case 0x216: case 0x396: // lhbrx, lwbrx, sthbrx - case 0x296: case 0x214: // stwbrx, ldbrx - case 0x294: // stdbrx + case 0x214: case 0x294: // ldbrx, stdbrx + if (!mode64) goto decode_failure; + if (dis_int_ldst_rev( theInstr )) goto decode_success; + goto decode_failure; + + case 0x216: case 0x316: case 0x296: // lwbrx, lhbrx, stwbrx + case 0x396: // sthbrx if (dis_int_ldst_rev( theInstr )) goto decode_success; goto decode_failure; @@ -17361,7 +17376,12 @@ //zz goto decode_failure; /* Trap Instructions */ - case 0x004: case 0x044: // tw, td + case 0x004: // tw + if (dis_trap(theInstr, &dres)) goto decode_success; + goto decode_failure; + + case 0x044: // td + if (!mode64) goto decode_failure; if (dis_trap(theInstr, &dres)) goto decode_success; goto decode_failure; @@ -17455,6 +17475,7 @@ goto decode_failure; case 0x0FC: // bpermd + if (!mode64) goto decode_failure; if (dis_int_logic( theInstr )) goto decode_success; goto decode_failure; diff -ur valgrind-3.8.1.orig/VEX/priv/guest_s390_defs.h valgrind-3.8.1/VEX/priv/guest_s390_defs.h --- valgrind-3.8.1.orig/VEX/priv/guest_s390_defs.h 2012-11-04 21:57:03.782416795 +0100 +++ valgrind-3.8.1/VEX/priv/guest_s390_defs.h 2012-11-04 21:57:37.098894575 +0100 @@ -52,7 +52,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian ); + Bool host_bigendian, + Bool sigill_diag ); /* Used by the optimiser to specialise calls to helpers. */ IRExpr* guest_s390x_spechelper ( HChar *function_name, Only in valgrind-3.8.1/VEX/priv: guest_s390_defs.h.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_s390_toIR.c valgrind-3.8.1/VEX/priv/guest_s390_toIR.c --- valgrind-3.8.1.orig/VEX/priv/guest_s390_toIR.c 2012-11-04 21:57:03.789416902 +0100 +++ valgrind-3.8.1/VEX/priv/guest_s390_toIR.c 2012-11-04 21:57:37.102894640 +0100 @@ -73,6 +73,9 @@ static Bool (*resteer_fn)(void *, Addr64); static void *resteer_data; +/* Whether to print diagnostics for illegal instructions. */ +static Bool sigill_diag; + /* The last seen execute target instruction */ ULong last_execute_target; @@ -14143,34 +14146,36 @@ if (status == S390_DECODE_OK) return insn_length; /* OK */ /* Decoding failed somehow */ - vex_printf("vex s390->IR: "); - switch (status) { - case S390_DECODE_UNKNOWN_INSN: - vex_printf("unknown insn: "); - break; + if (sigill_diag) { + vex_printf("vex s390->IR: "); + switch (status) { + case S390_DECODE_UNKNOWN_INSN: + vex_printf("unknown insn: "); + break; - case S390_DECODE_UNIMPLEMENTED_INSN: - vex_printf("unimplemented insn: "); - break; + case S390_DECODE_UNIMPLEMENTED_INSN: + vex_printf("unimplemented insn: "); + break; - case S390_DECODE_UNKNOWN_SPECIAL_INSN: - vex_printf("unimplemented special insn: "); - break; + case S390_DECODE_UNKNOWN_SPECIAL_INSN: + vex_printf("unimplemented special insn: "); + break; - default: - case S390_DECODE_ERROR: - vex_printf("decoding error: "); - break; - } + default: + case S390_DECODE_ERROR: + vex_printf("decoding error: "); + break; + } - vex_printf("%02x%02x", bytes[0], bytes[1]); - if (insn_length > 2) { - vex_printf(" %02x%02x", bytes[2], bytes[3]); - } - if (insn_length > 4) { - vex_printf(" %02x%02x", bytes[4], bytes[5]); + vex_printf("%02x%02x", bytes[0], bytes[1]); + if (insn_length > 2) { + vex_printf(" %02x%02x", bytes[2], bytes[3]); + } + if (insn_length > 4) { + vex_printf(" %02x%02x", bytes[4], bytes[5]); + } + vex_printf("\n"); } - vex_printf("\n"); return 0; /* Failed */ } @@ -14261,7 +14266,8 @@ VexArch guest_arch, VexArchInfo *archinfo, VexAbiInfo *abiinfo, - Bool host_bigendian) + Bool host_bigendian, + Bool sigill_diag_IN) { vassert(guest_arch == VexArchS390X); @@ -14273,6 +14279,7 @@ irsb = irsb_IN; resteer_fn = resteerOkFn; resteer_data = callback_opaque; + sigill_diag = sigill_diag_IN; return disInstr_S390_WRK(guest_code + delta); } Only in valgrind-3.8.1/VEX/priv: guest_s390_toIR.c.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_x86_defs.h valgrind-3.8.1/VEX/priv/guest_x86_defs.h --- valgrind-3.8.1.orig/VEX/priv/guest_x86_defs.h 2012-11-04 21:57:03.782416795 +0100 +++ valgrind-3.8.1/VEX/priv/guest_x86_defs.h 2012-11-04 21:57:37.169895603 +0100 @@ -56,7 +56,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian ); + Bool host_bigendian, + Bool sigill_diag ); /* Used by the optimiser to specialise calls to helpers. */ extern Only in valgrind-3.8.1/VEX/priv: guest_x86_defs.h.orig diff -ur valgrind-3.8.1.orig/VEX/priv/guest_x86_toIR.c valgrind-3.8.1/VEX/priv/guest_x86_toIR.c --- valgrind-3.8.1.orig/VEX/priv/guest_x86_toIR.c 2012-11-04 21:57:03.790416917 +0100 +++ valgrind-3.8.1/VEX/priv/guest_x86_toIR.c 2012-11-04 21:57:37.176895720 +0100 @@ -7927,7 +7927,8 @@ void* callback_opaque, Long delta64, VexArchInfo* archinfo, - VexAbiInfo* vbi + VexAbiInfo* vbi, + Bool sigill_diag ) { IRType ty; @@ -15157,12 +15158,14 @@ default: decode_failure: /* All decode failures end up here. */ - vex_printf("vex x86->IR: unhandled instruction bytes: " - "0x%x 0x%x 0x%x 0x%x\n", - (Int)getIByte(delta_start+0), - (Int)getIByte(delta_start+1), - (Int)getIByte(delta_start+2), - (Int)getIByte(delta_start+3) ); + if (sigill_diag) { + vex_printf("vex x86->IR: unhandled instruction bytes: " + "0x%x 0x%x 0x%x 0x%x\n", + (Int)getIByte(delta_start+0), + (Int)getIByte(delta_start+1), + (Int)getIByte(delta_start+2), + (Int)getIByte(delta_start+3) ); + } /* Tell the dispatcher that this insn cannot be decoded, and so has not been executed, and (is currently) the next to be executed. @@ -15225,7 +15228,8 @@ VexArch guest_arch, VexArchInfo* archinfo, VexAbiInfo* abiinfo, - Bool host_bigendian_IN ) + Bool host_bigendian_IN, + Bool sigill_diag_IN ) { Int i, x1, x2; Bool expect_CAS, has_CAS; @@ -15244,7 +15248,7 @@ dres = disInstr_X86_WRK ( &expect_CAS, resteerOkFn, resteerCisOk, callback_opaque, - delta, archinfo, abiinfo ); + delta, archinfo, abiinfo, sigill_diag_IN ); x2 = irsb_IN->stmts_used; vassert(x2 >= x1); @@ -15264,7 +15268,7 @@ dres = disInstr_X86_WRK ( &expect_CAS, resteerOkFn, resteerCisOk, callback_opaque, - delta, archinfo, abiinfo ); + delta, archinfo, abiinfo, sigill_diag_IN ); for (i = x1; i < x2; i++) { vex_printf("\t\t"); ppIRStmt(irsb_IN->stmts[i]); Only in valgrind-3.8.1/VEX/priv: guest_x86_toIR.c.orig diff -ur valgrind-3.8.1.orig/VEX/priv/main_main.c valgrind-3.8.1/VEX/priv/main_main.c --- valgrind-3.8.1.orig/VEX/priv/main_main.c 2012-11-04 21:57:03.784416825 +0100 +++ valgrind-3.8.1/VEX/priv/main_main.c 2012-11-04 21:57:37.247896750 +0100 @@ -605,6 +605,7 @@ vta->guest_bytes_addr, vta->chase_into_ok, host_is_bigendian, + vta->sigill_diag, vta->arch_guest, &vta->archinfo_guest, &vta->abiinfo_both, diff -ur valgrind-3.8.1.orig/VEX/pub/libvex.h valgrind-3.8.1/VEX/pub/libvex.h --- valgrind-3.8.1.orig/VEX/pub/libvex.h 2012-11-04 21:57:03.781416780 +0100 +++ valgrind-3.8.1/VEX/pub/libvex.h 2012-11-04 21:57:37.248896764 +0100 @@ -622,6 +622,9 @@ /* IN: debug: trace vex activity at various points */ Int traceflags; + /* IN: debug: print diagnostics when an illegal instr is detected */ + Bool sigill_diag; + /* IN: profiling: add a 64 bit profiler counter increment to the translation? */ Bool addProfInc; Only in valgrind-3.8.1/VEX/pub: libvex.h.orig