svn commit: r269701 - head/sys/powerpc/aim
Justin Hibbits
jhibbits at FreeBSD.org
Fri Aug 8 06:22:33 UTC 2014
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:
More information about the svn-src-head
mailing list