From nobody Wed Mar 15 20:02:20 2023 X-Original-To: dev-commits-src-branches@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 4PcLs91sJbz3xj9m; Wed, 15 Mar 2023 20:02:21 +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 4PcLs91R60z3q6b; Wed, 15 Mar 2023 20:02:21 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1678910541; 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=qAPK0ptYOKP2baoSadOb9gaU4HgndPz4Leu9TkHwdEg=; b=vIB04B41nW/rcWZGT6a0kgzjB/ehi0/A1hlLQXuGpluZhgSHIMmEibzXNUtbiVLNlDyaNo k/atmFpxbq8udVZM2BQmPjpTIY41Xbdxs1exrv7IADm+TakHaofthyYphOkfF52NfK4JbM KJQ2ucsafgurbYEM4luTeMHXI7J3+JqbLeMUQyoMyqVv4WfHVQuZVuV5wsXMBR3rGBetC/ MA+AJZdr0aKlrKYRDUNUlyNxSLC0jjZ32GV/lm2/JkiGGVuSIUJKyWz2y/ZOuWnX3HonjZ gwt5fZKD8Jt/9pyFDYcfHh7AXkPDOWeYmgABNMBeYjYSjZ9ryAELEx70pg1M9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1678910541; 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=qAPK0ptYOKP2baoSadOb9gaU4HgndPz4Leu9TkHwdEg=; b=bHtwjE/tOwQ/Fy4gxzmncl79BfJ8fZ4+OJyp2Zm5paLTVYm8GTYH9Qoh7zVk2rkJy5yYYv HJmnOHyJ1u175vfpjfzR8d/CjK7NS9uLR8k1iw/gUgHt5BKnMpx37SgfX4ncF5jlF/MAnI ULb72joG6Mc3zHzRj/7tdHexKgXy60etHk+gASwaL8vcdGUbamqNCrY1Y91RPUvgQQ7Gf8 6qTqELUBHrXptYiGtv+zvbmWamctho14j1qACnT/qom+tLLZEV8H0dn9ueASXbdb3b5gZ9 wBiUTq/s7JuK1DJDCrKj+vJVkMaA2qD8B/r9nPg/mCXKBsPjvQ3LaQgBCDqzLQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1678910541; a=rsa-sha256; cv=none; b=PWr9INxHYePvhWmquDFQGg+HlMZ4SPkVQWDDyLPrKoM90SwpVb37eGFdyJVtUJ6eJwMkUp F6eRIPp9Nclql/jCvPPXvtZkN1/IIKS/BYAwEQIikXp2EgzcWIWVU77HOqCyeQrp5AuUoG /XqrWNWpPpsVGWvy5GUlw+Ztb7/H5Q4zFjjhX+VXi5pu+7Er95Z55ncsbm/pq0fuLmW35E VTJzoCIfII7pnF7zVuRVvLz0iSZirQeXUWjJ6ztHZ5avHi89gzCQYSZxE1mla0VlLAmmWb gKsDdPGM34cJCfseJ7HGx3PNo9sqaMFL+eU4a0pMusS4fV9SvnFIw/6zWtL99w== 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 4PcLs90BrLzFpl; Wed, 15 Mar 2023 20:02:21 +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 32FK2KDn084457; Wed, 15 Mar 2023 20:02:20 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 32FK2KkJ084456; Wed, 15 Mar 2023 20:02:20 GMT (envelope-from git) Date: Wed, 15 Mar 2023 20:02:20 GMT Message-Id: <202303152002.32FK2KkJ084456@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Justin Hibbits Subject: git: 0a21a6659e5d - stable/13 - dtrace/powerpc: "Fix" stack traces across trap frames List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhibbits X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 0a21a6659e5dfe503da587fb0460ae19bd765859 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=0a21a6659e5dfe503da587fb0460ae19bd765859 commit 0a21a6659e5dfe503da587fb0460ae19bd765859 Author: Justin Hibbits AuthorDate: 2023-03-11 16:30:00 +0000 Commit: Justin Hibbits CommitDate: 2023-03-15 19:47:49 +0000 dtrace/powerpc: "Fix" stack traces across trap frames In function boundary tracing the link register is not yet saved to the save stack location, so the save point contains whatever the previous 'lr' save was, or even garbage, at the time the trap is taken. Address this by explicitly loading the link register from the trap frame instead of the stack, and propagate that out. (cherry picked from commit 3e1155ade1baab51458374efd0295bdf6db455fc) (cherry picked from commit e620e088cbd1c062655eee825aaf4f80bd255e1f) --- sys/cddl/dev/dtrace/powerpc/dtrace_isa.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c b/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c index cce1c907b5d8..1fca72e5b7fd 100644 --- a/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c +++ b/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c @@ -97,15 +97,18 @@ dtrace_sp_inkernel(uintptr_t sp) } static __inline void -dtrace_next_sp_pc(uintptr_t sp, uintptr_t *nsp, uintptr_t *pc) +dtrace_next_sp_pc(uintptr_t sp, uintptr_t *nsp, uintptr_t *pc, uintptr_t *lr) { vm_offset_t callpc; struct trapframe *frame; + if (lr != 0 && *lr != 0) + callpc = *lr; + else #ifdef __powerpc64__ - callpc = *(vm_offset_t *)(sp + RETURN_OFFSET64); + callpc = *(vm_offset_t *)(sp + RETURN_OFFSET64); #else - callpc = *(vm_offset_t *)(sp + RETURN_OFFSET); + callpc = *(vm_offset_t *)(sp + RETURN_OFFSET); #endif /* @@ -121,6 +124,8 @@ dtrace_next_sp_pc(uintptr_t sp, uintptr_t *nsp, uintptr_t *pc) *nsp = frame->fixreg[1]; if (pc != NULL) *pc = frame->srr0; + if (lr != NULL) + *lr = frame->lr; return; } @@ -128,6 +133,9 @@ dtrace_next_sp_pc(uintptr_t sp, uintptr_t *nsp, uintptr_t *pc) *nsp = *(uintptr_t *)sp; if (pc != NULL) *pc = callpc; + /* lr is only valid for trap frames */ + if (lr != NULL) + *lr = 0; } void @@ -135,7 +143,7 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes, uint32_t *intrpc) { int depth = 0; - uintptr_t osp, sp; + uintptr_t osp, sp, lr = 0; vm_offset_t callpc; pc_t caller = (pc_t) solaris_cpu[curcpu].cpu_dtrace_caller; @@ -154,7 +162,7 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes, if (!dtrace_sp_inkernel(sp)) break; osp = sp; - dtrace_next_sp_pc(osp, &sp, &callpc); + dtrace_next_sp_pc(osp, &sp, &callpc, &lr); if (aframes > 0) { aframes--; @@ -513,7 +521,7 @@ dtrace_getstackdepth(int aframes) depth++; osp = sp; - dtrace_next_sp_pc(sp, &sp, NULL); + dtrace_next_sp_pc(sp, &sp, NULL, NULL); } if (depth < aframes) return (0);