siginfo_t siginfo;
        int sig, code;
 
+       /* break.b always sets cr.iim to 0, which causes problems for
+        * debuggers.  Get the real break number from the original instruction,
+        * but only for kernel code.  User space break.b is left alone, to
+        * preserve the existing behaviour.  All break codings have the same
+        * format, so there is no need to check the slot type.
+        */
+       if (break_num == 0 && !user_mode(regs)) {
+               struct ia64_psr *ipsr = ia64_psr(regs);
+               unsigned long *bundle = (unsigned long *)regs->cr_iip;
+               unsigned long slot;
+               switch (ipsr->ri) {
+                     case 0:  slot = (bundle[0] >>  5); break;
+                     case 1:  slot = (bundle[0] >> 46) | (bundle[1] << 18); break;
+                     default: slot = (bundle[1] >> 23); break;
+               }
+               break_num = ((slot >> 36 & 1) << 20) | (slot >> 6 & 0xfffff);
+       }
+
        /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */
        siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri);
        siginfo.si_imm = break_num;