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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to