diff --git a/valgrind-3.8.1-sigill_diag.patch b/valgrind-3.8.1-sigill_diag.patch new file mode 100644 index 0000000..d6755e5 --- /dev/null +++ b/valgrind-3.8.1-sigill_diag.patch @@ -0,0 +1,878 @@ +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 diff --git a/valgrind.spec b/valgrind.spec index 758ff50..2d84b06 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -131,6 +131,10 @@ Patch30: valgrind-3.8.1-stpncpy.patch # in 32-bit mode Patch31: valgrind-3.8.1-ppc-32-mode-64-bit-instr.patch +# KDE#309425 - Provide a --sigill-diagnostics flag to suppress +# illegal instruction reporting +Patch32: valgrind-3.8.1-sigill_diag.patch + Obsoletes: valgrind-callgrind %ifarch x86_64 ppc64 # Ensure glibc{,-devel} is installed for both multilib arches @@ -263,6 +267,7 @@ touch ./none/tests/amd64/bmi.stderr.exp %patch29 -p1 %patch30 -p1 %patch31 -p1 +%patch32 -p1 # To suppress eventual automake warnings/errors rm -f gdbserver_tests/filter_gdb.orig @@ -415,6 +420,7 @@ echo ===============END TESTING=============== * Sun Nov 4 2012 Mark Wielaard - Add valgrind-3.8.1-stpncpy.patch (KDE#309427) - Add valgrind-3.8.1-ppc-32-mode-64-bit-instr.patch (#810992, KDE#308573) +- Add valgrind-3.8.1-sigill_diag.patch (#810992, KDE#309425) * Tue Oct 16 2012 Mark Wielaard 3.8.1-4 - Add valgrind-3.8.1-xaddb.patch (#866793, KDE#307106)