PERFORCE change 132678 for review
John Birrell
jb at FreeBSD.org
Sun Jan 6 23:22:28 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=132678
Change 132678 by jb at jb_freebsd1 on 2008/01/07 07:21:49
Add the hook to allow the dtrace module to process breakpoint
interrupts if it is loaded.
The Function Boundary Trace (fbt) and Statically Defined Trace (sdt)
providers trigger probes on amd64 by replacing the "pushl %ebp" and
'ret' opcodes with int3 (#BP, 0xcc) and then checking the trap
address against the list of installed probes. If the address has
a probe associated with it, the dtrace module calls it's probes
and the function that was broken by the breakpoint, then repairs
the trap frame and returns via 'doreti'.
In the case that the trap address isn't from a DTrace probe, the
return path takes execution back to the calltrap code and the
trap is handled in the usual way.
No doubt there is a simpler way to do this pointer ping pong.
Affected files ...
.. //depot/projects/dtrace/src/sys/amd64/amd64/exception.S#7 edit
Differences ...
==== //depot/projects/dtrace/src/sys/amd64/amd64/exception.S#7 (text+ko) ====
@@ -37,6 +37,7 @@
#include "opt_atpic.h"
#include "opt_compat.h"
#include "opt_hwpmc_hooks.h"
+#include "opt_kdtrace.h"
#include <machine/asmacros.h>
#include <machine/psl.h>
@@ -44,6 +45,27 @@
#include "assym.s"
+#ifdef KDTRACE_HOOKS
+ .bss
+ .globl dtrace_invop_jump_addr
+ .align 8
+ .type dtrace_invop_jump_addr, @object
+ .size dtrace_invop_jump_addr, 8
+dtrace_invop_jump_addr:
+ .zero 8
+ .globl dtrace_invop_calltrap_addr
+ .align 8
+ .type dtrace_invop_calltrap_addr, @object
+ .size dtrace_invop_calltrap_addr, 8
+dtrace_invop_calltrap_addr:
+ .zero 8
+ .globl dtrace_invop_return_addr
+ .align 8
+ .type dtrace_invop_return_addr, @object
+ .size dtrace_invop_return_addr, 8
+dtrace_invop_return_addr:
+ .zero 8
+#endif
.text
#ifdef HWPMC_HOOKS
ENTRY(start_exceptions)
@@ -170,6 +192,28 @@
movq %r14,TF_R14(%rsp)
movq %r15,TF_R15(%rsp)
FAKE_MCOUNT(TF_RIP(%rsp))
+#ifdef KDTRACE_HOOKS
+ /*
+ * DTrace Function Boundary Trace (fbt) and Statically Defined
+ * Trace (sdt) probes are triggered by int3 (0xcc) which causes
+ * the #BP (T_BPTFLT) breakpoint interrupt. For all other trap
+ * types, just handle them in the usual way.
+ */
+ cmpq $T_BPTFLT,TF_TRAPNO(%rsp)
+ jne calltrap
+
+ /* Check if there is no DTrace hook registered. */
+ cmpq $0,dtrace_invop_jump_addr
+ je calltrap
+
+ /* Set our alternate jump addresses for the jump back. */
+ movq $calltrap, dtrace_invop_calltrap_addr(%rip)
+ movq $doreti, dtrace_invop_return_addr(%rip)
+
+ /* Jump to the code hooked in by DTrace. */
+ movq dtrace_invop_jump_addr, %rax
+ jmpq *dtrace_invop_jump_addr
+#endif
.globl calltrap
.type calltrap, at function
calltrap:
More information about the p4-projects
mailing list