git: 746e31e41818 - main - Remove mips dtrace.

From: Warner Losh <imp_at_FreeBSD.org>
Date: Fri, 07 Jan 2022 16:27:52 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=746e31e41818e02110c5aa8df509cc438b03a2dc

commit 746e31e41818e02110c5aa8df509cc438b03a2dc
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2022-01-07 15:59:15 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2022-01-07 16:00:56 +0000

    Remove mips dtrace.
    
    Remove mips dtrace code. It's no longer needed.
    
    Sponsored by:           Netflix
---
 sys/cddl/dev/dtrace/mips/dtrace_asm.S  | 234 -----------
 sys/cddl/dev/dtrace/mips/dtrace_isa.c  | 724 ---------------------------------
 sys/cddl/dev/dtrace/mips/dtrace_subr.c | 289 -------------
 sys/cddl/dev/dtrace/mips/regset.h      |  62 ---
 sys/cddl/dev/fbt/mips/fbt_isa.c        | 164 --------
 sys/cddl/dev/fbt/mips/fbt_isa.h        |  30 --
 6 files changed, 1503 deletions(-)

diff --git a/sys/cddl/dev/dtrace/mips/dtrace_asm.S b/sys/cddl/dev/dtrace/mips/dtrace_asm.S
deleted file mode 100644
index b40336c0f114..000000000000
--- a/sys/cddl/dev/dtrace/mips/dtrace_asm.S
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (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
- *
- * $FreeBSD$
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#define _ASM
-#define _LOCORE
-
-#include <sys/cpuvar_defs.h>
-#include <sys/dtrace.h>
-
-#include <machine/asm.h>
-#include <machine/cpu.h>
-#include <machine/cpuregs.h>
-#include <machine/regnum.h>
-
-        .set    noreorder               # Noreorder is default style!
-
-/*
- * Primitives
- */
-
-        .text
-
-/*
-void dtrace_membar_producer(void)
-*/
-LEAF(dtrace_membar_producer)
-	j	ra
-	nop
-END(dtrace_membar_producer)
-
-/*
-void dtrace_membar_consumer(void)
-*/
-LEAF(dtrace_membar_consumer)
-	j	ra
-	nop
-END(dtrace_membar_consumer)
-
-/*
-dtrace_icookie_t dtrace_interrupt_disable(void)
-*/
-LEAF(dtrace_interrupt_disable)
-	mfc0	t0, MIPS_COP_0_STATUS
-	move	v0, t0
-	and	v0, v0, MIPS_SR_INT_IE
-	and	t0, t0, ~MIPS_SR_INT_IE
-	mtc0	t0, MIPS_COP_0_STATUS
-	j	ra
-	nop
-END(dtrace_interrupt_disable)
-
-/*
-void dtrace_interrupt_enable(dtrace_icookie_t cookie)
-*/
-LEAF(dtrace_interrupt_enable)
-	mfc0	t0, MIPS_COP_0_STATUS
-	beqz	a0, not_enabled
-	or	t0, t0, MIPS_SR_INT_IE
-	mtc0	t0, MIPS_COP_0_STATUS
-not_enabled:
-	j	ra
-	nop
-END(dtrace_interrupt_enable)
-
-/*
-uint32_t dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
-*/
-LEAF(dtrace_cas32)
-1:
-	move	t1, a2
-	ll	t0, 0(a0)
-	bne	t0, a1, 2f
-	nop
-	sc	t1, 0(a0)
-	beqz	t1, 1b
-	nop
-2:	move	v0, t0
-	j	ra
-	nop
-END(dtrace_cas32)
-
-/*
-void *
-dtrace_casptr(void *target, void *cmp, void *new)
-*/
-LEAF(dtrace_casptr)
-1:
-	move	t1, a2
-	PTR_LL	t0, 0(a0)
-	bne	t0, a1, 2f
-	nop
-	PTR_SC	t1, 0(a0)
-	beqz	t1, 1b
-	nop
-2:	move	v0, t0
-	j	ra
-	nop
-END(dtrace_casptr)
-
-
-/*
-uintptr_t
-dtrace_fulword(void *addr)
-*/
-LEAF(dtrace_fulword)
-END(dtrace_fulword)
-
-/*
-uint8_t
-dtrace_fuword8_nocheck(void *addr)
-*/
-LEAF(dtrace_fuword8_nocheck)
-	lbu	v0, 0(a0)
-	j	ra
-	nop
-END(dtrace_fuword8_nocheck)
-
-/*
-uint16_t
-dtrace_fuword16_nocheck(void *addr)
-*/
-LEAF(dtrace_fuword16_nocheck)
-	lhu	v0, 0(a0)
-	j	ra
-	nop
-END(dtrace_fuword16_nocheck)
-
-/*
-uint32_t
-dtrace_fuword32_nocheck(void *addr)
-*/
-LEAF(dtrace_fuword32_nocheck)
-	lw	v0, 0(a0)
-	j	ra
-	nop
-END(dtrace_fuword32_nocheck)
-
-/*
-uint64_t
-dtrace_fuword64_nocheck(void *addr)
-*/
-LEAF(dtrace_fuword64_nocheck)
-#if defined(__mips_n64) || defined(__mips_n32)
-	ld	v0, 0(a0)
-#else
-	lw	v1,4(a0)
-	lw	v0,0(a0)
-#endif
-	j	ra
-	nop
-END(dtrace_fuword64_nocheck)
-
-/*
-XXX: unoptimized
-void
-dtrace_copy(uintptr_t src, uintptr_t dest, size_t size)
-*/
-LEAF(dtrace_copy)
-1:
-	beqz	a2, 2f
-	nop
-	lbu	t0, 0(a0)
-	sb	t0, 0(a1)
-	PTR_ADDU	a0, a0, 1
-	PTR_ADDU	a1, a1, 1
-	INT_SUBU	a2, a2, 1
-	j	1b
-	nop
-2:
-	j	ra
-	nop
-END(dtrace_copy)
-
-/*
-XXX: Unoptimized. Check for flags on page boundaries only(?)
-void
-dtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
-    volatile uint16_t *flags)
-*/
-LEAF(dtrace_copystr)
-1:
-	lbu	t0, 0(a0)
-	sb	t0, 0(a1)
-	PTR_ADDU	a0, a0, 1
-	PTR_ADDU	a1, a1, 1
-	INT_SUBU	a2, a2, 1
-	beqz	t0, 2f
-	nop
-	lhu	t1, (a3)
-	and	t1, t1, CPU_DTRACE_BADADDR
-	bnez	t1, 2f
-	nop
-
-	bnez	a2, 1b
-	nop
-2:
-	j	ra
-	nop
-END(dtrace_copystr)
-
-/*
-uintptr_t
-dtrace_caller(int aframes)
-*/
-LEAF(dtrace_caller)
-	li	v0, -1
-	j	ra
-	nop
-END(dtrace_caller)
diff --git a/sys/cddl/dev/dtrace/mips/dtrace_isa.c b/sys/cddl/dev/dtrace/mips/dtrace_isa.c
deleted file mode 100644
index 8d65012dadf0..000000000000
--- a/sys/cddl/dev/dtrace/mips/dtrace_isa.c
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (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
- *
- * $FreeBSD$
- */
-/*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-#include <sys/cdefs.h>
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/stack.h>
-#include <sys/pcpu.h>
-
-#include <machine/frame.h>
-#include <machine/md_var.h>
-
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/pmap.h>
-
-#include <machine/db_machdep.h>
-#include <machine/md_var.h>
-#include <machine/mips_opcode.h>
-#include <ddb/db_sym.h>
-#include <ddb/ddb.h>
-#include <sys/kdb.h>
-
-#include "regset.h"
-
-#ifdef __mips_n64
-#define	MIPS_IS_VALID_KERNELADDR(reg)	((((reg) & 3) == 0) && \
-					((vm_offset_t)(reg) >= MIPS_XKPHYS_START))
-#else
-#define	MIPS_IS_VALID_KERNELADDR(reg)	((((reg) & 3) == 0) && \
-					((vm_offset_t)(reg) >= MIPS_KSEG0_START))
-#endif
-
-
-
-/*
- * Wee need some reasonable default to prevent backtrace code
- * from wandering too far
- */
-#define	MAX_FUNCTION_SIZE 0x10000
-#define	MAX_PROLOGUE_SIZE 0x100
-
-uint8_t dtrace_fuword8_nocheck(void *);
-uint16_t dtrace_fuword16_nocheck(void *);
-uint32_t dtrace_fuword32_nocheck(void *);
-uint64_t dtrace_fuword64_nocheck(void *);
-
-static int dtrace_next_frame(register_t *pc, register_t *sp, register_t *args, int *valid_args);
-static int dtrace_next_uframe(register_t *pc, register_t *sp, register_t *ra);
-
-void
-dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
-    uint32_t *intrpc)
-{
-	int depth = 0;
-	vm_offset_t callpc;
-	pc_t caller = (pc_t) solaris_cpu[curcpu].cpu_dtrace_caller;
-	register_t sp, ra, pc;
-
-	if (intrpc != 0)
-		pcstack[depth++] = (pc_t) intrpc;
-
-	aframes++;
-
-	sp = (register_t)(intptr_t)__builtin_frame_address(0);
-	ra = (register_t)(intptr_t)__builtin_return_address(0);
-
-       	__asm __volatile(
-		"jal 99f\n"
-		"nop\n"
-		"99:\n"
-		"move %0, $31\n" /* get ra */
-		"move $31, %1\n" /* restore ra */
-		: "=r" (pc)
-		: "r" (ra));
-
-	while (depth < pcstack_limit) {
-
-		callpc = pc;
-
-		if (aframes > 0) {
-			aframes--;
-			if ((aframes == 0) && (caller != 0)) {
-				pcstack[depth++] = caller;
-			}
-		}
-		else {
-			pcstack[depth++] = callpc;
-		}
-
-		if (dtrace_next_frame(&pc, &sp, NULL, NULL) < 0)
-			break;
-	}
-
-	for (; depth < pcstack_limit; depth++) {
-		pcstack[depth] = 0;
-	}
-}
-
-void
-dtrace_getupcstack(uint64_t *pcstack, int pcstack_limit)
-{
-	proc_t *p = curproc;
-	struct trapframe *tf;
-	register_t sp, ra, pc;
-	volatile uint16_t *flags =
-	    (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags;
-
-	if (*flags & CPU_DTRACE_FAULT)
-		return;
-
-	if (pcstack_limit <= 0)
-		return;
-
-	/*
-	 * If there's no user context we still need to zero the stack.
-	 */
-	if (p == NULL || (tf = curthread->td_frame) == NULL)
-		goto zero;
-
-	*pcstack++ = (uint64_t)p->p_pid;
-	pcstack_limit--;
-
-	if (pcstack_limit <= 0)
-		return;
-
-	pc = (uint64_t)tf->pc;
-	sp = (uint64_t)tf->sp;
-	ra = (uint64_t)tf->ra;
-	*pcstack++ = (uint64_t)tf->pc;
-	
-	/*
-	 * Unwind, and unwind, and unwind
-	 */
-	while (1) {
-		if (dtrace_next_uframe(&pc, &sp, &ra) < 0)
-			break;
-
-		*pcstack++ = pc;
-		pcstack_limit--;
-
-		if (pcstack_limit <= 0)
-			break;
-	}
-
-zero:
-	while (pcstack_limit-- > 0)
-		*pcstack++ = 0;
-}
-
-int
-dtrace_getustackdepth(void)
-{
-	int n = 0;
-	proc_t *p = curproc;
-	struct trapframe *tf;
-	register_t sp, ra, pc;
-	volatile uint16_t *flags =
-	    (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags;
-
-	if (*flags & CPU_DTRACE_FAULT)
-		return (0);
-
-	if (p == NULL || (tf = curthread->td_frame) == NULL)
-		return (0);
-
-	pc = (uint64_t)tf->pc;
-	sp = (uint64_t)tf->sp;
-	ra = (uint64_t)tf->ra;
-	n++;
-	
-	/*
-	 * Unwind, and unwind, and unwind
-	 */
-	while (1) {
-		if (dtrace_next_uframe(&pc, &sp, &ra) < 0)
-			break;
-		n++;
-	}
-
-	return (n);
-}
-
-void
-dtrace_getufpstack(uint64_t *pcstack, uint64_t *fpstack, int pcstack_limit)
-{
-	printf("IMPLEMENT ME: %s\n", __func__);
-}
-
-/*ARGSUSED*/
-uint64_t
-dtrace_getarg(int arg, int aframes)
-{
-	int i;
-	register_t sp, ra, pc;
-	/* XXX: Fix this ugly code */
-	register_t args[8];
-	int valid[8];
-
-	sp = (register_t)(intptr_t)__builtin_frame_address(0);
-	ra = (register_t)(intptr_t)__builtin_return_address(0);
-
-       	__asm __volatile(
-		"jal 99f\n"
-		"nop\n"
-		"99:\n"
-		"move %0, $31\n" /* get ra */
-		"move $31, %1\n" /* restore ra */
-		: "=r" (pc)
-		: "r" (ra));
-
-	for (i = 0; i <= aframes + 1; i++) {
-		if (dtrace_next_frame(&pc, &sp, args, valid) < 0) {
-			printf("%s: stack ends at frame #%d\n", __func__, i);
-			return (0);
-		}
-	}
-
-	if (arg < 8) {
-		if (valid[arg])
-			return (args[arg]);
-		else
-			printf("%s: request arg%d is not valid\n", __func__, arg);
-	}
-
-	return (0);
-}
-
-int
-dtrace_getstackdepth(int aframes)
-{
-	register_t sp, ra, pc;
-	int depth = 0;
-
-	sp = (register_t)(intptr_t)__builtin_frame_address(0);
-	ra = (register_t)(intptr_t)__builtin_return_address(0);
-
-       	__asm __volatile(
-		"jal 99f\n"
-		"nop\n"
-		"99:\n"
-		"move %0, $31\n" /* get ra */
-		"move $31, %1\n" /* restore ra */
-		: "=r" (pc)
-		: "r" (ra));
-
-	for (;;) {
-		if (dtrace_next_frame(&pc, &sp, NULL, NULL) < 0)
-			break;
-		depth++;
-	}
-
-	if (depth < aframes)
-		return 0;
-	else
-		return depth - aframes;
-}
-
-ulong_t
-dtrace_getreg(struct trapframe *rp, uint_t reg)
-{
-
-	return (0);
-}
-
-static int
-dtrace_next_frame(register_t *pc, register_t *sp,
-	register_t *args, int *valid_args)
-{
-	InstFmt i;
-	/*
-	 * Arrays for a0..a3 registers and flags if content
-	 * of these registers is valid, e.g. obtained from the stack
-	 */
-	uintptr_t va;
-	unsigned instr, mask;
-	unsigned int frames = 0;
-	int more, stksize;
-	register_t ra = 0;
-	int arg, r;
-	vm_offset_t addr;
-
-	/*
-	 * Invalidate arguments values
-	 */
-	if (valid_args) {
-		for (r = 0; r < 8; r++)
-			valid_args[r] = 0;
-	}
-
-	/* Jump here after a nonstandard (interrupt handler) frame */
-	stksize = 0;
-	if (frames++ > 100) {
-		/* return breaks stackframe-size heuristics with gcc -O2 */
-		goto error;	/* XXX */
-	}
-
-	/* check for bad SP: could foul up next frame */
-	if (!MIPS_IS_VALID_KERNELADDR(*sp)) {
-		goto error;
-	}
-
-	/* check for bad PC */
-	if (!MIPS_IS_VALID_KERNELADDR(*pc)) {
-		goto error;
-	}
-
-	/*
-	 * Find the beginning of the current subroutine by scanning
-	 * backwards from the current PC for the end of the previous
-	 * subroutine.
-	 */
-	va = *pc - sizeof(int);
-	while (1) {
-		instr = kdbpeek((int *)va);
-
-		/* [d]addiu sp,sp,-X */
-		if (((instr & 0xffff8000) == 0x27bd8000)
-		    || ((instr & 0xffff8000) == 0x67bd8000))
-			break;
-
-		/* jr	ra */
-		if (instr == 0x03e00008) {
-			/* skip over branch-delay slot instruction */
-			va += 2 * sizeof(int);
-			break;
-		}
-
-		va -= sizeof(int);
-	}
-
-	/* skip over nulls which might separate .o files */
-	while ((instr = kdbpeek((int *)va)) == 0)
-		va += sizeof(int);
-
-	/* scan forwards to find stack size and any saved registers */
-	stksize = 0;
-	more = 3;
-	mask = 0;
-	for (; more; va += sizeof(int),
-	    more = (more == 3) ? 3 : more - 1) {
-		/* stop if hit our current position */
-		if (va >= *pc)
-			break;
-		instr = kdbpeek((int *)va);
-		i.word = instr;
-		switch (i.JType.op) {
-		case OP_SPECIAL:
-			switch (i.RType.func) {
-			case OP_JR:
-			case OP_JALR:
-				more = 2;	/* stop after next instruction */
-				break;
-
-			case OP_SYSCALL:
-			case OP_BREAK:
-				more = 1;	/* stop now */
-			};
-			break;
-
-		case OP_BCOND:
-		case OP_J:
-		case OP_JAL:
-		case OP_BEQ:
-		case OP_BNE:
-		case OP_BLEZ:
-		case OP_BGTZ:
-			more = 2;	/* stop after next instruction */
-			break;
-
-		case OP_COP0:
-		case OP_COP1:
-		case OP_COP2:
-		case OP_COP3:
-			switch (i.RType.rs) {
-			case OP_BCx:
-			case OP_BCy:
-				more = 2;	/* stop after next instruction */
-			};
-			break;
-
-		case OP_SW:
-			/* look for saved registers on the stack */
-			if (i.IType.rs != 29)
-				break;
-			/* only restore the first one */
-			if (mask & (1 << i.IType.rt))
-				break;
-			mask |= (1 << i.IType.rt);
-			addr = (vm_offset_t)(*sp + (short)i.IType.imm);
-			switch (i.IType.rt) {
-			case 4:/* a0 */
-			case 5:/* a1 */
-			case 6:/* a2 */
-			case 7:/* a3 */
-#if defined(__mips_n64) || defined(__mips_n32)
-			case 8:/* a4 */
-			case 9:/* a5 */
-			case 10:/* a6 */
-			case 11:/* a7 */
-#endif
-				arg = i.IType.rt - 4;
-				if (args)
-					args[arg] = kdbpeek((int*)addr);
-				if (valid_args)
-					valid_args[arg] = 1;
-				break;
-			case 31:	/* ra */
-				ra = kdbpeek((int *)addr);
-			}
-			break;
-
-		case OP_SD:
-			/* look for saved registers on the stack */
-			if (i.IType.rs != 29)
-				break;
-			/* only restore the first one */
-			if (mask & (1 << i.IType.rt))
-				break;
-			mask |= (1 << i.IType.rt);
-			addr = (vm_offset_t)(*sp + (short)i.IType.imm);
-			switch (i.IType.rt) {
-			case 4:/* a0 */
-			case 5:/* a1 */
-			case 6:/* a2 */
-			case 7:/* a3 */
-#if defined(__mips_n64) || defined(__mips_n32)
-			case 8:/* a4 */
-			case 9:/* a5 */
-			case 10:/* a6 */
-			case 11:/* a7 */
-#endif
-				arg = i.IType.rt - 4;
-				if (args)
-					args[arg] = kdbpeekd((int *)addr);
-				if (valid_args)
-					valid_args[arg] = 1;
-				break;
-
-			case 31:	/* ra */
-				ra = kdbpeekd((int *)addr);
-			}
-			break;
-
-		case OP_ADDI:
-		case OP_ADDIU:
-		case OP_DADDI:
-		case OP_DADDIU:
-			/* look for stack pointer adjustment */
-			if (i.IType.rs != 29 || i.IType.rt != 29)
-				break;
-			stksize = -((short)i.IType.imm);
-		}
-	}
-
-	if (!MIPS_IS_VALID_KERNELADDR(ra)) 
-		return (-1);
-
-	*pc = ra;
-	*sp += stksize;
-
-#if defined(__mips_o32)
-	/*
-	 * For MIPS32 fill out arguments 5..8 from the stack
-	 */
-	for (arg = 4; arg < 8; arg++) {
-		addr = (vm_offset_t)(*sp + arg*sizeof(register_t));
-		if (args)
-			args[arg] = kdbpeekd((int *)addr);
-		if (valid_args)
-			valid_args[arg] = 1;
-	}
-#endif
-
-	return (0);
-error:
-	return (-1);
-}
-
-static int
-dtrace_next_uframe(register_t *pc, register_t *sp, register_t *ra)
-{
-	int offset, registers_on_stack;
-	uint32_t opcode, mask;
-	register_t function_start;
-	int stksize;
-	InstFmt i;
-
-	volatile uint16_t *flags =
-	    (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags;
-
-	registers_on_stack = 0;
-	mask = 0;
-	function_start = 0;
-	offset = 0;
-	stksize = 0;
-
-	while (offset < MAX_FUNCTION_SIZE) {
-		opcode = dtrace_fuword32((void *)(vm_offset_t)(*pc - offset));
-
-		if (*flags & CPU_DTRACE_FAULT)
-			goto fault;
-
-		/* [d]addiu sp, sp, -X*/
-		if (((opcode & 0xffff8000) == 0x27bd8000)
-		    || ((opcode & 0xffff8000) == 0x67bd8000)) {
-			function_start = *pc - offset;
-			registers_on_stack = 1;
-			break;
-		}
-
-		/* lui gp, X */
-		if ((opcode & 0xffff8000) == 0x3c1c0000) {
-			/*
-			 * Function might start with this instruction
-			 * Keep an eye on "jr ra" and sp correction
-			 * with positive value further on
-			 */
-			function_start = *pc - offset;
-		}
-
-		if (function_start) {
-			/* 
-			 * Stop looking further. Possible end of
-			 * function instruction: it means there is no
-			 * stack modifications, sp is unchanged
-			 */
-
-			/* [d]addiu sp,sp,X */
-			if (((opcode & 0xffff8000) == 0x27bd0000)
-			    || ((opcode & 0xffff8000) == 0x67bd0000))
-				break;
-
-			if (opcode == 0x03e00008)
-				break;
-		}
-
-		offset += sizeof(int);
-	}
-
-	if (!function_start)
-		return (-1);
-
-	if (registers_on_stack) {
-		offset = 0;
-		while ((offset < MAX_PROLOGUE_SIZE) 
-		    && ((function_start + offset) < *pc)) {
-			i.word = 
-			    dtrace_fuword32((void *)(vm_offset_t)(function_start + offset));
-			switch (i.JType.op) {
-			case OP_SW:
-				/* look for saved registers on the stack */
-				if (i.IType.rs != 29)
-					break;
-				/* only restore the first one */
-				if (mask & (1 << i.IType.rt))
-					break;
-				mask |= (1 << i.IType.rt);
-				if (i.IType.rt == 31)
-					*ra = dtrace_fuword32((void *)(vm_offset_t)(*sp + (short)i.IType.imm));
-				break;
-
-			case OP_SD:
-				/* look for saved registers on the stack */
-				if (i.IType.rs != 29)
-					break;
-				/* only restore the first one */
-				if (mask & (1 << i.IType.rt))
-					break;
-				mask |= (1 << i.IType.rt);
-				/* ra */
-				if (i.IType.rt == 31)
-					*ra = dtrace_fuword64((void *)(vm_offset_t)(*sp + (short)i.IType.imm));
-			break;
-
-			case OP_ADDI:
-			case OP_ADDIU:
-			case OP_DADDI:
-			case OP_DADDIU:
-				/* look for stack pointer adjustment */
-				if (i.IType.rs != 29 || i.IType.rt != 29)
-					break;
-				stksize = -((short)i.IType.imm);
-			}
-
-			offset += sizeof(int);
-
-			if (*flags & CPU_DTRACE_FAULT)
-				goto fault;
-		}
-	}
-
-	/*
-	 * We reached the end of backtrace
-	 */
-	if (*pc == *ra)
-		return (-1);
-
-	*pc = *ra;
-	*sp += stksize;
-
-	return (0);
-fault:
-	/*
-	 * We just got lost in backtrace, no big deal
-	 */
-	*flags &= ~CPU_DTRACE_FAULT;
-	return (-1);
-}
-
-static int
-dtrace_copycheck(uintptr_t uaddr, uintptr_t kaddr, size_t size)
-{
-
-	if (uaddr + size > VM_MAXUSER_ADDRESS || uaddr + size < uaddr) {
-		DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
-		cpu_core[curcpu].cpuc_dtrace_illval = uaddr;
-		return (0);
-	}
-
-	return (1);
-}
-
-void
-dtrace_copyin(uintptr_t uaddr, uintptr_t kaddr, size_t size,
-    volatile uint16_t *flags)
-{
-	if (dtrace_copycheck(uaddr, kaddr, size))
-		dtrace_copy(uaddr, kaddr, size);
-}
-
-void
-dtrace_copyout(uintptr_t kaddr, uintptr_t uaddr, size_t size,
-    volatile uint16_t *flags)
-{
-	if (dtrace_copycheck(uaddr, kaddr, size))
-		dtrace_copy(kaddr, uaddr, size);
-}
-
-void
-dtrace_copyinstr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
-    volatile uint16_t *flags)
-{
-	if (dtrace_copycheck(uaddr, kaddr, size))
-		dtrace_copystr(uaddr, kaddr, size, flags);
-}
-
-void
-dtrace_copyoutstr(uintptr_t kaddr, uintptr_t uaddr, size_t size,
-    volatile uint16_t *flags)
-{
-	if (dtrace_copycheck(uaddr, kaddr, size))
-		dtrace_copystr(kaddr, uaddr, size, flags);
-}
-
-uint8_t
-dtrace_fuword8(void *uaddr)
-{
-	if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) {
-		DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
-		cpu_core[curcpu].cpuc_dtrace_illval = (uintptr_t)uaddr;
-		return (0);
-	}
-	return (dtrace_fuword8_nocheck(uaddr));
-}
-
-uint16_t
-dtrace_fuword16(void *uaddr)
-{
-	if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) {
-		DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
-		cpu_core[curcpu].cpuc_dtrace_illval = (uintptr_t)uaddr;
-		return (0);
-	}
-	return (dtrace_fuword16_nocheck(uaddr));
-}
-
-uint32_t
-dtrace_fuword32(void *uaddr)
-{
-	if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) {
-		DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
-		cpu_core[curcpu].cpuc_dtrace_illval = (uintptr_t)uaddr;
-		return (0);
-	}
-	return (dtrace_fuword32_nocheck(uaddr));
-}
-
-uint64_t
-dtrace_fuword64(void *uaddr)
-{
*** 576 LINES SKIPPED ***