From nobody Fri Jan 07 16:27:52 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 028A11934163; Fri, 7 Jan 2022 16:27:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4JVpY456CDz3pTx; Fri, 7 Jan 2022 16:27:52 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 8EBBD6853; Fri, 7 Jan 2022 16:27:52 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 207GRqCl062000; Fri, 7 Jan 2022 16:27:52 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 207GRqhH061999; Fri, 7 Jan 2022 16:27:52 GMT (envelope-from git) Date: Fri, 7 Jan 2022 16:27:52 GMT Message-Id: <202201071627.207GRqhH061999@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 746e31e41818 - main - Remove mips dtrace. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 746e31e41818e02110c5aa8df509cc438b03a2dc Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1641572872; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=+H6uE/pL4O97/e0yOqqGpNKCorm/LjS8XSSF1ga5qB0=; b=ClLcNk4KLPOEa+deUZ7hZObsuEPl1OUiQtJeLoBjaByJDhifwHXm7Nm+Gc7NFeS4xYQGkB xaNSl+rmnkGdxdcDE/epPO9A9ZjNLXIpwws5N165zRqI8eajkz97kpA6CKpUeVUp7OWZDY xVnyTlE9hzZQT0YlS0OToN1MBO4bsHkyWfe0HUs3h/qDDNwquXfXLhq0FSwDLac/rmOvD2 s5DAAB0vxT8EWVkuxknuL4G4AFy+2FKdKsEK+5NZd0HWkSIWdKSZDg5tO6M4dTbjEmmk2I v/8Ep90v5hnvplNG+uh3I03vekzt3q5LsTveJprZF7hS7tDpXZ9yS/pGIAkKQA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1641572872; a=rsa-sha256; cv=none; b=K2QrKX5sdKSiJCh3xsvo93RIJLwJ6+tMkFq8jlI1qmHrgbBJ0k2S7zzZ+QLJ+NnaC1rfj4 eyq45qvJAANUNCzaxBI8X0HIHCpChtjbIqzwGtJShRCZarxX+a67OFFxc++ubygongi8uJ J6Gf+rUZXa0w8HKc9PWGGKOc0W+r0Ep56zMqwn00GEh1xZrAFiX7ZFFsMOXcxaaqxU7dhD ZG5wWt737VJqE92itcTnpnphsQR+Cbl+ZJZD/Q1fEQ3RK98SFMwllCmibZ5QNuz/riwCjJ zB1JMjhlPoy1+7PF3iiYM2L0y3WhTiAqhbR8C0RQnhtoT5iOADl2EZmNIFSkhQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=746e31e41818e02110c5aa8df509cc438b03a2dc commit 746e31e41818e02110c5aa8df509cc438b03a2dc Author: Warner Losh AuthorDate: 2022-01-07 15:59:15 +0000 Commit: Warner Losh 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 -#include - -#include -#include -#include -#include - - .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 - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#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 ***