Hi, On 15.05.2018 19:30, Andy Lutomirski wrote: > >> On May 15, 2018, at 1:08 AM, Alexey Budankov >> <alexey.budan...@linux.intel.com> wrote: >> >> >> Hi Andy, >> >>> On 09.05.2018 17:54, Peter Zijlstra wrote: >>>> On Tue, May 08, 2018 at 06:21:36PM +0300, Alexey Budankov wrote: >>>> >>>> Store user space frame-pointer value (BP register) into Perf trace >>>> on a sample for a process so the value becomes available when >>>> unwinding call stacks for functions gaining event samples. >>>> >>>> Signed-off-by: Alexey Budankov <alexey.budan...@linux.intel.com> >>>> --- >>>> arch/x86/kernel/perf_regs.c | 8 +++++++- >>>> 1 file changed, 7 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c >>>> index e47b2dbbdef3..8d68658eff7f 100644 >>>> --- a/arch/x86/kernel/perf_regs.c >>>> +++ b/arch/x86/kernel/perf_regs.c >>>> @@ -156,7 +156,13 @@ void perf_get_regs_user(struct perf_regs *regs_user, >>> >>> >>>> * Most system calls don't save these registers, don't report them. >>> >>> ^^^ that worries me and is the reason for the '-1's below. However I >>> think with all the PTI rework this might no longer be true. >>> >>> The Changelog needs to state that user_regs->bp is in fact valid and >>> ideally point to the commits that makes it so. Also this patch should >>> update that comment. >>> >>> Cc Andy who keeps better track of all that than me. >> >> Are there any thoughts so far? Feedback on the matter above is highly >> appreciated. > > Sorry, I missed this. Can you forward the original patch? I don’t have it.
Store user space frame-pointer value (BP register) into Perf trace on a sample for a process so the value becomes available when unwinding call stacks for functions gaining event samples. Signed-off-by: Alexey Budankov <alexey.budan...@linux.intel.com> --- arch/x86/kernel/perf_regs.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c index e47b2dbbdef3..8d68658eff7f 100644 --- a/arch/x86/kernel/perf_regs.c +++ b/arch/x86/kernel/perf_regs.c @@ -156,7 +156,13 @@ void perf_get_regs_user(struct perf_regs *regs_user, * Most system calls don't save these registers, don't report them. */ regs_user_copy->bx = -1; - regs_user_copy->bp = -1; + /* + * Store user space frame-pointer value on sample + * to facilitate stack unwinding for cases when + * user space executable code has such support + * enabled at compile time; + */ + regs_user_copy->bp = user_regs->bp; regs_user_copy->r12 = -1; regs_user_copy->r13 = -1; regs_user_copy->r14 = -1; > These days, system calls should save all registers, but I’m not entirely sure > I want to promise that they’ll continue to do so forever. >