diff -ur valgrind-20030907/coregrind/vg_include.h valgrind-badinstr/coregrind/vg_include.h
--- valgrind-20030907/coregrind/vg_include.h	2003-08-05 19:02:32.000000000 +0100
+++ valgrind-badinstr/coregrind/vg_include.h	2003-09-11 13:30:45.000000000 +0100
@@ -1282,6 +1282,7 @@
 extern void VG_(unload_symbols)       ( Addr start, UInt length );
 
 extern Bool VG_(get_fnname_nodemangle)( Addr a, Char* fnname, Int n_fnname );
+extern void VG_(describe_eip)         ( Addr eip, Char* buf, Int nbuf );
 extern void VG_(mini_stack_dump)      ( ExeContext* ec );
 extern Int  VG_(setup_code_redirect_table) ( void );
 
diff -ur valgrind-20030907/coregrind/vg_symtab2.c valgrind-badinstr/coregrind/vg_symtab2.c
--- valgrind-20030907/coregrind/vg_symtab2.c	2003-08-05 19:02:33.000000000 +0100
+++ valgrind-badinstr/coregrind/vg_symtab2.c	2003-09-11 13:32:11.000000000 +0100
@@ -2286,13 +2286,13 @@
 }
 
 
-/* Print a mini stack dump, showing the current location. */
-void VG_(mini_stack_dump) ( ExeContext* ec )
+/* Map a code address to a description of the address */
+void VG_(describe_eip) ( Addr eip, Char* buf, Int nbuf )
 {
 
 #define APPEND(str)                                              \
    { UChar* sss;                                                 \
-     for (sss = str; n < M_VG_ERRTXT-1 && *sss != 0; n++,sss++)  \
+     for (sss = str; n < nbuf-1 && *sss != 0; n++,sss++)  \
         buf[n] = *sss;                                           \
      buf[n] = 0;                                                 \
    }
@@ -2304,11 +2304,50 @@
    UChar  ibuf[20];
    UInt   i, n;
 
-   UChar  buf[M_VG_ERRTXT];
    UChar  buf_fn[M_VG_ERRTXT];
    UChar  buf_obj[M_VG_ERRTXT];
    UChar  buf_srcloc[M_VG_ERRTXT];
 
+   n = 0;
+   know_fnname  = VG_(get_fnname) (eip, buf_fn,  M_VG_ERRTXT);
+   know_objname = VG_(get_objname)(eip, buf_obj, M_VG_ERRTXT);
+   know_srcloc  = VG_(get_filename_linenum)(eip, buf_srcloc, M_VG_ERRTXT, &lineno);
+      
+   VG_(sprintf)(ibuf,"0x%x: ", eip);
+   APPEND(ibuf);
+   if (know_fnname) { 
+      APPEND(buf_fn);
+      if (!know_srcloc && know_objname) {
+         APPEND(" (in ");
+         APPEND(buf_obj);
+         APPEND(")");
+      }
+   } else if (know_objname && !know_srcloc) {
+      APPEND("(within ");
+      APPEND(buf_obj);
+      APPEND(")");
+   } else {
+      APPEND("???");
+   }
+   if (know_srcloc) {
+      APPEND(" (");
+      APPEND(buf_srcloc);
+      APPEND(":");
+      VG_(sprintf)(ibuf,"%d",lineno);
+      APPEND(ibuf);
+      APPEND(")");
+   }
+}
+
+#undef APPEND
+
+/* Print a mini stack dump, showing the current location. */
+void VG_(mini_stack_dump) ( ExeContext* ec )
+{
+   UInt   i;
+
+   UChar  buf[M_VG_ERRTXT];
+
    Int stop_at = VG_(clo_backtrace_size);
 
    vg_assert(stop_at > 0);
@@ -2316,47 +2355,18 @@
    i = 0;
    do {
       Addr eip = ec->eips[i];
-      n = 0;
       if (i > 0)
 	 eip--;			/* point to calling line */
-      know_fnname  = VG_(get_fnname) (eip, buf_fn,  M_VG_ERRTXT);
-      know_objname = VG_(get_objname)(eip, buf_obj, M_VG_ERRTXT);
-      know_srcloc  = VG_(get_filename_linenum)(eip, buf_srcloc, M_VG_ERRTXT, 
-                                               &lineno);
-      if (i == 0) APPEND("   at ") else APPEND("   by ");
-      
-      VG_(sprintf)(ibuf,"0x%x: ", eip);
-      APPEND(ibuf);
-      if (know_fnname) { 
-         APPEND(buf_fn);
-         if (!know_srcloc && know_objname) {
-            APPEND(" (in ");
-            APPEND(buf_obj);
-            APPEND(")");
-         }
-      } else if (know_objname && !know_srcloc) {
-         APPEND("(within ");
-         APPEND(buf_obj);
-         APPEND(")");
-      } else {
-         APPEND("???");
-      }
-      if (know_srcloc) {
-         APPEND(" (");
-         APPEND(buf_srcloc);
-         APPEND(":");
-         VG_(sprintf)(ibuf,"%d",lineno);
-         APPEND(ibuf);
-         APPEND(")");
-      }
-      VG_(message)(Vg_UserMsg, "%s", buf);
+      VG_(describe_eip)(eip, buf, M_VG_ERRTXT);
+      if (i == 0)
+         VG_(message)(Vg_UserMsg, "   at %s", buf);
+      else
+         VG_(message)(Vg_UserMsg, "   by %s", buf);
       i++;
 
    } while (i < (UInt)stop_at && ec->eips[i] != 0);
 }
 
-#undef APPEND
-
 
 /*------------------------------------------------------------*/
 /*--- Find interesting glibc entry points.                 ---*/
diff -ur valgrind-20030907/coregrind/vg_to_ucode.c valgrind-badinstr/coregrind/vg_to_ucode.c
--- valgrind-20030907/coregrind/vg_to_ucode.c	2003-08-05 19:02:33.000000000 +0100
+++ valgrind-badinstr/coregrind/vg_to_ucode.c	2003-09-11 13:30:45.000000000 +0100
@@ -3578,6 +3578,7 @@
    Int   t1, t2, t3, t4;
    UChar dis_buf[50];
    Int   am_sz, d_sz;
+   UChar loc_buf[M_VG_ERRTXT];
 
    /* Holds eip at the start of the insn, so that we can print
       consistent error messages for unimplemented insns. */
@@ -6265,7 +6266,9 @@
                (Int)eip_start[1],
                (Int)eip_start[2],
                (Int)eip_start[3] );
-
+   VG_(describe_eip)(eip, loc_buf, M_VG_ERRTXT);
+   VG_(printf)("          at %s\n", loc_buf);
+   
    uInstr0(cb, CALLM_S, 0);
    uInstr1(cb, CALLM,   0, Lit16, 
                VGOFF_(helper_undefined_instruction));
