From nobody Thu Jan 12 15:06:54 2023 X-Original-To: dev-commits-src-main@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 4Nt7Dt3s51z2r5Qv; Thu, 12 Jan 2023 15:06:54 +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 4Nt7Dt3R0fz3QLX; Thu, 12 Jan 2023 15:06:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673536014; 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=01Vmhk0aT7E8AOeJZwJDvNcBBYdpPTEXn3v6smHwUvk=; b=WAlRIZ949xXhVt/p4AtGjDaFZd5sP6cEABBfBTCWNal2x72K7AcrJeVFFu7ye15lSKxtyJ QHCu08GNIyXT4WDKZxzelfVsDZy/cn5G/JY/gB91LFQMhjYVhpLRrq8/UZiKHE0sVeh8yj 1q8DVAj8hsi+vCrhtO6647aOB2Ev13nfYV52+kpyKzOJc9ATSS35NbZ8OVI3FT9he6jk6+ uDACkhJdVFDsBg2ZqpOK+J7naT8uPJ2udEVhEc/tiVcYSqyUFuV91JB3fkK4ipeO9VTYBp x4YzLP9KAQ/k6xDDmYqe8b8CMGPbgfbUOOwfiOM5M8OvoRZlK0BpRJtnRLinbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673536014; 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=01Vmhk0aT7E8AOeJZwJDvNcBBYdpPTEXn3v6smHwUvk=; b=X5W5SwiYOvmQYtnG9hcAOzwpEWPOgBIppGwid0+K9AX4pRuWBU6fhabvystNNs8QnLU0A7 B4TVX/y5LnjnPZnt6NAg54w1xyX8wPqFsXB4KO2o4vjF+o0vXBq+NZlJZuivE+0eYyXpVy DszSSkuC/dnUnRe2BTMIqAA4QzIwhzwp1r9Sfh7Q62On7ckhKS/NDifwrJub3iEH8W9PWt 76dXVK6Z8ang1AV8eoJ8VNJNF7huHkhKKu/2QiFwlgBEQR1y2GXp8Kf6fM2nmjPh22o/DO n9JUGTJ8mn9w/dtltS75KsazCWuv/hnMuBovU56bAC/cqIB0h9ZIyVpbQVnmBQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1673536014; a=rsa-sha256; cv=none; b=pLjvEZMRQBMj7w2BRq+wJdb6SIgeaQSfk/L8Tx94lAYvl2NkAbJghwN0CpDFBWCI4DjQdO fAOIA1c94HfU2BLuvhavI/6ZKdpQY+DlxWAMbrlHHpmtqz2KVs6C/4OMfyNpREepbdGldQ TlbftGDWDVRPH42tq8Xbwjbw0eB87u95y2/2M6jy2yl1fZ7HuxwNxazFuEy6XfIDqem+kk IVCa5ZkEKNyypzwO9VsSHL3pOiPsHFXtcXIgSN5OX/ulJI1c9Aq6BfzwojfjtYj9RSdFzf 12WWhvZ+a2bZJRVU5Cdgut2Bfuvn2G/iNF+SrsDnAhqIZKyAftZ0VPqoio7ZiA== 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 4Nt7Dt2VkQzX4l; Thu, 12 Jan 2023 15:06:54 +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 30CF6s4v036554; Thu, 12 Jan 2023 15:06:54 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30CF6se7036553; Thu, 12 Jan 2023 15:06:54 GMT (envelope-from git) Date: Thu, 12 Jan 2023 15:06:54 GMT Message-Id: <202301121506.30CF6se7036553@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mitchell Horne Subject: git: cdfa49f2584a - main - dtrace: dtrace_getpcstack() tweaks for riscv List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mhorne X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: cdfa49f2584ac174648ced04d76a47ad6773f2f0 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=cdfa49f2584ac174648ced04d76a47ad6773f2f0 commit cdfa49f2584ac174648ced04d76a47ad6773f2f0 Author: Mitchell Horne AuthorDate: 2023-01-11 18:06:02 +0000 Commit: Mitchell Horne CommitDate: 2023-01-12 15:04:58 +0000 dtrace: dtrace_getpcstack() tweaks for riscv Backtraces for fbt probes are missing the caller's frame. Despite what the inherited comment claims, we do need to insert this manually on riscv. In fbt_invop(), set cpu_dtrace_caller to be the return address, not addr. We should not increment aframes within this function, since we begin the main loop by unwinding past the current frame. Plus some very small comment/style tweaks. MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D37661 --- sys/cddl/dev/dtrace/riscv/dtrace_isa.c | 32 ++++++++++++++++++++------------ sys/cddl/dev/fbt/riscv/fbt_isa.c | 2 +- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/sys/cddl/dev/dtrace/riscv/dtrace_isa.c b/sys/cddl/dev/dtrace/riscv/dtrace_isa.c index 1f585aa6fa3c..bc8426a752df 100644 --- a/sys/cddl/dev/dtrace/riscv/dtrace_isa.c +++ b/sys/cddl/dev/dtrace/riscv/dtrace_isa.c @@ -64,42 +64,50 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes, uint32_t *intrpc) { struct unwind_state state; - int scp_offset; + uintptr_t caller; register_t sp; + int scp_offset; int depth; depth = 0; + caller = solaris_cpu[curcpu].cpu_dtrace_caller; if (intrpc != 0) { - pcstack[depth++] = (pc_t) intrpc; + pcstack[depth++] = (pc_t)intrpc; } - aframes++; - + /* + * Construct the unwind state, starting from this function. This frame, + * and 'aframes' others will be skipped. + */ __asm __volatile("mv %0, sp" : "=&r" (sp)); state.fp = (uintptr_t)__builtin_frame_address(0); - state.sp = sp; + state.sp = (uintptr_t)sp; state.pc = (uintptr_t)dtrace_getpcstack; while (depth < pcstack_limit) { if (!unwind_frame(curthread, &state)) break; - if (!INKERNEL(state.pc) || !INKERNEL(state.fp)) + if (!INKERNEL(state.pc) || !kstack_contains(curthread, + (vm_offset_t)state.fp, sizeof(uintptr_t))) break; - /* - * NB: Unlike some other architectures, we don't need to - * explicitly insert cpu_dtrace_caller as it appears in the - * normal kernel stack trace rather than a special trap frame. - */ if (aframes > 0) { aframes--; + + /* + * fbt_invop() records the return address at the time + * the FBT probe fires. We need to insert this into the + * backtrace manually, since the stack frame state at + * the time of the probe does not capture it. + */ + if (aframes == 0 && caller != 0) + pcstack[depth++] = caller; } else { pcstack[depth++] = state.pc; } - } for (; depth < pcstack_limit; depth++) { diff --git a/sys/cddl/dev/fbt/riscv/fbt_isa.c b/sys/cddl/dev/fbt/riscv/fbt_isa.c index 659a9d44c81c..a67e83811d9e 100644 --- a/sys/cddl/dev/fbt/riscv/fbt_isa.c +++ b/sys/cddl/dev/fbt/riscv/fbt_isa.c @@ -57,7 +57,7 @@ fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval) for (; fbt != NULL; fbt = fbt->fbtp_hashnext) { if ((uintptr_t)fbt->fbtp_patchpoint == addr) { - cpu->cpu_dtrace_caller = addr; + cpu->cpu_dtrace_caller = frame->tf_ra - INSN_SIZE; if (fbt->fbtp_roffset == 0) { dtrace_probe(fbt->fbtp_id, frame->tf_a[0],