diff options
author | jkoshy <jkoshy@FreeBSD.org> | 2007-12-07 08:20:17 +0000 |
---|---|---|
committer | jkoshy <jkoshy@FreeBSD.org> | 2007-12-07 08:20:17 +0000 |
commit | 72c27d71d82569aec187c30f6ff208631abc02f4 (patch) | |
tree | fa5327bc9f466a5a1b4e68e43a72d22b1b35f5e5 /sys/kern/subr_trap.c | |
parent | 12b5f9c8c99a01b1d40e88aaa1a58ce757e68d5e (diff) | |
download | FreeBSD-src-72c27d71d82569aec187c30f6ff208631abc02f4.zip FreeBSD-src-72c27d71d82569aec187c30f6ff208631abc02f4.tar.gz |
Kernel and hwpmc(4) support for callchain capture.
Sponsored by: FreeBSD Foundation and Google Inc.
Diffstat (limited to 'sys/kern/subr_trap.c')
-rw-r--r-- | sys/kern/subr_trap.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index 355faf2..d8168af 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -2,10 +2,14 @@ * Copyright (C) 1994, David Greenman * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. + * Copyright (c) 2007 The FreeBSD Foundation * * This code is derived from software contributed to Berkeley by * the University of Utah, and William Jolitz. * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -40,6 +44,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include "opt_hwpmc_hooks.h" #include "opt_ktrace.h" #include "opt_mac.h" #ifdef __i386__ @@ -52,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include <sys/kernel.h> #include <sys/lock.h> #include <sys/mutex.h> +#include <sys/pmckern.h> #include <sys/proc.h> #include <sys/ktr.h> #include <sys/resourcevar.h> @@ -201,6 +207,13 @@ ast(struct trapframe *framep) td->td_profil_ticks = 0; td->td_pflags &= ~TDP_OWEUPC; } +#if defined(HWPMC_HOOKS) + if (td->td_pflags & TDP_CALLCHAIN) { + PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_USER_CALLCHAIN, + (void *) framep); + td->td_pflags &= ~TDP_CALLCHAIN; + } +#endif if (flags & TDF_ALRMPEND) { PROC_LOCK(p); psignal(p, SIGVTALRM); |