svn commit: r256542 - head/sys/powerpc/aim

Justin Hibbits jhibbits at FreeBSD.org
Tue Oct 15 14:52:45 UTC 2013


Author: jhibbits
Date: Tue Oct 15 14:52:44 2013
New Revision: 256542
URL: http://svnweb.freebsd.org/changeset/base/256542

Log:
  Move the PMC handling to the first level interrupt handler where it belongs.
  Also add the pmc_hook use, to handle callchain tracing.
  
  MFC after:	1 week

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

Modified: head/sys/powerpc/aim/interrupt.c
==============================================================================
--- head/sys/powerpc/aim/interrupt.c	Tue Oct 15 14:46:37 2013	(r256541)
+++ head/sys/powerpc/aim/interrupt.c	Tue Oct 15 14:52:44 2013	(r256542)
@@ -31,6 +31,8 @@
  * Interrupts are dispatched to here from locore asm
  */
 
+#include "opt_hwpmc_hooks.h"
+
 #include <sys/cdefs.h>                  /* RCS ID & Copyright macro defns */
 
 #include <sys/param.h>
@@ -43,6 +45,9 @@
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/mutex.h>
+#ifdef HWPMC_HOOKS
+#include <sys/pmckern.h>
+#endif
 #include <sys/proc.h>
 #include <sys/smp.h>
 #include <sys/unistd.h>
@@ -96,6 +101,17 @@ powerpc_interrupt(struct trapframe *fram
 		atomic_subtract_int(&td->td_intr_nesting_level, 1);
 		critical_exit();
 		break;
+	case EXC_PERF:
+		critical_enter();
+		KASSERT(pmc_intr != NULL, ("Performance exception, but no handler!"));
+		(*pmc_intr)(PCPU_GET(cpuid), framep);
+		critical_enter();
+#ifdef HWPMC_HOOKS
+		if (pmc_hook && (PCPU_GET(curthread)->td_pflags & TDP_CALLCHAIN))
+			pmc_hook(PCPU_GET(curthread), PMC_FN_USER_CALLCHAIN, framep);
+#endif
+		critical_exit();
+		break;
 
 	default:
 		/* Re-enable interrupts if applicable. */

Modified: head/sys/powerpc/aim/trap.c
==============================================================================
--- head/sys/powerpc/aim/trap.c	Tue Oct 15 14:46:37 2013	(r256541)
+++ head/sys/powerpc/aim/trap.c	Tue Oct 15 14:52:44 2013	(r256542)
@@ -34,7 +34,6 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include "opt_hwpmc_hooks.h"
 #include "opt_kdtrace.h"
 
 #include <sys/param.h>
@@ -52,9 +51,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/uio.h>
 #include <sys/signalvar.h>
 #include <sys/vmmeter.h>
-#ifdef HWPMC_HOOKS
-#include <sys/pmckern.h>
-#endif
 
 #include <security/audit/audit.h>
 
@@ -195,14 +191,6 @@ trap(struct trapframe *frame)
 	CTR3(KTR_TRAP, "trap: %s type=%s (%s)", td->td_name,
 	    trapname(type), user ? "user" : "kernel");
 
-#ifdef HWPMC_HOOKS
-	if (type == EXC_PERF && (pmc_intr != NULL)) {
-		(*pmc_intr)(PCPU_GET(cpuid), frame);
-		if (user)
-			userret(td, frame);
-		return;
-	}
-#endif
 #ifdef KDTRACE_HOOKS
 	/*
 	 * A trap can occur while DTrace executes a probe. Before
@@ -292,7 +280,7 @@ trap(struct trapframe *frame)
 		case EXC_PGM:
 			/* Identify the trap reason */
 			if (frame->srr1 & EXC_PGM_TRAP)
-				sig = SIGTRAP;
+ 				sig = SIGTRAP;
 			else if (ppc_instr_emulate(frame) == 0)
 				frame->srr0 += 4;
 			else


More information about the svn-src-head mailing list