svn commit: r333570 - head/sys/cddl/dev/dtrace/aarch64

Mark Johnston markj at FreeBSD.org
Sat May 12 15:35:27 UTC 2018


Author: markj
Date: Sat May 12 15:35:26 2018
New Revision: 333570
URL: https://svnweb.freebsd.org/changeset/base/333570

Log:
  DTrace aarch64: Avoid calling unwind_frame() in the probe context.
  
  unwind_frame() may be instrumented by FBT, leading to recursion into
  dtrace_probe(). Manually inline unwind_frame() as we do with stack
  unwinding code for other architectures.
  
  Submitted by:	Domagoj Stolfa
  Reviewed by:	manu
  MFC after:	1 week
  Sponsored by:	DARPA / AFRL
  Differential Revision:	https://reviews.freebsd.org/D15359

Modified:
  head/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c

Modified: head/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c
==============================================================================
--- head/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c	Sat May 12 15:34:35 2018	(r333569)
+++ head/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c	Sat May 12 15:35:26 2018	(r333570)
@@ -70,7 +70,7 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, in
 {
 	struct unwind_state state;
 	int scp_offset;
-	register_t sp;
+	register_t sp, fp;
 	int depth;
 
 	depth = 0;
@@ -88,11 +88,15 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, in
 	state.pc = (uint64_t)dtrace_getpcstack;
 
 	while (depth < pcstack_limit) {
-		if (unwind_frame(&state))
-			break;
-
 		if (!INKERNEL(state.pc) || !INKERNEL(state.fp))
 			break;
+
+		fp = state.fp;
+		state.sp = fp + 0x10;
+		/* FP to previous frame (X29) */
+		state.fp = *(register_t *)(fp);
+		/* LR (X30) */
+		state.pc = *(register_t *)(fp + 8) - 4;
 
 		/*
 		 * NB: Unlike some other architectures, we don't need to


More information about the svn-src-all mailing list