summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhibbits <jhibbits@FreeBSD.org>2014-01-15 04:16:45 +0000
committerjhibbits <jhibbits@FreeBSD.org>2014-01-15 04:16:45 +0000
commit541949d319d897c3c628f5879ce9628087d2b581 (patch)
tree4ec54f60373263d8b52c519288826191e3591903
parent95bb8ad4b6dc771b0a780d757a68f6a2c1f93ec4 (diff)
downloadFreeBSD-src-541949d319d897c3c628f5879ce9628087d2b581.zip
FreeBSD-src-541949d319d897c3c628f5879ce9628087d2b581.tar.gz
MFC r256542,r256581
Move the PMC handling to the first level interrupt handler where it belongs. Also add the pmc_hook use, to handle callchain tracing.
-rw-r--r--sys/powerpc/aim/interrupt.c15
-rw-r--r--sys/powerpc/aim/trap.c14
2 files changed, 16 insertions, 13 deletions
diff --git a/sys/powerpc/aim/interrupt.c b/sys/powerpc/aim/interrupt.c
index d1e3655..1db565c 100644
--- a/sys/powerpc/aim/interrupt.c
+++ b/sys/powerpc/aim/interrupt.c
@@ -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,16 @@ powerpc_interrupt(struct trapframe *framep)
atomic_subtract_int(&td->td_intr_nesting_level, 1);
critical_exit();
break;
+#ifdef HWPMC_HOOKS
+ case EXC_PERF:
+ critical_enter();
+ KASSERT(pmc_intr != NULL, ("Performance exception, but no handler!"));
+ (*pmc_intr)(PCPU_GET(cpuid), framep);
+ if (pmc_hook && (PCPU_GET(curthread)->td_pflags & TDP_CALLCHAIN))
+ pmc_hook(PCPU_GET(curthread), PMC_FN_USER_CALLCHAIN, framep);
+ critical_exit();
+ break;
+#endif
default:
/* Re-enable interrupts if applicable. */
diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c
index 2edbbfa..d31e47b 100644
--- a/sys/powerpc/aim/trap.c
+++ b/sys/powerpc/aim/trap.c
@@ -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
OpenPOWER on IntegriCloud