diff --git a/sys/cddl/dev/fbt/aarch64/fbt_isa.c b/sys/cddl/dev/fbt/aarch64/fbt_isa.c
index 07f02e2edb72..26d750bf540c 100644
--- a/sys/cddl/dev/fbt/aarch64/fbt_isa.c
+++ b/sys/cddl/dev/fbt/aarch64/fbt_isa.c
@@ -1,242 +1,240 @@
 /*
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
  * Common Development and Distribution License (the "License").
  * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  * If applicable, add the following below this CDDL HEADER, with the
  * fields enclosed by brackets "[]" replaced with your own identifying
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  *
  * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
  * Portions Copyright 2013 Justin Hibbits jhibbits@freebsd.org
  * Portions Copyright 2013 Howard Su howardsu@freebsd.org
  * Portions Copyright 2015 Ruslan Bukin 
  *
  * $FreeBSD$
  */
 
 /*
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #include 
 #include 
 
 #include 
 
 #include "fbt.h"
 
 #define	AARCH64_BRK		0xd4200000
 #define	AARCH64_BRK_IMM16_SHIFT	5
 #define	AARCH64_BRK_IMM16_VAL	(0x40d << AARCH64_BRK_IMM16_SHIFT)
 #define	FBT_PATCHVAL		(AARCH64_BRK | AARCH64_BRK_IMM16_VAL)
-#define	FBT_ENTRY	"entry"
-#define	FBT_RETURN	"return"
 #define	FBT_AFRAMES	4
 
 int
 fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval)
 {
 	solaris_cpu_t *cpu;
 	fbt_probe_t *fbt;
 
 	cpu = &solaris_cpu[curcpu];
 	fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
 
 	for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
 		if ((uintptr_t)fbt->fbtp_patchpoint != addr)
 			continue;
 
 		cpu->cpu_dtrace_caller = addr;
 
 		if (fbt->fbtp_roffset == 0) {
 			dtrace_probe(fbt->fbtp_id, frame->tf_x[0],
 			    frame->tf_x[1], frame->tf_x[2],
 			    frame->tf_x[3], frame->tf_x[4]);
 		} else {
 			dtrace_probe(fbt->fbtp_id, fbt->fbtp_roffset, rval,
 			    0, 0, 0);
 		}
 		cpu->cpu_dtrace_caller = 0;
 		return (fbt->fbtp_savedval);
 	}
 
 	return (0);
 }
 
 void
 fbt_patch_tracepoint(fbt_probe_t *fbt, fbt_patchval_t val)
 {
 	vm_offset_t addr;
 
 	if (!arm64_get_writable_addr((vm_offset_t)fbt->fbtp_patchpoint, &addr))
 		panic("%s: Unable to write new instruction", __func__);
 
 	*(fbt_patchval_t *)addr = val;
 	cpu_icache_sync_range((vm_offset_t)fbt->fbtp_patchpoint, 4);
 }
 
 int
 fbt_provide_module_function(linker_file_t lf, int symindx,
     linker_symval_t *symval, void *opaque)
 {
 	fbt_probe_t *fbt, *retfbt;
 	uint32_t *target, *start;
 	uint32_t *instr, *limit;
 	const char *name;
 	char *modname;
 	bool found;
 	int offs;
 
 	modname = opaque;
 	name = symval->name;
 
 	/* Check if function is excluded from instrumentation */
 	if (fbt_excluded(name))
 		return (0);
 
 	/*
 	 * Instrumenting certain exception handling functions can lead to FBT
 	 * recursion, so exclude from instrumentation.
 	 */
 	 if (strcmp(name, "handle_el1h_sync") == 0 ||
 	    strcmp(name, "do_el1h_sync") == 0)
 		return (1);
 
 	instr = (uint32_t *)(symval->value);
 	limit = (uint32_t *)(symval->value + symval->size);
 
 	/*
 	 * Ignore any bti instruction at the start of the function
 	 * we need to keep it there for any indirect branches calling
 	 * the function on Armv8.5+
 	 */
 	if ((*instr & BTI_MASK) == BTI_INSTR)
 		instr++;
 
 	/* Look for stp (pre-indexed) operation */
 	found = false;
 	/*
 	 * If the first instruction is a nop it's a specially marked
 	 * asm function. We only support a nop first as it's not a normal
 	 * part of the function prologue.
 	 */
 	if (*instr == NOP_INSTR)
 		found = true;
 	if (!found) {
 		for (; instr < limit; instr++) {
 			/*
 			 * Some functions start with
 			 * "stp xt1, xt2, [xn, ]!"
 			 */
 			if ((*instr & LDP_STP_MASK) == STP_64) {
 				/*
 				 * Assume any other store of this type means we
 				 * are past the function prolog.
 				 */
 				if (((*instr >> ADDR_SHIFT) & ADDR_MASK) == 31)
 					found = true;
 				break;
 			}
 
 			/*
 			 * Some functions start with a "sub sp, sp, "
 			 * Sometimes the compiler will have a sub instruction
 			 * that is not of the above type so don't stop if we
 			 * see one.
 			 */
 			if ((*instr & SUB_MASK) == SUB_INSTR &&
 			    ((*instr >> SUB_RD_SHIFT) & SUB_R_MASK) == 31 &&
 			    ((*instr >> SUB_RN_SHIFT) & SUB_R_MASK) == 31) {
 				found = true;
 				break;
 			}
 		}
 	}
 
 	if (!found)
 		return (0);
 
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 	    name, FBT_ENTRY, FBT_AFRAMES, fbt);
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_PATCHVAL;
 	if ((*instr & SUB_MASK) == SUB_INSTR)
 		fbt->fbtp_rval = DTRACE_INVOP_SUB;
 	else
 		fbt->fbtp_rval = DTRACE_INVOP_STP;
 	fbt->fbtp_symindx = symindx;
 
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	retfbt = NULL;
 again:
 	for (; instr < limit; instr++) {
 		if (*instr == RET_INSTR)
 			break;
 		else if ((*instr & B_MASK) == B_INSTR) {
 			offs = (*instr & B_DATA_MASK);
 			offs *= 4;
 			target = (instr + offs);
 			start = (uint32_t *)symval->value;
 			if (target >= limit || target < start)
 				break;
 		}
 	}
 
 	if (instr >= limit)
 		return (0);
 
 	/*
 	 * We have a winner!
 	 */
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	if (retfbt == NULL) {
 		fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 		    name, FBT_RETURN, FBT_AFRAMES, fbt);
 	} else {
 		retfbt->fbtp_probenext = fbt;
 		fbt->fbtp_id = retfbt->fbtp_id;
 	}
 	retfbt = fbt;
 
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_symindx = symindx;
 	if ((*instr & B_MASK) == B_INSTR)
 		fbt->fbtp_rval = DTRACE_INVOP_B;
 	else
 		fbt->fbtp_rval = DTRACE_INVOP_RET;
 	fbt->fbtp_roffset = (uintptr_t)instr - (uintptr_t)symval->value;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_PATCHVAL;
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	instr++;
 	goto again;
 }
diff --git a/sys/cddl/dev/fbt/arm/fbt_isa.c b/sys/cddl/dev/fbt/arm/fbt_isa.c
index 0be28b56aa6a..d52809c9f227 100644
--- a/sys/cddl/dev/fbt/arm/fbt_isa.c
+++ b/sys/cddl/dev/fbt/arm/fbt_isa.c
@@ -1,196 +1,193 @@
 /*
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
  * Common Development and Distribution License (the "License").
  * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  * If applicable, add the following below this CDDL HEADER, with the
  * fields enclosed by brackets "[]" replaced with your own identifying
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  *
  * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
  * Portions Copyright 2013 Justin Hibbits jhibbits@freebsd.org
  * Portions Copyright 2013 Howard Su howardsu@freebsd.org
  *
  * $FreeBSD$
  *
  */
 
 /*
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #include 
 #include 
 
 #include 
 #include 
 #include 
 
 #include "fbt.h"
 
 #define	FBT_PUSHM		0xe92d0000
 #define	FBT_POPM		0xe8bd0000
 #define	FBT_JUMP		0xea000000
 #define	FBT_SUBSP		0xe24dd000
 
-#define	FBT_ENTRY	"entry"
-#define	FBT_RETURN	"return"
-
 int
 fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval)
 {
 	solaris_cpu_t *cpu = &solaris_cpu[curcpu];
 	fbt_probe_t *fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
 	register_t fifthparam;
 
 	for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
 		if ((uintptr_t)fbt->fbtp_patchpoint != addr)
 			continue;
 
 		cpu->cpu_dtrace_caller = addr;
 
 		if (fbt->fbtp_roffset == 0) {
 			/* Get 5th parameter from stack */
 			DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
 			fifthparam = *(register_t *)frame->tf_svc_sp;
 			DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT | CPU_DTRACE_BADADDR);
 
 			dtrace_probe(fbt->fbtp_id, frame->tf_r0,
 			    frame->tf_r1, frame->tf_r2,
 			    frame->tf_r3, fifthparam);
 		} else {
 			dtrace_probe(fbt->fbtp_id, fbt->fbtp_roffset, rval,
 			    0, 0, 0);
 		}
 
 		cpu->cpu_dtrace_caller = 0;
 		return (fbt->fbtp_rval | (fbt->fbtp_savedval << DTRACE_INVOP_SHIFT));
 	}
 
 	return (0);
 }
 
 void
 fbt_patch_tracepoint(fbt_probe_t *fbt, fbt_patchval_t val)
 {
 
 	*fbt->fbtp_patchpoint = val;
 	icache_sync((vm_offset_t)fbt->fbtp_patchpoint, sizeof(val));
 }
 
 int
 fbt_provide_module_function(linker_file_t lf, int symindx,
     linker_symval_t *symval, void *opaque)
 {
 	char *modname = opaque;
 	const char *name = symval->name;
 	fbt_probe_t *fbt, *retfbt;
 	uint32_t *instr, *limit;
 	int popm;
 
 	if (fbt_excluded(name))
 		return (0);
 
 	instr = (uint32_t *)symval->value;
 	limit = (uint32_t *)(symval->value + symval->size);
 
 	/*
 	 * va_arg functions has first instruction of
 	 * sub sp, sp, #?
 	 */
 	if ((*instr & 0xfffff000) == FBT_SUBSP)
 		instr++;
 
 	/*
 	 * check if insn is a pushm with LR
 	 */
 	if ((*instr & 0xffff0000) != FBT_PUSHM ||
 	    (*instr & (1 << LR)) == 0)
 		return (0);
 
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 	    name, FBT_ENTRY, 2, fbt);
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_BREAKPOINT;
 	fbt->fbtp_rval = DTRACE_INVOP_PUSHM;
 	fbt->fbtp_symindx = symindx;
 
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	popm = FBT_POPM | ((*instr) & 0x3FFF) | 0x8000;
 
 	retfbt = NULL;
 again:
 	for (; instr < limit; instr++) {
 		if (*instr == popm)
 			break;
 		else if ((*instr & 0xff000000) == FBT_JUMP) {
 			uint32_t *target, *start;
 			int offset;
 
 			offset = (*instr & 0xffffff);
 			offset <<= 8;
 			offset /= 64;
 			target = instr + (2 + offset);
 			start = (uint32_t *)symval->value;
 			if (target >= limit || target < start)
 				break;
 		}
 	}
 
 	if (instr >= limit)
 		return (0);
 
 	/*
 	 * We have a winner!
 	 */
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	if (retfbt == NULL) {
 		fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 		    name, FBT_RETURN, 2, fbt);
 	} else {
 		retfbt->fbtp_probenext = fbt;
 		fbt->fbtp_id = retfbt->fbtp_id;
 	}
 	retfbt = fbt;
 
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_symindx = symindx;
 	if ((*instr & 0xff000000) == FBT_JUMP)
 		fbt->fbtp_rval = DTRACE_INVOP_B;
 	else
 		fbt->fbtp_rval = DTRACE_INVOP_POPM;
 	fbt->fbtp_roffset = (uintptr_t)instr - (uintptr_t)symval->value;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_BREAKPOINT;
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	instr++;
 	goto again;
 }
diff --git a/sys/cddl/dev/fbt/fbt.h b/sys/cddl/dev/fbt/fbt.h
index aa9bce564fa0..2816eec992ff 100644
--- a/sys/cddl/dev/fbt/fbt.h
+++ b/sys/cddl/dev/fbt/fbt.h
@@ -1,81 +1,84 @@
 /*
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
  * Common Development and Distribution License (the "License").
  * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  * If applicable, add the following below this CDDL HEADER, with the
  * fields enclosed by brackets "[]" replaced with your own identifying
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  *
  * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
  *
  * $FreeBSD$
  *
  */
 
 /*
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef _FBT_H_
 #define _FBT_H_
 
 #include "fbt_isa.h"
 
+#define	FBT_ENTRY	"entry"
+#define	FBT_RETURN	"return"
+
 /*
  * fbt_probe is a bit of a misnomer.  One of these structures is created for
  * each trace point of an FBT probe.  A probe might have multiple trace points
  * (e.g., a function with multiple return instructions), and different probes
  * might have a trace point at the same address (e.g., GNU ifuncs).
  */
 typedef struct fbt_probe {
 	struct fbt_probe *fbtp_hashnext;	/* global hash table linkage */
 	struct fbt_probe *fbtp_tracenext;	/* next probe for tracepoint */
 	struct fbt_probe *fbtp_probenext;	/* next tracepoint for probe */
 	int		fbtp_enabled;
 	fbt_patchval_t  *fbtp_patchpoint;
 	int8_t		fbtp_rval;
 	fbt_patchval_t	fbtp_patchval;
 	fbt_patchval_t	fbtp_savedval;
 	uintptr_t	fbtp_roffset;
 	dtrace_id_t	fbtp_id;
 	const char	*fbtp_name;
 	modctl_t	*fbtp_ctl;
 	int		fbtp_loadcnt;
 	int		fbtp_symindx;
 } fbt_probe_t;
 
 struct linker_file;
 struct linker_symval;
 struct trapframe;
 
 int	fbt_invop(uintptr_t, struct trapframe *, uintptr_t);
 void	fbt_patch_tracepoint(fbt_probe_t *, fbt_patchval_t);
 int	fbt_provide_module_function(struct linker_file *, int,
 	    struct linker_symval *, void *);
 int	fbt_excluded(const char *name);
 
 extern dtrace_provider_id_t	fbt_id;
 extern fbt_probe_t		**fbt_probetab;
 extern int			fbt_probetab_mask;
 
 #define	FBT_ADDR2NDX(addr)	((((uintptr_t)(addr)) >> 4) & fbt_probetab_mask)
 #define	FBT_PROBETAB_SIZE	0x8000		/* 32k entries -- 128K total */
 
 #ifdef MALLOC_DECLARE
 MALLOC_DECLARE(M_FBT);
 #endif
 
 #endif
diff --git a/sys/cddl/dev/fbt/powerpc/fbt_isa.c b/sys/cddl/dev/fbt/powerpc/fbt_isa.c
index eb7feceb269d..7f52308e1f76 100644
--- a/sys/cddl/dev/fbt/powerpc/fbt_isa.c
+++ b/sys/cddl/dev/fbt/powerpc/fbt_isa.c
@@ -1,242 +1,240 @@
 /*
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
  * Common Development and Distribution License (the "License").
  * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  * If applicable, add the following below this CDDL HEADER, with the
  * fields enclosed by brackets "[]" replaced with your own identifying
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  *
  * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
  * Portions Copyright 2013 Justin Hibbits jhibbits@freebsd.org
  *
  * $FreeBSD$
  *
  */
 
 /*
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #include 
 #include 
 #include 
 #include 
 
 #include "fbt.h"
 
 #define FBT_PATCHVAL		0x7ffff808
 #define FBT_MFLR_R0		0x7c0802a6
 #define FBT_MTLR_R0		0x7c0803a6
 #define FBT_BLR			0x4e800020
 #define FBT_BCTR		0x4e800030
 #define FBT_BRANCH		0x48000000
 #define FBT_BR_MASK		0x03fffffc
 #define FBT_IS_JUMP(instr)	((instr & ~FBT_BR_MASK) == FBT_BRANCH)
 
-#define	FBT_ENTRY	"entry"
-#define	FBT_RETURN	"return"
 #define	FBT_AFRAMES	5
 
 int
 fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval)
 {
 	solaris_cpu_t *cpu = &solaris_cpu[curcpu];
 	fbt_probe_t *fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
 	uintptr_t tmp;
 
 	for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
 		if ((uintptr_t)fbt->fbtp_patchpoint == addr) {
 			if (fbt->fbtp_roffset == 0) {
 				cpu->cpu_dtrace_caller = addr;
 
 				dtrace_probe(fbt->fbtp_id, frame->fixreg[3],
 				    frame->fixreg[4], frame->fixreg[5],
 				    frame->fixreg[6], frame->fixreg[7]);
 
 				cpu->cpu_dtrace_caller = 0;
 			} else {
 
 				dtrace_probe(fbt->fbtp_id, fbt->fbtp_roffset,
 				    rval, 0, 0, 0);
 				/*
 				 * The caller doesn't have the fbt item, so
 				 * fixup tail calls here.
 				 */
 				if (fbt->fbtp_rval == DTRACE_INVOP_JUMP) {
 					frame->srr0 = (uintptr_t)fbt->fbtp_patchpoint;
 					tmp = fbt->fbtp_savedval & FBT_BR_MASK;
 					/* Sign extend. */
 					if (tmp & 0x02000000)
 #ifdef __powerpc64__
 						tmp |= 0xfffffffffc000000ULL;
 #else
 						tmp |= 0xfc000000UL;
 #endif
 					frame->srr0 += tmp;
 				}
 				cpu->cpu_dtrace_caller = 0;
 			}
 
 			return (fbt->fbtp_rval);
 		}
 	}
 
 	return (0);
 }
 
 void
 fbt_patch_tracepoint(fbt_probe_t *fbt, fbt_patchval_t val)
 {
 
 	*fbt->fbtp_patchpoint = val;
 	__syncicache(fbt->fbtp_patchpoint, 4);
 }
 
 int
 fbt_provide_module_function(linker_file_t lf, int symindx,
     linker_symval_t *symval, void *opaque)
 {
 	char *modname = opaque;
 	const char *name = symval->name;
 	fbt_probe_t *fbt, *retfbt;
 	int j;
 	uint32_t *instr, *limit;
 
 #ifdef __powerpc64__
 #if !defined(_CALL_ELF) || _CALL_ELF == 1
 	/*
 	 * PowerPC64 uses '.' prefixes on symbol names, ignore it, but only
 	 * allow symbols with the '.' prefix, so that we don't get the function
 	 * descriptor instead.
 	 */
 	if (name[0] == '.')
 		name++;
 	else
 		return (0);
 #endif
 #endif
 
 	if (fbt_excluded(name))
 		return (0);
 
 	instr = (uint32_t *) symval->value;
 	limit = (uint32_t *) (symval->value + symval->size);
 
 	for (; instr < limit; instr++)
 		if (*instr == FBT_MFLR_R0)
 			break;
 
 	if (*instr != FBT_MFLR_R0)
 		return (0);
 
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 	    name, FBT_ENTRY, FBT_AFRAMES, fbt);
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_PATCHVAL;
 	fbt->fbtp_rval = DTRACE_INVOP_MFLR_R0;
 	fbt->fbtp_symindx = symindx;
 
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	retfbt = NULL;
 again:
 	if (instr >= limit)
 		return (0);
 
 	/*
 	 * We (desperately) want to avoid erroneously instrumenting a
 	 * jump table. To determine if we're looking at a true instruction
 	 * sequence or an inline jump table that happens to contain the same
 	 * byte sequences, we resort to some heuristic sleeze:  we treat this
 	 * instruction as being contained within a pointer, and see if that
 	 * pointer points to within the body of the function.  If it does, we
 	 * refuse to instrument it.
 	 */
 	{
 		uint32_t *ptr;
 
 		ptr = *(uint32_t **)instr;
 
 		if (ptr >= (uint32_t *) symval->value && ptr < limit) {
 			instr++;
 			goto again;
 		}
 	}
 
 	if (*instr != FBT_MTLR_R0) {
 		instr++;
 		goto again;
 	}
 
 	instr++;
 
 	for (j = 0; j < 12 && instr < limit; j++, instr++) {
 		if ((*instr == FBT_BCTR) || (*instr == FBT_BLR) ||
 		    FBT_IS_JUMP(*instr))
 			break;
 	}
 
 	if (!(*instr == FBT_BCTR || *instr == FBT_BLR || FBT_IS_JUMP(*instr)))
 		goto again;
 
 	/*
 	 * We have a winner!
 	 */
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 
 	if (retfbt == NULL) {
 		fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 		    name, FBT_RETURN, FBT_AFRAMES, fbt);
 	} else {
 		retfbt->fbtp_probenext = fbt;
 		fbt->fbtp_id = retfbt->fbtp_id;
 	}
 
 	retfbt = fbt;
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_symindx = symindx;
 
 	if (*instr == FBT_BCTR)
 		fbt->fbtp_rval = DTRACE_INVOP_BCTR;
 	else if (*instr == FBT_BLR)
 		fbt->fbtp_rval = DTRACE_INVOP_BLR;
 	else
 		fbt->fbtp_rval = DTRACE_INVOP_JUMP;
 
 	fbt->fbtp_roffset =
 	    (uintptr_t)((uint8_t *)instr - (uint8_t *)symval->value);
 
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_PATCHVAL;
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	instr += 4;
 	goto again;
 }
diff --git a/sys/cddl/dev/fbt/riscv/fbt_isa.c b/sys/cddl/dev/fbt/riscv/fbt_isa.c
index baf268028988..5c8340d9f001 100644
--- a/sys/cddl/dev/fbt/riscv/fbt_isa.c
+++ b/sys/cddl/dev/fbt/riscv/fbt_isa.c
@@ -1,265 +1,263 @@
 /*
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
  * Common Development and Distribution License (the "License").
  * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  * If applicable, add the following below this CDDL HEADER, with the
  * fields enclosed by brackets "[]" replaced with your own identifying
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  *
  * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
  * Portions Copyright 2013 Justin Hibbits jhibbits@freebsd.org
  * Portions Copyright 2013 Howard Su howardsu@freebsd.org
  * Portions Copyright 2016-2018 Ruslan Bukin 
  *
  * $FreeBSD$
  */
 
 /*
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #include 
 #include 
 
 #include 
 
 #include 
 #include 
 
 #include "fbt.h"
 
 #define	FBT_C_PATCHVAL		MATCH_C_EBREAK
 #define	FBT_PATCHVAL		MATCH_EBREAK
-#define	FBT_ENTRY		"entry"
-#define	FBT_RETURN		"return"
 #define	FBT_AFRAMES		5
 
 int
 fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval)
 {
 	solaris_cpu_t *cpu;
 	fbt_probe_t *fbt;
 
 	cpu = &solaris_cpu[curcpu];
 	fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
 
 	for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
 		if ((uintptr_t)fbt->fbtp_patchpoint == addr) {
 			cpu->cpu_dtrace_caller = frame->tf_ra - INSN_SIZE;
 
 			if (fbt->fbtp_roffset == 0) {
 				dtrace_probe(fbt->fbtp_id, frame->tf_a[0],
 				    frame->tf_a[1], frame->tf_a[2],
 				    frame->tf_a[3], frame->tf_a[4]);
 			} else {
 				dtrace_probe(fbt->fbtp_id, fbt->fbtp_roffset,
 				    frame->tf_a[0], frame->tf_a[1], 0, 0);
 			}
 
 			cpu->cpu_dtrace_caller = 0;
 			return (fbt->fbtp_savedval);
 		}
 	}
 
 	return (0);
 }
 
 void
 fbt_patch_tracepoint(fbt_probe_t *fbt, fbt_patchval_t val)
 {
 
 	switch(fbt->fbtp_patchval) {
 	case FBT_C_PATCHVAL:
 		*(uint16_t *)fbt->fbtp_patchpoint = (uint16_t)val;
 		fence_i();
 		break;
 	case FBT_PATCHVAL:
 		*fbt->fbtp_patchpoint = val;
 		fence_i();
 		break;
 	};
 }
 
 static int
 match_opcode(uint32_t insn, int match, int mask)
 {
 
 	if (((insn ^ match) & mask) == 0)
 		return (1);
 
 	return (0);
 }
 
 static int
 check_c_ret(uint32_t **instr)
 {
 	uint16_t *instr1;
 	int i;
 
 	for (i = 0; i < 2; i++) {
 		instr1 = (uint16_t *)(*instr) + i;
 		if (match_opcode(*instr1, (MATCH_C_JR | (X_RA << RD_SHIFT)),
 		    (MASK_C_JR | RD_MASK))) {
 			*instr = (uint32_t *)instr1;
 			return (1);
 		}
 	}
 
 	return (0);
 }
 
 static int
 check_c_sdsp(uint32_t **instr)
 {
 	uint16_t *instr1;
 	int i;
 
 	for (i = 0; i < 2; i++) {
 		instr1 = (uint16_t *)(*instr) + i;
 		if (match_opcode(*instr1, (MATCH_C_SDSP | RS2_C_RA),
 		    (MASK_C_SDSP | RS2_C_MASK))) {
 			*instr = (uint32_t *)instr1;
 			return (1);
 		}
 	}
 
 	return (0);
 }
 
 int
 fbt_provide_module_function(linker_file_t lf, int symindx,
     linker_symval_t *symval, void *opaque)
 {
 	fbt_probe_t *fbt, *retfbt;
 	uint32_t *instr, *limit;
 	const char *name;
 	char *modname;
 	int patchval;
 	int rval;
 
 	modname = opaque;
 	name = symval->name;
 
 	/* Check if function is excluded from instrumentation */
 	if (fbt_excluded(name))
 		return (0);
 
 	/*
 	 * Some assembly-language exception handlers are not suitable for
 	 * instrumentation.
 	 */
 	if (strcmp(name, "cpu_exception_handler") == 0)
 		return (0);
 	if (strcmp(name, "cpu_exception_handler_user") == 0)
 		return (0);
 	if (strcmp(name, "cpu_exception_handler_supervisor") == 0)
 		return (0);
 	if (strcmp(name, "do_trap_supervisor") == 0)
 		return (0);
 
 	instr = (uint32_t *)(symval->value);
 	limit = (uint32_t *)(symval->value + symval->size);
 
 	/* Look for sd operation */
 	for (; instr < limit; instr++) {
 		/* Look for a non-compressed store of ra to sp */
 		if (match_opcode(*instr, (MATCH_SD | RS2_RA | RS1_SP),
 		    (MASK_SD | RS2_MASK | RS1_MASK))) {
 			rval = DTRACE_INVOP_SD;
 			patchval = FBT_PATCHVAL;
 			break;
 		}
 
 		/* Look for a 'C'-compressed store of ra to sp. */
 		if (check_c_sdsp(&instr)) {
 			rval = DTRACE_INVOP_C_SDSP;
 			patchval = FBT_C_PATCHVAL;
 			break;
 		}
 	}
 
 	if (instr >= limit)
 		return (0);
 
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 	    name, FBT_ENTRY, FBT_AFRAMES, fbt);
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = patchval;
 	fbt->fbtp_rval = rval;
 	fbt->fbtp_symindx = symindx;
 
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	retfbt = NULL;
 again:
 	for (; instr < limit; instr++) {
 		/* Look for non-compressed return */
 		if (match_opcode(*instr, (MATCH_JALR | (X_RA << RS1_SHIFT)),
 		    (MASK_JALR | RD_MASK | RS1_MASK | IMM_MASK))) {
 			rval = DTRACE_INVOP_RET;
 			patchval = FBT_PATCHVAL;
 			break;
 		}
 
 		/* Look for 'C'-compressed return */
 		if (check_c_ret(&instr)) {
 			rval = DTRACE_INVOP_C_RET;
 			patchval = FBT_C_PATCHVAL;
 			break;
 		}
 	}
 
 	if (instr >= limit)
 		return (0);
 
 	/*
 	 * We have a winner!
 	 */
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	if (retfbt == NULL) {
 		fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 		    name, FBT_RETURN, FBT_AFRAMES, fbt);
 	} else {
 		retfbt->fbtp_probenext = fbt;
 		fbt->fbtp_id = retfbt->fbtp_id;
 	}
 	retfbt = fbt;
 
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_symindx = symindx;
 	fbt->fbtp_rval = rval;
 	fbt->fbtp_roffset = (uintptr_t)instr - (uintptr_t)symval->value;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = patchval;
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	instr++;
 	goto again;
 }
diff --git a/sys/cddl/dev/fbt/x86/fbt_isa.c b/sys/cddl/dev/fbt/x86/fbt_isa.c
index 05ec87ab437f..da3eaf26f788 100644
--- a/sys/cddl/dev/fbt/x86/fbt_isa.c
+++ b/sys/cddl/dev/fbt/x86/fbt_isa.c
@@ -1,356 +1,353 @@
 /*
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
  * Common Development and Distribution License (the "License").
  * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  * If applicable, add the following below this CDDL HEADER, with the
  * fields enclosed by brackets "[]" replaced with your own identifying
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  *
  * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
  *
  * $FreeBSD$
  *
  */
 
 /*
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #include 
 #include 
 
 #include 
 
 #include 
 #include 
 
 #include "fbt.h"
 
 #define	FBT_PUSHL_EBP		0x55
 #define	FBT_MOVL_ESP_EBP0_V0	0x8b
 #define	FBT_MOVL_ESP_EBP1_V0	0xec
 #define	FBT_MOVL_ESP_EBP0_V1	0x89
 #define	FBT_MOVL_ESP_EBP1_V1	0xe5
 #define	FBT_REX_RSP_RBP		0x48
 
 #define	FBT_POPL_EBP		0x5d
 #define	FBT_RET			0xc3
 #define	FBT_RET_IMM16		0xc2
 #define	FBT_LEAVE		0xc9
 
 #ifdef __amd64__
 #define	FBT_PATCHVAL		0xcc
 #else
 #define	FBT_PATCHVAL		0xf0
 #endif
 
-#define	FBT_ENTRY	"entry"
-#define	FBT_RETURN	"return"
-
 int
 fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t scratch __unused)
 {
 	solaris_cpu_t *cpu;
 	uintptr_t *stack;
 	uintptr_t arg0, arg1, arg2, arg3, arg4, rval;
 	fbt_probe_t *fbt;
 	int8_t fbtrval;
 
 #ifdef __amd64__
 	stack = (uintptr_t *)frame->tf_rsp;
 	rval = frame->tf_rax;
 #else
 	/* Skip hardware-saved registers. */
 	stack = (uintptr_t *)frame->tf_isp + 3;
 	rval = frame->tf_eax;
 #endif
 
 	cpu = &solaris_cpu[curcpu];
 	fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
 	for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
 		if ((uintptr_t)fbt->fbtp_patchpoint != addr)
 			continue;
 		fbtrval = fbt->fbtp_rval;
 		for (; fbt != NULL; fbt = fbt->fbtp_tracenext) {
 			ASSERT(fbt->fbtp_rval == fbtrval);
 			if (fbt->fbtp_roffset == 0) {
 #ifdef __amd64__
 				/* fbt->fbtp_rval == DTRACE_INVOP_PUSHQ_RBP */
 				DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
 				cpu->cpu_dtrace_caller = stack[0];
 				DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT |
 				    CPU_DTRACE_BADADDR);
 
 				arg0 = frame->tf_rdi;
 				arg1 = frame->tf_rsi;
 				arg2 = frame->tf_rdx;
 				arg3 = frame->tf_rcx;
 				arg4 = frame->tf_r8;
 #else
 				int i = 0;
 
 				/*
 				 * When accessing the arguments on the stack,
 				 * we must protect against accessing beyond
 				 * the stack.  We can safely set NOFAULT here
 				 * -- we know that interrupts are already
 				 * disabled.
 				 */
 				DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
 				cpu->cpu_dtrace_caller = stack[i++];
 				arg0 = stack[i++];
 				arg1 = stack[i++];
 				arg2 = stack[i++];
 				arg3 = stack[i++];
 				arg4 = stack[i++];
 				DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT |
 				    CPU_DTRACE_BADADDR);
 #endif
 
 				dtrace_probe(fbt->fbtp_id, arg0, arg1,
 				    arg2, arg3, arg4);
 
 				cpu->cpu_dtrace_caller = 0;
 			} else {
 #ifdef __amd64__
 				/*
 				 * On amd64, we instrument the ret, not the
 				 * leave.  We therefore need to set the caller
 				 * to ensure that the top frame of a stack()
 				 * action is correct.
 				 */
 				DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
 				cpu->cpu_dtrace_caller = stack[0];
 				DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT |
 				    CPU_DTRACE_BADADDR);
 #endif
 
 				dtrace_probe(fbt->fbtp_id, fbt->fbtp_roffset,
 				    rval, 0, 0, 0);
 				cpu->cpu_dtrace_caller = 0;
 			}
 		}
 		return (fbtrval);
 	}
 
 	return (0);
 }
 
 void
 fbt_patch_tracepoint(fbt_probe_t *fbt, fbt_patchval_t val)
 {
 	register_t intr;
 	bool old_wp;
 
 	intr = intr_disable();
 	old_wp = disable_wp();
 	*fbt->fbtp_patchpoint = val;
 	restore_wp(old_wp);
 	intr_restore(intr);
 }
 
 int
 fbt_provide_module_function(linker_file_t lf, int symindx,
     linker_symval_t *symval, void *opaque)
 {
 	char *modname = opaque;
 	const char *name = symval->name;
 	fbt_probe_t *fbt, *hash, *retfbt;
 	int j;
 	int size;
 	uint8_t *instr, *limit;
 
 	if (fbt_excluded(name))
 		return (0);
 
 	/*
 	 * trap_check() is a wrapper for DTrace's fault handler, so we don't
 	 * want to be able to instrument it.
 	 */
 	if (strcmp(name, "trap_check") == 0)
 		return (0);
 
 	size = symval->size;
 
 	instr = (uint8_t *) symval->value;
 	limit = (uint8_t *) symval->value + symval->size;
 
 #ifdef __amd64__
 	while (instr < limit) {
 		if (*instr == FBT_PUSHL_EBP)
 			break;
 
 		if ((size = dtrace_instr_size(instr)) <= 0)
 			break;
 
 		instr += size;
 	}
 
 	if (instr >= limit || *instr != FBT_PUSHL_EBP) {
 		/*
 		 * We either don't save the frame pointer in this
 		 * function, or we ran into some disassembly
 		 * screw-up.  Either way, we bail.
 		 */
 		return (0);
 	}
 #else
 	if (instr[0] != FBT_PUSHL_EBP)
 		return (0);
 
 	if (!(instr[1] == FBT_MOVL_ESP_EBP0_V0 &&
 	    instr[2] == FBT_MOVL_ESP_EBP1_V0) &&
 	    !(instr[1] == FBT_MOVL_ESP_EBP0_V1 &&
 	    instr[2] == FBT_MOVL_ESP_EBP1_V1))
 		return (0);
 #endif
 
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 	fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 	    name, FBT_ENTRY, 3, fbt);
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_rval = DTRACE_INVOP_PUSHL_EBP;
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_PATCHVAL;
 	fbt->fbtp_symindx = symindx;
 
 	for (hash = fbt_probetab[FBT_ADDR2NDX(instr)]; hash != NULL;
 	    hash = hash->fbtp_hashnext) {
 		if (hash->fbtp_patchpoint == fbt->fbtp_patchpoint) {
 			fbt->fbtp_tracenext = hash->fbtp_tracenext;
 			hash->fbtp_tracenext = fbt;
 			break;
 		}
 	}
 	if (hash == NULL) {
 		fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 		fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 	}
 
 	lf->fbt_nentries++;
 
 	retfbt = NULL;
 again:
 	if (instr >= limit)
 		return (0);
 
 	/*
 	 * If this disassembly fails, then we've likely walked off into
 	 * a jump table or some other unsuitable area.  Bail out of the
 	 * disassembly now.
 	 */
 	if ((size = dtrace_instr_size(instr)) <= 0)
 		return (0);
 
 #ifdef __amd64__
 	/*
 	 * We only instrument "ret" on amd64 -- we don't yet instrument
 	 * ret imm16, largely because the compiler doesn't seem to
 	 * (yet) emit them in the kernel...
 	 */
 	if (*instr != FBT_RET) {
 		instr += size;
 		goto again;
 	}
 #else
 	if (!(size == 1 &&
 	    (*instr == FBT_POPL_EBP || *instr == FBT_LEAVE) &&
 	    (*(instr + 1) == FBT_RET ||
 	    *(instr + 1) == FBT_RET_IMM16))) {
 		instr += size;
 		goto again;
 	}
 #endif
 
 	/*
 	 * We (desperately) want to avoid erroneously instrumenting a
 	 * jump table, especially given that our markers are pretty
 	 * short:  two bytes on x86, and just one byte on amd64.  To
 	 * determine if we're looking at a true instruction sequence
 	 * or an inline jump table that happens to contain the same
 	 * byte sequences, we resort to some heuristic sleeze:  we
 	 * treat this instruction as being contained within a pointer,
 	 * and see if that pointer points to within the body of the
 	 * function.  If it does, we refuse to instrument it.
 	 */
 	for (j = 0; j < sizeof (uintptr_t); j++) {
 		caddr_t check = (caddr_t) instr - j;
 		uint8_t *ptr;
 
 		if (check < symval->value)
 			break;
 
 		if (check + sizeof (caddr_t) > (caddr_t)limit)
 			continue;
 
 		ptr = *(uint8_t **)check;
 
 		if (ptr >= (uint8_t *) symval->value && ptr < limit) {
 			instr += size;
 			goto again;
 		}
 	}
 
 	/*
 	 * We have a winner!
 	 */
 	fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
 	fbt->fbtp_name = name;
 
 	if (retfbt == NULL) {
 		fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
 		    name, FBT_RETURN, 3, fbt);
 	} else {
 		retfbt->fbtp_probenext = fbt;
 		fbt->fbtp_id = retfbt->fbtp_id;
 	}
 
 	retfbt = fbt;
 	fbt->fbtp_patchpoint = instr;
 	fbt->fbtp_ctl = lf;
 	fbt->fbtp_loadcnt = lf->loadcnt;
 	fbt->fbtp_symindx = symindx;
 
 #ifndef __amd64__
 	if (*instr == FBT_POPL_EBP) {
 		fbt->fbtp_rval = DTRACE_INVOP_POPL_EBP;
 	} else {
 		ASSERT(*instr == FBT_LEAVE);
 		fbt->fbtp_rval = DTRACE_INVOP_LEAVE;
 	}
 	fbt->fbtp_roffset =
 	    (uintptr_t)(instr - (uint8_t *) symval->value) + 1;
 
 #else
 	ASSERT(*instr == FBT_RET);
 	fbt->fbtp_rval = DTRACE_INVOP_RET;
 	fbt->fbtp_roffset =
 	    (uintptr_t)(instr - (uint8_t *) symval->value);
 #endif
 
 	fbt->fbtp_savedval = *instr;
 	fbt->fbtp_patchval = FBT_PATCHVAL;
 	fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
 	fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
 
 	lf->fbt_nentries++;
 
 	instr += size;
 	goto again;
 }