On Thu, Sep 25, 2025 at 10:08:22AM +0800, Feng Yang wrote: > From: Feng Yang <[email protected]> > > When using bpf_program__attach_kprobe_multi_opts on ARM64 to hook a BPF > program > that contains the bpf_get_stackid function, the BPF program fails > to obtain the stack trace and returns -EFAULT. > > This is because ftrace_partial_regs omits the configuration of the pstate > register, > leaving pstate at the default value of 0. When get_perf_callchain executes, > it uses user_mode(regs) to determine whether it is in kernel mode. > This leads to a misjudgment that the code is in user mode, > so perf_callchain_kernel is not executed and the function returns directly. > As a result, trace->nr becomes 0, and finally -EFAULT is returned. > > Therefore, the assignment of the pstate register is added here. > > Fixes: b9b55c8912ce ("tracing: Add ftrace_partial_regs() for converting > ftrace_regs to pt_regs") > Closes: > https://lore.kernel.org/bpf/[email protected]/ > Signed-off-by: Feng Yang <[email protected]>
Tested-by: Jiri Olsa <[email protected]> thanks, jirka > --- > arch/arm64/include/asm/ftrace.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h > index bfe3ce9df197..ba7cf7fec5e9 100644 > --- a/arch/arm64/include/asm/ftrace.h > +++ b/arch/arm64/include/asm/ftrace.h > @@ -153,6 +153,7 @@ ftrace_partial_regs(const struct ftrace_regs *fregs, > struct pt_regs *regs) > regs->pc = afregs->pc; > regs->regs[29] = afregs->fp; > regs->regs[30] = afregs->lr; > + regs->pstate = PSR_MODE_EL1h; > return regs; > } > > -- > 2.25.1 >
