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-all mailing list