Author: jhibbits
Date: Sat Nov 29 20:54:33 2014
New Revision: 275268
URL: https://svnweb.freebsd.org/changeset/base/275268

Log:
  Add support for dtrace:fbt on modules for PowerPC
  
  Summary:
  Revert the initial FBT-with-KDB changes for trap_subr*.S, and instead use the
  db_trap filter function to handle dtrace trap filtering.  With this, the MMU 
is
  enabled by the support code, simplifying the codepath altogether.
  
  Test Plan: Tested on my G4 PowerBook
  
  Reviewers: #powerpc, nwhitehorn
  
  Reviewed By: nwhitehorn
  
  Differential Revision: https://reviews.freebsd.org/D1207
  
  MFC after:    3 weeks

Modified:
  head/sys/powerpc/aim/machdep.c
  head/sys/powerpc/aim/trap.c
  head/sys/powerpc/aim/trap_subr32.S
  head/sys/powerpc/aim/trap_subr64.S
  head/sys/powerpc/include/trap.h

Modified: head/sys/powerpc/aim/machdep.c
==============================================================================
--- head/sys/powerpc/aim/machdep.c      Sat Nov 29 20:24:18 2014        
(r275267)
+++ head/sys/powerpc/aim/machdep.c      Sat Nov 29 20:54:33 2014        
(r275268)
@@ -757,6 +757,10 @@ db_trap_glue(struct trapframe *frame)
                || frame->exc == EXC_BPT
                || frame->exc == EXC_DSI)) {
                int type = frame->exc;
+
+               /* Ignore DTrace traps. */
+               if (*(uint32_t *)frame->srr0 == EXC_DTRACE) 
+                       return (0);
                if (type == EXC_PGM && (frame->srr1 & 0x20000)) {
                        type = T_BREAKPOINT;
                }

Modified: head/sys/powerpc/aim/trap.c
==============================================================================
--- head/sys/powerpc/aim/trap.c Sat Nov 29 20:24:18 2014        (r275267)
+++ head/sys/powerpc/aim/trap.c Sat Nov 29 20:54:33 2014        (r275268)
@@ -258,7 +258,8 @@ trap(struct trapframe *frame)
                        if (frame->srr1 & EXC_PGM_TRAP) {
 #ifdef KDTRACE_HOOKS
                                inst = fuword32((const void *)frame->srr0);
-                               if (inst == 0x0FFFDDDD && dtrace_pid_probe_ptr 
!= NULL) {
+                               if (inst == 0x0FFFDDDD &&
+                                   dtrace_pid_probe_ptr != NULL) {
                                        struct reg regs;
                                        fill_regs(td, &regs);
                                        (*dtrace_pid_probe_ptr)(&regs);
@@ -301,7 +302,7 @@ trap(struct trapframe *frame)
 #ifdef KDTRACE_HOOKS
                case EXC_PGM:
                        if (frame->srr1 & EXC_PGM_TRAP) {
-                               if (*(uint32_t *)frame->srr0 == 0x7c810808) {
+                               if (*(uint32_t *)frame->srr0 == EXC_DTRACE) {
                                        if (dtrace_invop_jump_addr != NULL) {
                                                dtrace_invop_jump_addr(frame);
                                                return;

Modified: head/sys/powerpc/aim/trap_subr32.S
==============================================================================
--- head/sys/powerpc/aim/trap_subr32.S  Sat Nov 29 20:24:18 2014        
(r275267)
+++ head/sys/powerpc/aim/trap_subr32.S  Sat Nov 29 20:54:33 2014        
(r275268)
@@ -890,8 +890,7 @@ CNAME(dblow):
        mfcr    %r29                    /* save CR in r29 */
        mfsrr1  %r1
        mtcr    %r1
-       bf      17,2f                   /* branch if privileged */
-1:
+       bf      17,1f                   /* branch if privileged */
        /* Unprivileged case */
        mtcr    %r29                    /* put the condition register back */
         mfsprg2        %r29                    /* ... and r29 */
@@ -900,19 +899,7 @@ CNAME(dblow):
        li      %r1, 0                  /* How to get the vector from LR */
 
         bla     generictrap            /* and we look like a generic trap */
-2:
-#ifdef KDTRACE_HOOKS
-       /* Privileged, so drop to KDB */
-       mfsrr0  %r1
-       mtsprg3 %r3
-       lwz     %r1,0(%r1)
-       /* Check if it's a DTrace trap. */
-       li      %r3,0x0808
-       addis   %r3,%r3,0x7c81
-       cmplw   %cr0,%r3,%r1
-       mfsprg3 %r3
-       beq     %cr0,1b
-#endif
+1:
        /* Privileged, so drop to KDB */
        GET_CPUINFO(%r1)
        stw     %r28,(PC_DBSAVE+CPUSAVE_R28)(%r1)       /* free r28 */

Modified: head/sys/powerpc/aim/trap_subr64.S
==============================================================================
--- head/sys/powerpc/aim/trap_subr64.S  Sat Nov 29 20:24:18 2014        
(r275267)
+++ head/sys/powerpc/aim/trap_subr64.S  Sat Nov 29 20:54:33 2014        
(r275268)
@@ -799,9 +799,8 @@ CNAME(dblow):
        mfcr    %r29                    /* save CR in r29 */
        mfsrr1  %r1
        mtcr    %r1
-       bf      17,2f                   /* branch if privileged */
+       bf      17,1f                   /* branch if privileged */
 
-1:
        /* Unprivileged case */
        mtcr    %r29                    /* put the condition register back */
         mfsprg2        %r29                    /* ... and r29 */
@@ -810,19 +809,7 @@ CNAME(dblow):
        li      %r1, 0                  /* How to get the vector from LR */
 
         bla     generictrap            /* and we look like a generic trap */
-2:
-#ifdef KDTRACE_HOOKS
-       /* Privileged, so drop to KDB */
-       mfsrr0  %r1
-       mtsprg3 %r3
-       lwz     %r1,0(%r1)
-       /* Check if it's a DTrace trap. */
-       li      %r3,0x0808
-       addis   %r3,%r3,0x7c81
-       cmplw   %cr0,%r3,%r1
-       mfsprg3 %r3
-       beq     %cr0,1b
-#endif
+1:
        GET_CPUINFO(%r1)
        std     %r27,(PC_DBSAVE+CPUSAVE_R27)(%r1)       /* free r27 */
        std     %r28,(PC_DBSAVE+CPUSAVE_R28)(%r1)       /* free r28 */

Modified: head/sys/powerpc/include/trap.h
==============================================================================
--- head/sys/powerpc/include/trap.h     Sat Nov 29 20:24:18 2014        
(r275267)
+++ head/sys/powerpc/include/trap.h     Sat Nov 29 20:54:33 2014        
(r275268)
@@ -120,6 +120,9 @@
 #define        EXC_PGM_PRIV            (1UL << 18)
 #define        EXC_PGM_TRAP            (1UL << 17)
 
+/* DTrace trap opcode. */
+#define EXC_DTRACE     0x7c810808
+
 #ifndef LOCORE
 struct trapframe;
 struct pcb;
_______________________________________________
[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