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
This commit is contained in:
parent
a0c68431a2
commit
3b8af4143e
@ -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 *framep)
|
||||
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. */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user