Author: jhibbits
Date: Fri Aug  8 06:22:32 2014
New Revision: 269701
URL: http://svnweb.freebsd.org/changeset/base/269701

Log:
  Set the si_code appropriately for exception-caused signals.
  
  LLDB checks the si_code, and aborts if a code isn't known.
  
  MFC after:    2 weeks
  Relnotes:     yes

Modified:
  head/sys/powerpc/aim/trap.c

Modified: head/sys/powerpc/aim/trap.c
==============================================================================
--- head/sys/powerpc/aim/trap.c Fri Aug  8 03:49:01 2014        (r269700)
+++ head/sys/powerpc/aim/trap.c Fri Aug  8 06:22:32 2014        (r269701)
@@ -192,6 +192,7 @@ trap(struct trapframe *frame)
                case EXC_TRC:
                        frame->srr1 &= ~PSL_SE;
                        sig = SIGTRAP;
+                       ucode = TRAP_TRACE;
                        break;
 
 #ifdef __powerpc64__
@@ -199,13 +200,17 @@ trap(struct trapframe *frame)
                case EXC_DSE:
                        if (handle_user_slb_spill(&p->p_vmspace->vm_pmap,
                            (type == EXC_ISE) ? frame->srr0 :
-                           frame->cpu.aim.dar) != 0)
+                           frame->cpu.aim.dar) != 0) {
                                sig = SIGSEGV;
+                               ucode = SEGV_MAPERR;
+                       }
                        break;
 #endif
                case EXC_DSI:
                case EXC_ISI:
                        sig = trap_pfault(frame, 1);
+                       if (sig == SIGSEGV)
+                               ucode = SEGV_MAPERR;
                        break;
 
                case EXC_SC:
@@ -240,8 +245,10 @@ trap(struct trapframe *frame)
                        break;
 
                case EXC_ALI:
-                       if (fix_unaligned(td, frame) != 0)
+                       if (fix_unaligned(td, frame) != 0) {
                                sig = SIGBUS;
+                               ucode = BUS_ADRALN;
+                       }
                        else
                                frame->srr0 += 4;
                        break;
@@ -259,8 +266,16 @@ trap(struct trapframe *frame)
                                }
 #endif
                                sig = SIGTRAP;
+                               ucode = TRAP_BRKPT;
                        } else {
                                sig = ppc_instr_emulate(frame, td->td_pcb);
+                               if (sig == SIGILL) {
+                                       if (frame->srr1 & EXC_PGM_PRIV)
+                                               ucode = ILL_PRVOPC;
+                                       else if (frame->srr1 & EXC_PGM_ILLEGAL)
+                                               ucode = ILL_ILLOPC;
+                               } else if (sig == SIGFPE)
+                                       ucode = FPE_FLTINV;     /* Punt for 
now, invalid operation. */
                        }
                        break;
 
@@ -271,6 +286,7 @@ trap(struct trapframe *frame)
                         * but it at least prevents the kernel from dying.
                         */
                        sig = SIGBUS;
+                       ucode = BUS_OBJERR;
                        break;
 
                default:
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to