diff options
author | jhibbits <jhibbits@FreeBSD.org> | 2014-01-15 04:16:45 +0000 |
---|---|---|
committer | jhibbits <jhibbits@FreeBSD.org> | 2014-01-15 04:16:45 +0000 |
commit | 541949d319d897c3c628f5879ce9628087d2b581 (patch) | |
tree | 4ec54f60373263d8b52c519288826191e3591903 | |
parent | 95bb8ad4b6dc771b0a780d757a68f6a2c1f93ec4 (diff) | |
download | FreeBSD-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.c | 15 | ||||
-rw-r--r-- | sys/powerpc/aim/trap.c | 14 |
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 |