From nobody Sat May 6 17:49:46 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 4QDFSC194Wz49skp; Sat, 6 May 2023 17:49:47 +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 4QDFSC0ck6z3G8r; Sat, 6 May 2023 17:49:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683395387; 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=i11sIVMsgx+/N88m4IuCoA7oaMvutuJoKFtjwzro8C0=; b=Wbxx99QJBOlznd9ROXNPwf9+R1Y/lOOe/maw9WlYw0RAEhQYFVVdSYDrSyMTEzRdubFkkb waemGptBnpRM1us2ZkL/kx0Kw/u3gsfvY5LsmNtKrxmDQWhUc0PxHXgkDdOQ6+QKr8ZuDS 5hwkei+20on6JMgmLKbiemkjvFHYULY6nhMyPaeXiwzUlvaonAmBmMk+12A3ekGii3OAwe 0hi8OP5xZypcCpGtG28m0qxhkcotEFnSu0rZfDyCD2f4KMvWviQlRnQdRzjEX6uM91SM46 fcBqORKKr40+RP9KR57/vN5gF1Et09eEctB6VcwJn4slt4oyPnySO0+YdpBIpw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683395387; 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=i11sIVMsgx+/N88m4IuCoA7oaMvutuJoKFtjwzro8C0=; b=tIV5qPk6oBuLLFz4bzE0JmJ150y31pKNteRR5oO7jlWCUu+noS25Qq6RK0Qe1fyApSWgDm s99q9DhEy0x6m+oUxKzltK8KEM6p0l9jQSfD6GAoQUK1KK3lEmzx2faWXZ6T/chMAoDrHW OHGL472BjAQKz/4rz2E/r+jUkEmYvtbsqZKqDSa4r1SjzvB3vJ9ETE7dj6J2RQZ4nqJusM XPIdG35wlSwOtSbQfaqllGe46oZ7sH/nUGeNqVGmBuoTYLRRSgGKZU+nO2oaguSUyYR9IM 30XpK0eu5O4W9ZBZEXijB35Q2EMaWP3lsV4+DOm/fsxC4mxM+cYXWQfyS4yPvw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683395387; a=rsa-sha256; cv=none; b=ZY7LCT2OSkUDXCEkycoBGD3bmi9bf99aMrZ0bkrEVXxgR4G/yaam1uxfnEL08nOoY8tbgy nHG0zDubDRwxC2ut8Np3iEKFf8j6a7aVni/Bvk4Gg0vZelVRgEg84sA7leE4MqqyN9luar FJyaWryLPIb44LBxPqw2lU2eO4QvPR4vNBwdzNVXcNtn7tCGOGdBiitdZf3fAvhY3C/mas lp6duV9sNWXKCe2OmsmbeyzqKstokm+MT15qkyouEDWfoTMHRLLNASeefXAXC6B4eCGVMS AmR+gtXv4EAo3sJDmGyyQ6tN7QHLlSf+hsxliBkrwwtRN9WzZ9Ytw6kikz7g5A== 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 4QDFSB6plQzm6Z; Sat, 6 May 2023 17:49:46 +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 346Hnk0s017975; Sat, 6 May 2023 17:49:46 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 346HnksB017974; Sat, 6 May 2023 17:49:46 GMT (envelope-from git) Date: Sat, 6 May 2023 17:49:46 GMT Message-Id: <202305061749.346HnksB017974@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: aba91805aa92 - main - hwpmc: use kstack_contains() 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: aba91805aa92a47b2f3f01741a55ff9f07c42d04 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=aba91805aa92a47b2f3f01741a55ff9f07c42d04 commit aba91805aa92a47b2f3f01741a55ff9f07c42d04 Author: Mitchell Horne AuthorDate: 2023-05-05 21:59:01 +0000 Commit: Mitchell Horne CommitDate: 2023-05-06 17:49:19 +0000 hwpmc: use kstack_contains() This existing helper function is preferable to the hand-rolled calculation of the kstack bounds. Make some small style improvements while here. Notably, rename every instance of "r", the return address, to "ra". Tidy the includes in the affected files. Reviewed by: jkoshy MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D39909 --- sys/amd64/include/pmc_mdep.h | 8 +++--- sys/arm/include/pmc_mdep.h | 6 ++--- sys/arm64/include/pmc_mdep.h | 9 +++---- sys/dev/hwpmc/hwpmc_arm.c | 35 +++++++++++--------------- sys/dev/hwpmc/hwpmc_arm64_md.c | 23 ++++++----------- sys/dev/hwpmc/hwpmc_x86.c | 56 ++++++++++++++++++------------------------ sys/i386/include/pmc_mdep.h | 6 ++--- sys/riscv/include/pmc_mdep.h | 11 ++++----- 8 files changed, 61 insertions(+), 93 deletions(-) diff --git a/sys/amd64/include/pmc_mdep.h b/sys/amd64/include/pmc_mdep.h index 026a9ae2e669..5563f5b1bdbb 100644 --- a/sys/amd64/include/pmc_mdep.h +++ b/sys/amd64/include/pmc_mdep.h @@ -109,11 +109,9 @@ union pmc_md_pmc { ((PC) >= (uintptr_t) start_exceptions && \ (PC) < (uintptr_t) end_exceptions) -#define PMC_IN_KERNEL_STACK(S,START,END) \ - ((S) >= (START) && (S) < (END)) -#define PMC_IN_KERNEL(va) INKERNEL(va) - -#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) +#define PMC_IN_KERNEL_STACK(va) kstack_contains(curthread, (va), sizeof(va)) +#define PMC_IN_KERNEL(va) INKERNEL(va) +#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) /* Build a fake kernel trapframe from current instruction pointer. */ #define PMC_FAKE_TRAPFRAME(TF) \ diff --git a/sys/arm/include/pmc_mdep.h b/sys/arm/include/pmc_mdep.h index 69cb0c84deca..d7b80abb64b0 100644 --- a/sys/arm/include/pmc_mdep.h +++ b/sys/arm/include/pmc_mdep.h @@ -52,11 +52,9 @@ union pmc_md_pmc { struct pmc_md_armv7_pmc pm_armv7; }; -#define PMC_IN_KERNEL_STACK(S,START,END) \ - ((S) >= (START) && (S) < (END)) +#define PMC_IN_KERNEL_STACK(va) kstack_contains(curthread, (va), sizeof(va)) #define PMC_IN_KERNEL(va) INKERNEL((va)) - -#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) +#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) #define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_pc) #define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_r11) diff --git a/sys/arm64/include/pmc_mdep.h b/sys/arm64/include/pmc_mdep.h index d27bdbd5afc1..049bb2b22751 100644 --- a/sys/arm64/include/pmc_mdep.h +++ b/sys/arm64/include/pmc_mdep.h @@ -66,12 +66,11 @@ union pmc_md_pmc { struct pmc_md_dmc620_pmc pm_dmc620; }; -#define PMC_IN_KERNEL_STACK(S,START,END) \ - ((S) >= (START) && (S) < (END)) +#define PMC_IN_KERNEL_STACK(va) kstack_contains(curthread, (va), sizeof(va)) #define PMC_IN_KERNEL(va) INKERNEL((va)) -#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) -#define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_elr) -#define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_x[29]) +#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) +#define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_elr) +#define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_x[29]) /* * Prototypes diff --git a/sys/dev/hwpmc/hwpmc_arm.c b/sys/dev/hwpmc/hwpmc_arm.c index c585a6cefd1e..a0e2e6823219 100644 --- a/sys/dev/hwpmc/hwpmc_arm.c +++ b/sys/dev/hwpmc/hwpmc_arm.c @@ -31,18 +31,17 @@ __FBSDID("$FreeBSD$"); #include -#include -#include #include +#include + +#include +#include #include #include #include #include - -#include -#include -#include +#include /* XXX: Userland code compiled with gcc will need an heuristic * to be correctly detected. @@ -78,45 +77,39 @@ int pmc_save_kernel_callchain(uintptr_t *cc, int maxsamples, struct trapframe *tf) { - uintptr_t pc, r, stackstart, stackend, fp; - struct thread *td; + uintptr_t pc, ra, fp; int count; KASSERT(TRAPF_USERMODE(tf) == 0,("[arm,%d] not a kernel backtrace", __LINE__)); - td = curthread; pc = PMC_TRAPFRAME_TO_PC(tf); *cc++ = pc; if (maxsamples <= 1) return (1); - stackstart = (uintptr_t) td->td_kstack; - stackend = (uintptr_t) td->td_kstack + td->td_kstack_pages * PAGE_SIZE; fp = PMC_TRAPFRAME_TO_FP(tf); - - if (!PMC_IN_KERNEL(pc) || - !PMC_IN_KERNEL_STACK(fp, stackstart, stackend)) + if (!PMC_IN_KERNEL(pc) || !PMC_IN_KERNEL_STACK(fp)) return (1); for (count = 1; count < maxsamples; count++) { /* Use saved lr as pc. */ - r = fp + PC_OFF * sizeof(uintptr_t); - if (!PMC_IN_KERNEL_STACK(r, stackstart, stackend)) + ra = fp + PC_OFF * sizeof(uintptr_t); + if (!PMC_IN_KERNEL_STACK(ra)) break; - pc = *(uintptr_t *)r; + pc = *(uintptr_t *)ra; if (!PMC_IN_KERNEL(pc)) break; *cc++ = pc; /* Switch to next frame up */ - r = fp + FP_OFF * sizeof(uintptr_t); - if (!PMC_IN_KERNEL_STACK(r, stackstart, stackend)) + ra = fp + FP_OFF * sizeof(uintptr_t); + if (!PMC_IN_KERNEL_STACK(ra)) break; - fp = *(uintptr_t *)r; - if (!PMC_IN_KERNEL_STACK(fp, stackstart, stackend)) + fp = *(uintptr_t *)ra; + if (!PMC_IN_KERNEL_STACK(fp)) break; } diff --git a/sys/dev/hwpmc/hwpmc_arm64_md.c b/sys/dev/hwpmc/hwpmc_arm64_md.c index dd51f7bd18d5..4220badb30a6 100644 --- a/sys/dev/hwpmc/hwpmc_arm64_md.c +++ b/sys/dev/hwpmc/hwpmc_arm64_md.c @@ -31,18 +31,17 @@ __FBSDID("$FreeBSD$"); #include -#include -#include #include +#include + +#include +#include #include #include #include #include - -#include -#include -#include +#include struct pmc_mdep * pmc_md_initialize(void) @@ -59,30 +58,22 @@ pmc_md_finalize(struct pmc_mdep *md) } int -pmc_save_kernel_callchain(uintptr_t *cc, int maxsamples, - struct trapframe *tf) +pmc_save_kernel_callchain(uintptr_t *cc, int maxsamples, struct trapframe *tf) { struct unwind_state frame; - uintptr_t stackstart, stackend; - struct thread *td; int count; KASSERT(TRAPF_USERMODE(tf) == 0,("[arm64,%d] not a kernel backtrace", __LINE__)); - td = curthread; frame.pc = PMC_TRAPFRAME_TO_PC(tf); *cc++ = frame.pc; if (maxsamples <= 1) return (1); - stackstart = (uintptr_t) td->td_kstack; - stackend = (uintptr_t) td->td_kstack + td->td_kstack_pages * PAGE_SIZE; frame.fp = PMC_TRAPFRAME_TO_FP(tf); - - if (!PMC_IN_KERNEL(frame.pc) || - !PMC_IN_KERNEL_STACK(frame.fp, stackstart, stackend)) + if (!PMC_IN_KERNEL(frame.pc) || !PMC_IN_KERNEL_STACK(frame.fp)) return (1); for (count = 1; count < maxsamples; count++) { diff --git a/sys/dev/hwpmc/hwpmc_x86.c b/sys/dev/hwpmc/hwpmc_x86.c index e427139244ad..913c8f756815 100644 --- a/sys/dev/hwpmc/hwpmc_x86.c +++ b/sys/dev/hwpmc/hwpmc_x86.c @@ -34,21 +34,22 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include -#include -#include + +#include +#include #include #include -#include -#include -#include +#include /* For x86/apicvar.h */ #include +#include +#include +#include -#include -#include -#include +#include #include "hwpmc_soft.h" @@ -155,36 +156,29 @@ pmc_save_user_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) int __nosanitizeaddress __nosanitizememory pmc_save_kernel_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) { - int n; + uintptr_t fp, pc, ra, sp; uint32_t instr; - uintptr_t fp, pc, r, sp, stackstart, stackend; - struct thread *td; + int n; KASSERT(TRAPF_USERMODE(tf) == 0,("[x86,%d] not a kernel backtrace", __LINE__)); - td = curthread; pc = PMC_TRAPFRAME_TO_PC(tf); fp = PMC_TRAPFRAME_TO_FP(tf); sp = PMC_TRAPFRAME_TO_KERNEL_SP(tf); *cc++ = pc; - r = fp + sizeof(uintptr_t); /* points to return address */ + ra = fp + sizeof(uintptr_t); /* points to return address */ if (nframes <= 1) return (1); - stackstart = (uintptr_t) td->td_kstack; - stackend = (uintptr_t) td->td_kstack + td->td_kstack_pages * PAGE_SIZE; - - if (PMC_IN_TRAP_HANDLER(pc) || - !PMC_IN_KERNEL(pc) || - !PMC_IN_KERNEL_STACK(r, stackstart, stackend) || - !PMC_IN_KERNEL_STACK(sp, stackstart, stackend) || - !PMC_IN_KERNEL_STACK(fp, stackstart, stackend)) + if (PMC_IN_TRAP_HANDLER(pc) || !PMC_IN_KERNEL(pc) || + !PMC_IN_KERNEL_STACK(ra) || !PMC_IN_KERNEL_STACK(sp) || + !PMC_IN_KERNEL_STACK(fp)) return (1); - instr = *(uint32_t *) pc; + instr = *(uint32_t *)pc; /* * Determine whether the interrupted function was in the @@ -205,15 +199,15 @@ pmc_save_kernel_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) * and the caller's address is therefore at sp[1]. */ sp += sizeof(uintptr_t); - if (!PMC_IN_KERNEL_STACK(sp, stackstart, stackend)) + if (!PMC_IN_KERNEL_STACK(sp)) return (1); - pc = *(uintptr_t *) sp; + pc = *(uintptr_t *)sp; } else { /* * Not in the function prologue or epilogue. */ - pc = *(uintptr_t *) r; - fp = *(uintptr_t *) fp; + pc = *(uintptr_t *)ra; + fp = *(uintptr_t *)fp; } for (n = 1; n < nframes; n++) { @@ -222,12 +216,11 @@ pmc_save_kernel_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) if (PMC_IN_TRAP_HANDLER(pc)) break; - r = fp + sizeof(uintptr_t); - if (!PMC_IN_KERNEL_STACK(fp, stackstart, stackend) || - !PMC_IN_KERNEL_STACK(r, stackstart, stackend)) + ra = fp + sizeof(uintptr_t); + if (!PMC_IN_KERNEL_STACK(fp) || !PMC_IN_KERNEL_STACK(ra)) break; - pc = *(uintptr_t *) r; - fp = *(uintptr_t *) fp; + pc = *(uintptr_t *)ra; + fp = *(uintptr_t *)fp; } return (n); @@ -236,7 +229,6 @@ pmc_save_kernel_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) /* * Machine dependent initialization for x86 class platforms. */ - struct pmc_mdep * pmc_md_initialize(void) { diff --git a/sys/i386/include/pmc_mdep.h b/sys/i386/include/pmc_mdep.h index 3d498e006a36..15bdd7a65dc8 100644 --- a/sys/i386/include/pmc_mdep.h +++ b/sys/i386/include/pmc_mdep.h @@ -121,11 +121,9 @@ struct pmc_mdep; #define PMC_TRAPFRAME_TO_USER_SP(TF) ((TF)->tf_esp) #define PMC_TRAPFRAME_TO_KERNEL_SP(TF) ((uintptr_t) &((TF)->tf_esp)) -#define PMC_IN_KERNEL_STACK(S,START,END) \ - ((S) >= (START) && (S) < (END)) +#define PMC_IN_KERNEL_STACK(va) kstack_contains(curthread, (va), sizeof(va)) #define PMC_IN_KERNEL(va) INKERNEL(va) - -#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) +#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) #define PMC_IN_TRAP_HANDLER(PC) \ ((PC) >= (uintptr_t)start_exceptions + setidt_disp && \ diff --git a/sys/riscv/include/pmc_mdep.h b/sys/riscv/include/pmc_mdep.h index 10dc5c8b98ed..b192d75ec14b 100644 --- a/sys/riscv/include/pmc_mdep.h +++ b/sys/riscv/include/pmc_mdep.h @@ -48,12 +48,11 @@ union pmc_md_pmc { struct pmc_md_riscv_pmc pm_riscv; }; -#define PMC_IN_KERNEL_STACK(S,START,END) \ - ((S) >= (START) && (S) < (END)) -#define PMC_IN_KERNEL(va) INKERNEL((va)) -#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) -#define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_ra) -#define PMC_TRAPFRAME_TO_FP(TF) (0) /* stub */ +#define PMC_IN_KERNEL_STACK(va) kstack_contains(curthread, (va), sizeof(va)) +#define PMC_IN_KERNEL(va) INKERNEL((va)) +#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) +#define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_ra) +#define PMC_TRAPFRAME_TO_FP(TF) (0) /* stub */ /* * Prototypes