]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Deal with LibVEX-supplied insn decode failures, and with LibVEX-supplied
authorJulian Seward <jseward@acm.org>
Mon, 13 Dec 2004 14:10:34 +0000 (14:10 +0000)
committerJulian Seward <jseward@acm.org>
Mon, 13 Dec 2004 14:10:34 +0000 (14:10 +0000)
address-mapping failures (x86 LDT/GDT failures).

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3195

coregrind/core.h
coregrind/core_asm.h
coregrind/vg_scheduler.c
coregrind/vg_signals.c

index b1bc0e3be353876107e05af320acc041b32bb703..ffc2fbef768bf5ef4fcc516619050875419a28f7 100644 (file)
@@ -983,6 +983,7 @@ extern void VG_(kill_self)(Int sigNo);
 extern void VG_(synth_fault)        (ThreadId tid);
 extern void VG_(synth_fault_mapping)(ThreadId tid, Addr addr);
 extern void VG_(synth_fault_perms)  (ThreadId tid, Addr addr);
+extern void VG_(synth_sigill)       (ThreadId tid, Addr addr);
 
 extern void VG_(get_sigstack_bounds)( Addr* low, Addr* high );
 
index e0c319a400bc81d71055a7a14c87e682afda59e3..4b49b50fd5a3f7a04e69d2e522104611542bd504 100644 (file)
@@ -49,9 +49,9 @@
 
 /* And some more of our own.  These must not have the same values as
    those from libvex_trc_values.h. */
-#define VG_TRC_INNER_FASTMISS     31 /* TRC only; means fast-cache miss. */
-#define VG_TRC_INNER_COUNTERZERO  29 /* TRC only; means bb ctr == 0 */
-#define VG_TRC_UNRESUMABLE_SIGNAL 37 /* TRC only; got sigsegv/sigbus */
+#define VG_TRC_INNER_FASTMISS     37 /* TRC only; means fast-cache miss. */
+#define VG_TRC_INNER_COUNTERZERO  41 /* TRC only; means bb ctr == 0 */
+#define VG_TRC_UNRESUMABLE_SIGNAL 43 /* TRC only; got sigsegv/sigbus */
 
 
 /* Constants for the fast translation lookup cache. */
index 16145551e3d100e7269d4ec56895c6bcafdd0448..8e0c5ed3834dd3f65cbc698b60102f1b84d594c2 100644 (file)
@@ -1090,6 +1090,14 @@ VgSchedReturnCode do_scheduler ( Int* exitcode, ThreadId* last_run_tid )
            unresumable_siginfo.si_signo = 0; /* done */
            break;
 
+         case VEX_TRC_JMP_NODECODE:
+            VG_(synth_sigill)(tid, INSTR_PTR(VG_(threads)[tid].arch));
+            break;
+
+         case VEX_TRC_JMP_MAPFAIL:
+            VG_(synth_fault)(tid);
+            break;
+
          default: 
             VG_(printf)("\ntrc = %d\n", trc);
             VG_(core_panic)("VG_(scheduler), phase 3: "
index c4928d19ee5e6a3f29b4af58d0b4efe270226ca8..97281db84d2a16e180cabaf2a3d5a100c93e1f52 100644 (file)
@@ -1493,6 +1493,22 @@ void VG_(synth_fault)(ThreadId tid)
    synth_fault_common(tid, 0, 0x80);
 }
 
+// Synthesise a SIGILL.
+void VG_(synth_sigill)(ThreadId tid, Addr addr)
+{
+   vki_siginfo_t info;
+
+   vg_assert(VG_(threads)[tid].status == VgTs_Runnable);
+
+   info.si_signo = VKI_SIGILL;
+   info.si_code = 1; /* jrs: no idea what this should be */
+   info._sifields._sigfault._addr = (void*)addr;
+
+   VG_(resume_scheduler)(VKI_SIGILL, &info);
+   VG_(deliver_signal)(tid, &info, False);
+}
+
+
 void VG_(deliver_signal) ( ThreadId tid, const vki_siginfo_t *info, Bool async )
 {
    Int                 sigNo = info->si_signo;