All of lore.kernel.org
 help / color / mirror / Atom feed
From: Huacai Chen <chenhuacai@kernel.org>
To: Qing Zhang <zhangqing@loongson.cn>
Cc: WANG Xuerui <kernel@xen0n.name>,
	loongarch@lists.linux.dev,  LKML <linux-kernel@vger.kernel.org>,
	Jiaxun Yang <jiaxun.yang@flygoat.com>,
	 Jinyang He <hejinyang@loongson.cn>
Subject: Re: [PATCH 4/4] LoongArch: Add USER_STACKTRACE support
Date: Mon, 1 Aug 2022 23:31:30 +0800	[thread overview]
Message-ID: <CAAhV-H4qSbaS3=JJXk4fLMnVp2L_ZbFkrddzad0J3ewZDuGMMg@mail.gmail.com> (raw)
In-Reply-To: <20220801121726.9681-5-zhangqing@loongson.cn>

Hi, Qing,

On Mon, Aug 1, 2022 at 8:17 PM Qing Zhang <zhangqing@loongson.cn> wrote:
>
> To get the best output you can compile your userspace programs with
> frame pointers (at least glibc + the app you are tracing export "CC
> =gcc -fno-omit-frame-pointer".
>
> ...
>      echo 'p:malloc /usr/lib64/libc.so.6:0x0a4704 size=%r4:u64'
>                                                 > uprobe_events
>      echo 'p:free /usr/lib64/libc.so.6:0x0a4d50 ptr=%r4:x64'
>                                                >> uprobe_events
>      echo 'comm == "demo"' > ./events/uprobes/malloc/filter
>      echo 'comm == "demo"' > ./events/uprobes/free/filter
>      echo 1 > ./options/userstacktrace
>      echo 1 > ./options/sym-userobj
>  ...
>
> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
> ---
>  arch/loongarch/Kconfig                  |  1 +
>  arch/loongarch/include/asm/stacktrace.h |  5 +++
>  arch/loongarch/kernel/stacktrace.c      | 42 +++++++++++++++++++++++++
>  3 files changed, 48 insertions(+)
>
> diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
> index 85d0fa3147cd..05906384d564 100644
> --- a/arch/loongarch/Kconfig
> +++ b/arch/loongarch/Kconfig
> @@ -107,6 +107,7 @@ config LOONGARCH
>         select SWIOTLB
>         select TRACE_IRQFLAGS_SUPPORT
>         select USE_PERCPU_NUMA_NODE_ID
> +       select USER_STACKTRACE_SUPPORT
>         select ZONE_DMA32
>         select MMU_GATHER_MERGE_VMAS if MMU
>
> diff --git a/arch/loongarch/include/asm/stacktrace.h b/arch/loongarch/include/asm/stacktrace.h
> index 49cb89213aeb..77fdb8ad662d 100644
> --- a/arch/loongarch/include/asm/stacktrace.h
> +++ b/arch/loongarch/include/asm/stacktrace.h
> @@ -21,6 +21,11 @@ struct stack_info {
>         unsigned long begin, end, next_sp;
>  };
>
> +struct stack_frame {
> +       unsigned long   fp;
> +       unsigned long   ra;
> +};
> +
>  bool in_task_stack(unsigned long stack, struct task_struct *task,
>                         struct stack_info *info);
>  bool in_irq_stack(unsigned long stack, struct stack_info *info);
> diff --git a/arch/loongarch/kernel/stacktrace.c b/arch/loongarch/kernel/stacktrace.c
> index f4f4b8ad3917..344224c7cb0e 100644
> --- a/arch/loongarch/kernel/stacktrace.c
> +++ b/arch/loongarch/kernel/stacktrace.c
> @@ -6,6 +6,7 @@
>   */
>  #include <linux/sched.h>
>  #include <linux/stacktrace.h>
> +#include <linux/uaccess.h>
>
>  #include <asm/stacktrace.h>
>  #include <asm/unwind.h>
> @@ -35,3 +36,44 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
>                         break;
>         }
>  }
> +
> +static int
> +copy_stack_frame(unsigned long fp, struct stack_frame *frame)
> +{
> +       int ret;
> +       unsigned long err;
> +       unsigned long __user *user_frame_tail;
> +
> +       user_frame_tail = (unsigned long *)(fp - sizeof(struct stack_frame));
> +       if (!access_ok(user_frame_tail, sizeof(*frame)))
> +               return 0;
> +
> +       ret = 1;
Maybe initializing it at its definition is better?

Huacai
> +       pagefault_disable();
> +       err = (__copy_from_user_inatomic(frame, user_frame_tail, sizeof(*frame)));
> +       if (err || (unsigned long)user_frame_tail >= frame->fp)
> +               ret = 0;
> +       pagefault_enable();
> +
> +       return ret;
> +}
> +
> +void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie,
> +                         const struct pt_regs *regs)
> +{
> +       unsigned long fp = regs->regs[22];
> +
> +       while (fp && !((unsigned long)fp & 0xf)) {
> +               struct stack_frame frame;
> +
> +               frame.fp = 0;
> +               frame.ra = 0;
> +               if (!copy_stack_frame(fp, &frame))
> +                       break;
> +               if (!frame.ra)
> +                       break;
> +               if (!consume_entry(cookie, frame.ra))
> +                       break;
> +               fp = frame.fp;
> +       }
> +}
> --
> 2.20.1
>
>

  reply	other threads:[~2022-08-01 15:31 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-01 12:17 [PATCH 0/4] LoongArch: Add unwinder support Qing Zhang
2022-08-01 12:17 ` [PATCH 1/4] LoongArch: Add guess " Qing Zhang
2022-08-01 15:28   ` Huacai Chen
2022-08-01 12:17 ` [PATCH 2/4] LoongArch: Add prologue " Qing Zhang
2022-08-01 15:26   ` Huacai Chen
2022-08-02  1:30     ` Youling Tang
2022-08-02  1:34       ` Huacai Chen
2022-08-02  1:39         ` Xi Ruoyao
2022-08-02  1:53           ` Huacai Chen
2022-08-01 12:17 ` [PATCH 3/4] LoongArch: Add stacktrace support Qing Zhang
2022-08-01 15:30   ` Huacai Chen
2022-08-02  1:19     ` zhangqing
2022-08-02  1:30       ` Huacai Chen
2022-08-02  2:01         ` Qing Zhang
2022-08-13 22:29   ` kernel test robot
2022-08-14  5:31   ` kernel test robot
2022-08-01 12:17 ` [PATCH 4/4] LoongArch: Add USER_STACKTRACE support Qing Zhang
2022-08-01 15:31   ` Huacai Chen [this message]
2022-08-01 15:34 ` [PATCH 0/4] LoongArch: Add unwinder support Huacai Chen
2022-08-02  1:15   ` Xi Ruoyao
2022-08-02  1:35   ` zhangqing

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAAhV-H4qSbaS3=JJXk4fLMnVp2L_ZbFkrddzad0J3ewZDuGMMg@mail.gmail.com' \
    --to=chenhuacai@kernel.org \
    --cc=hejinyang@loongson.cn \
    --cc=jiaxun.yang@flygoat.com \
    --cc=kernel@xen0n.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=loongarch@lists.linux.dev \
    --cc=zhangqing@loongson.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.