Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/mips/mips Basic dtrace trap support.



details:   https://anonhg.NetBSD.org/src/rev/3cc966785e4a
branches:  trunk
changeset: 954395:3cc966785e4a
user:      simonb <simonb%NetBSD.org@localhost>
date:      Wed Apr 07 02:59:01 2021 +0000

description:
Basic dtrace trap support.

Mostly from FreeBSD.

diffstat:

 sys/arch/mips/mips/trap.c |  57 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 44 insertions(+), 13 deletions(-)

diffs (100 lines):

diff -r 991aff491918 -r 3cc966785e4a sys/arch/mips/mips/trap.c
--- a/sys/arch/mips/mips/trap.c Wed Apr 07 02:43:12 2021 +0000
+++ b/sys/arch/mips/mips/trap.c Wed Apr 07 02:59:01 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: trap.c,v 1.260 2021/03/29 03:22:17 simonb Exp $        */
+/*     $NetBSD: trap.c,v 1.261 2021/04/07 02:59:01 simonb Exp $        */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.260 2021/03/29 03:22:17 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.261 2021/04/07 02:59:01 simonb Exp $");
 
 #include "opt_cputype.h"       /* which mips CPU levels do we support? */
 #include "opt_ddb.h"
@@ -83,6 +83,16 @@
 #include <sys/kgdb.h>
 #endif
 
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+
+/* Not used for now, but needed for dtrace/fbt modules */
+dtrace_doubletrap_func_t       dtrace_doubletrap_func = NULL;
+dtrace_trap_func_t             dtrace_trap_func = NULL;
+
+int                            (* dtrace_invop_jump_addr)(struct trapframe *);
+#endif /* KDTRACE_HOOKS */
+
 const char * const trap_names[] = {
        "external interrupt",
        "TLB modification",
@@ -187,6 +197,30 @@
                LWP_CACHE_CREDS(l, p);
        }
 
+#ifdef KDTRACE_HOOKS
+       /*
+        * A trap can occur while DTrace executes a probe. Before
+        * executing the probe, DTrace blocks re-scheduling and sets
+        * a flag in its per-cpu flags to indicate that it doesn't
+        * want to fault. On returning from the probe, the no-fault
+        * flag is cleared and finally re-scheduling is enabled.
+        *
+        * If the DTrace kernel module has registered a trap handler,
+        * call it and if it returns non-zero, assume that it has
+        * handled the trap and modified the trap frame so that this
+        * function can return normally.
+        */
+       /*
+        * XXXDTRACE: add pid probe handler here (if ever)
+        */
+       if (!USERMODE(status)) {
+               if ((dtrace_trap_func != NULL) &&
+                   ((*dtrace_trap_func)(tf, type) != 0)) {
+                       return;
+               }
+       }
+#endif /* KDTRACE_HOOKS */
+
        switch (type) {
        default:
        dopanic:
@@ -518,8 +552,15 @@
                }
                break; /* SIGNAL */
 
+       case T_BREAK:
+#ifdef KDTRACE_HOOKS
+               if ((dtrace_invop_jump_addr != NULL) &&
+                   (dtrace_invop_jump_addr(tf) == 0)) {
+                       return;
+               }
+#endif /* KDTRACE_HOOKS */
+               /* FALLTHROUGH */
        case T_WATCH:
-       case T_BREAK:
 #if defined(DDB)
                kdb_trap(type, &tf->tf_registers);
                return; /* KERN */
@@ -805,16 +846,6 @@
        return 0;
 }
 
-#ifdef KDTRACE_HOOKS
-#include <sys/dtrace_bsd.h>
-
-/* Not used for now, but needed for dtrace/fbt modules */
-dtrace_doubletrap_func_t       dtrace_doubletrap_func = NULL;
-dtrace_trap_func_t             dtrace_trap_func = NULL;
-
-int                            (* dtrace_invop_jump_addr)(struct trapframe *);
-#endif /* KDTRACE_HOOKS */
-
 #ifdef TRAP_SIGDEBUG
 static void
 frame_dump(const struct trapframe *tf, struct pcb *pcb)



Home | Main Index | Thread Index | Old Index