* [PATCH 0/4] alpha: perf register sampling and user stack dumps
@ 2026-10-11 20:16 Matt Turner
2026-10-11 20:16 ` [PATCH 1/4] alpha: fix stale user_stack_pointer() Matt Turner
` (5 more replies)
0 siblings, 6 replies; 11+ messages in thread
From: Matt Turner @ 2026-10-11 20:16 UTC (permalink / raw)
To: Richard Henderson, Magnus Lindholm
Cc: linux-alpha, linux-kernel, linux-doc, linux-perf-users, Matt Turner
This lets perf sample registers and dump the user stack on alpha, which
perf record --call-graph dwarf needs to unwind user space.
r9-r15 are not in pt_regs, so they cannot be sampled. An unwinder
therefore cannot get past a first frame that uses $15 as its frame
pointer (-O0 code or alloca).
The perf tool side is a separate patch for perf-tools-next. libdw also
needs alpha unwinding support, which I am sending to elfutils-devel.
---
Matt Turner (4):
alpha: fix stale user_stack_pointer()
alpha: stop storing the user stack pointer in pt_regs
alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread()
alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support
.../features/perf/perf-regs/arch-support.txt | 2 +-
.../features/perf/perf-stackdump/arch-support.txt | 2 +-
arch/alpha/Kconfig | 2 +
arch/alpha/include/asm/processor.h | 3 +-
arch/alpha/include/asm/ptrace.h | 7 +--
arch/alpha/include/uapi/asm/perf_regs.h | 45 +++++++++++++++++
arch/alpha/include/uapi/asm/ptrace.h | 2 +-
arch/alpha/kernel/Makefile | 1 +
arch/alpha/kernel/asm-offsets.c | 1 -
arch/alpha/kernel/entry.S | 5 --
arch/alpha/kernel/perf_regs.c | 56 ++++++++++++++++++++++
arch/alpha/kernel/process.c | 2 +-
arch/alpha/kernel/ptrace.c | 12 +++++
arch/alpha/kernel/traps.c | 8 ----
14 files changed, 122 insertions(+), 26 deletions(-)
---
base-commit: 8f5dbfb93440d1aba216a1a34369a65654b94be9
change-id: 20261001-alpha-perf-regs-v3-7e23508c1ca2
Best regards,
--
Matt Turner <mattst88@gmail.com>
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 1/4] alpha: fix stale user_stack_pointer() 2026-10-11 20:16 [PATCH 0/4] alpha: perf register sampling and user stack dumps Matt Turner @ 2026-10-11 20:16 ` Matt Turner 2026-10-12 16:18 ` Magnus Lindholm 2026-10-11 20:16 ` [PATCH 2/4] alpha: stop storing the user stack pointer in pt_regs Matt Turner ` (4 subsequent siblings) 5 siblings, 1 reply; 11+ messages in thread From: Matt Turner @ 2026-10-11 20:16 UTC (permalink / raw) To: Richard Henderson, Magnus Lindholm Cc: linux-alpha, linux-kernel, linux-doc, linux-perf-users, Matt Turner PALcode keeps the user stack pointer in the PCB, not the trap frame, so pt_regs->usp is only valid where entry code stores it: entSys, do_entArith() and do_entIF(). Interrupts, page faults and unaligned traps leave it stale, and ptrace and /proc/<pid>/syscall read it through user_stack_pointer(). A user-mode pt_regs is at the top of its task's stack, so find the thread_info from it and use rdusp() for current or pcb.usp otherwise, as KSTK_ESP() and the regset code already do. Fixes: 8a2857bc2b30 ("alpha: enable regset-based ptrace and core dumps") Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Matt Turner <mattst88@gmail.com> --- arch/alpha/include/asm/ptrace.h | 7 +------ arch/alpha/kernel/ptrace.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/arch/alpha/include/asm/ptrace.h b/arch/alpha/include/asm/ptrace.h index 430e8dc27ff7..45d1229344b6 100644 --- a/arch/alpha/include/asm/ptrace.h +++ b/arch/alpha/include/asm/ptrace.h @@ -26,12 +26,7 @@ static inline unsigned long regs_return_value(struct pt_regs *regs) return regs->r0; } -/* Helpers for working with the user stack pointer */ -static inline unsigned long user_stack_pointer(struct pt_regs *regs) -{ - /* Valid for user-mode regs */ - return regs->usp; -} +unsigned long user_stack_pointer(struct pt_regs *regs); static __always_inline bool regs_irqs_disabled(struct pt_regs *regs) { diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c index e1d8c2f69688..dba7e9905cfa 100644 --- a/arch/alpha/kernel/ptrace.c +++ b/arch/alpha/kernel/ptrace.c @@ -440,6 +440,18 @@ ptrace_cancel_bpt(struct task_struct * child) return (nsaved != 0); } +/* + * PALcode keeps the user stack pointer in the PCB, not the trap frame. + * A user-mode pt_regs sits at the top of its task's stack, so the + * thread_info is at the base. + */ +unsigned long user_stack_pointer(struct pt_regs *regs) +{ + struct thread_info *ti = (void *)((unsigned long)regs & -THREAD_SIZE); + + return ti == current_thread_info() ? rdusp() : ti->pcb.usp; +} + void user_enable_single_step(struct task_struct *child) { /* Mark single stepping. */ -- 2.55.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/4] alpha: fix stale user_stack_pointer() 2026-10-11 20:16 ` [PATCH 1/4] alpha: fix stale user_stack_pointer() Matt Turner @ 2026-10-12 16:18 ` Magnus Lindholm 0 siblings, 0 replies; 11+ messages in thread From: Magnus Lindholm @ 2026-10-12 16:18 UTC (permalink / raw) To: Matt Turner Cc: Richard Henderson, linux-alpha, linux-kernel, linux-doc, linux-perf-users Hi Matt, On Sun, Oct 11, 2026 at 10:16 PM Matt Turner <mattst88@gmail.com> wrote: > > PALcode keeps the user stack pointer in the PCB, not the trap frame, so > pt_regs->usp is only valid where entry code stores it: entSys, > do_entArith() and do_entIF(). Interrupts, page faults and unaligned > traps leave it stale, and ptrace and /proc/<pid>/syscall read it > through user_stack_pointer(). > > A user-mode pt_regs is at the top of its task's stack, so find the > thread_info from it and use rdusp() for current or pcb.usp otherwise, > as KSTK_ESP() and the regset code already do. > > Fixes: 8a2857bc2b30 ("alpha: enable regset-based ptrace and core dumps") > Assisted-by: Claude:claude-opus-5-5 > Signed-off-by: Matt Turner <mattst88@gmail.com> > --- > arch/alpha/include/asm/ptrace.h | 7 +------ > arch/alpha/kernel/ptrace.c | 12 ++++++++++++ > 2 files changed, 13 insertions(+), 6 deletions(-) > > diff --git a/arch/alpha/include/asm/ptrace.h b/arch/alpha/include/asm/ptrace.h > index 430e8dc27ff7..45d1229344b6 100644 > --- a/arch/alpha/include/asm/ptrace.h > +++ b/arch/alpha/include/asm/ptrace.h > @@ -26,12 +26,7 @@ static inline unsigned long regs_return_value(struct pt_regs *regs) > return regs->r0; > } > > -/* Helpers for working with the user stack pointer */ > -static inline unsigned long user_stack_pointer(struct pt_regs *regs) > -{ > - /* Valid for user-mode regs */ > - return regs->usp; > -} > +unsigned long user_stack_pointer(struct pt_regs *regs); > > static __always_inline bool regs_irqs_disabled(struct pt_regs *regs) > { > diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c > index e1d8c2f69688..dba7e9905cfa 100644 > --- a/arch/alpha/kernel/ptrace.c > +++ b/arch/alpha/kernel/ptrace.c > @@ -440,6 +440,18 @@ ptrace_cancel_bpt(struct task_struct * child) > return (nsaved != 0); > } > > +/* > + * PALcode keeps the user stack pointer in the PCB, not the trap frame. > + * A user-mode pt_regs sits at the top of its task's stack, so the > + * thread_info is at the base. > + */ > +unsigned long user_stack_pointer(struct pt_regs *regs) > +{ > + struct thread_info *ti = (void *)((unsigned long)regs & -THREAD_SIZE); > + > + return ti == current_thread_info() ? rdusp() : ti->pcb.usp; > +} > + > void user_enable_single_step(struct task_struct *child) > { > /* Mark single stepping. */ > > -- > 2.55.0 > Nice work! Reviewed-by: Magnus Lindholm <linmag7@gmail.com> Tested-by: Magnus Lindholm <linmag7@gmail.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/4] alpha: stop storing the user stack pointer in pt_regs 2026-10-11 20:16 [PATCH 0/4] alpha: perf register sampling and user stack dumps Matt Turner 2026-10-11 20:16 ` [PATCH 1/4] alpha: fix stale user_stack_pointer() Matt Turner @ 2026-10-11 20:16 ` Matt Turner 2026-10-12 16:20 ` Magnus Lindholm 2026-10-11 20:16 ` [PATCH 3/4] alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() Matt Turner ` (3 subsequent siblings) 5 siblings, 1 reply; 11+ messages in thread From: Matt Turner @ 2026-10-11 20:16 UTC (permalink / raw) To: Richard Henderson, Magnus Lindholm Cc: linux-alpha, linux-kernel, linux-doc, linux-perf-users, Matt Turner Nothing reads pt_regs->usp now that user_stack_pointer() uses the PCB. Drop the stores, which saves a PAL_rdusp call on every syscall, and give the field back its old name. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Matt Turner <mattst88@gmail.com> --- arch/alpha/include/uapi/asm/ptrace.h | 2 +- arch/alpha/kernel/asm-offsets.c | 1 - arch/alpha/kernel/entry.S | 5 ----- arch/alpha/kernel/traps.c | 8 -------- 4 files changed, 1 insertion(+), 15 deletions(-) diff --git a/arch/alpha/include/uapi/asm/ptrace.h b/arch/alpha/include/uapi/asm/ptrace.h index 9d86b2a1526e..72ed913a910f 100644 --- a/arch/alpha/include/uapi/asm/ptrace.h +++ b/arch/alpha/include/uapi/asm/ptrace.h @@ -43,7 +43,7 @@ struct pt_regs { unsigned long trap_a1; unsigned long trap_a2; /* This makes the stack 16-byte aligned as GCC expects */ - unsigned long usp; + unsigned long __pad0; /* These are saved by PAL-code: */ unsigned long ps; unsigned long pc; diff --git a/arch/alpha/kernel/asm-offsets.c b/arch/alpha/kernel/asm-offsets.c index c89792c86044..22ed3c975b1c 100644 --- a/arch/alpha/kernel/asm-offsets.c +++ b/arch/alpha/kernel/asm-offsets.c @@ -30,7 +30,6 @@ static void __used foo(void) DEFINE(HAE_CACHE, offsetof(struct alpha_machine_vector, hae_cache)); DEFINE(HAE_REG, offsetof(struct alpha_machine_vector, hae_register)); - DEFINE(PT_REGS_USP, offsetof(struct pt_regs, usp)); DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_SYSCALL_WORK, offsetof(struct thread_info, syscall_work)); diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index bfa116d455fb..790389a15c3c 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -476,11 +476,6 @@ entSys: ldq $1, 0($sp) /* syscall nr from saved r0 */ stq $1, 8($sp) /* regs->r1 = shadow syscall nr */ - mov $0, $8 - call_pal PAL_rdusp - stq $0, PT_REGS_USP($sp) - mov $8, $0 - lda $8, 0x3fff bic $sp, $8, $8 diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index cfaef96c4ce8..5882c65b7ef1 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -30,12 +30,6 @@ #include "proto.h" -static __always_inline void alpha_snapshot_usp(struct pt_regs *regs) -{ - if (user_mode(regs)) - regs->usp = rdusp(); -} - void dik_show_regs(struct pt_regs *regs, unsigned long *r9_15) { @@ -186,7 +180,6 @@ do_entArith(unsigned long summary, unsigned long write_mask, { long si_code = FPE_FLTINV; - alpha_snapshot_usp(regs); if (summary & 1) { /* Software-completion summary bit is set, so try to emulate the instruction. If the processor supports @@ -208,7 +201,6 @@ do_entIF(unsigned long type, struct pt_regs *regs) { int signo, code; - alpha_snapshot_usp(regs); if (type == 3) { /* FEN fault */ /* Irritating users can call PAL_clrfen to disable the FPU for the process. The kernel will then trap in -- 2.55.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/4] alpha: stop storing the user stack pointer in pt_regs 2026-10-11 20:16 ` [PATCH 2/4] alpha: stop storing the user stack pointer in pt_regs Matt Turner @ 2026-10-12 16:20 ` Magnus Lindholm 0 siblings, 0 replies; 11+ messages in thread From: Magnus Lindholm @ 2026-10-12 16:20 UTC (permalink / raw) To: Matt Turner Cc: Richard Henderson, linux-alpha, linux-kernel, linux-doc, linux-perf-users Hi Matt, On Sun, Oct 11, 2026 at 10:16 PM Matt Turner <mattst88@gmail.com> wrote: > > Nothing reads pt_regs->usp now that user_stack_pointer() uses the PCB. > Drop the stores, which saves a PAL_rdusp call on every syscall, and > give the field back its old name. > > Assisted-by: Claude:claude-opus-5-5 > Signed-off-by: Matt Turner <mattst88@gmail.com> > --- > arch/alpha/include/uapi/asm/ptrace.h | 2 +- > arch/alpha/kernel/asm-offsets.c | 1 - > arch/alpha/kernel/entry.S | 5 ----- > arch/alpha/kernel/traps.c | 8 -------- > 4 files changed, 1 insertion(+), 15 deletions(-) > > diff --git a/arch/alpha/include/uapi/asm/ptrace.h b/arch/alpha/include/uapi/asm/ptrace.h > index 9d86b2a1526e..72ed913a910f 100644 > --- a/arch/alpha/include/uapi/asm/ptrace.h > +++ b/arch/alpha/include/uapi/asm/ptrace.h > @@ -43,7 +43,7 @@ struct pt_regs { > unsigned long trap_a1; > unsigned long trap_a2; > /* This makes the stack 16-byte aligned as GCC expects */ > - unsigned long usp; > + unsigned long __pad0; > /* These are saved by PAL-code: */ > unsigned long ps; > unsigned long pc; > diff --git a/arch/alpha/kernel/asm-offsets.c b/arch/alpha/kernel/asm-offsets.c > index c89792c86044..22ed3c975b1c 100644 > --- a/arch/alpha/kernel/asm-offsets.c > +++ b/arch/alpha/kernel/asm-offsets.c > @@ -30,7 +30,6 @@ static void __used foo(void) > > DEFINE(HAE_CACHE, offsetof(struct alpha_machine_vector, hae_cache)); > DEFINE(HAE_REG, offsetof(struct alpha_machine_vector, hae_register)); > - DEFINE(PT_REGS_USP, offsetof(struct pt_regs, usp)); > > DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); > DEFINE(TI_SYSCALL_WORK, offsetof(struct thread_info, syscall_work)); > diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S > index bfa116d455fb..790389a15c3c 100644 > --- a/arch/alpha/kernel/entry.S > +++ b/arch/alpha/kernel/entry.S > @@ -476,11 +476,6 @@ entSys: > ldq $1, 0($sp) /* syscall nr from saved r0 */ > stq $1, 8($sp) /* regs->r1 = shadow syscall nr */ > > - mov $0, $8 > - call_pal PAL_rdusp > - stq $0, PT_REGS_USP($sp) > - mov $8, $0 > - > lda $8, 0x3fff > bic $sp, $8, $8 > > diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c > index cfaef96c4ce8..5882c65b7ef1 100644 > --- a/arch/alpha/kernel/traps.c > +++ b/arch/alpha/kernel/traps.c > @@ -30,12 +30,6 @@ > > #include "proto.h" > > -static __always_inline void alpha_snapshot_usp(struct pt_regs *regs) > -{ > - if (user_mode(regs)) > - regs->usp = rdusp(); > -} > - > void > dik_show_regs(struct pt_regs *regs, unsigned long *r9_15) > { > @@ -186,7 +180,6 @@ do_entArith(unsigned long summary, unsigned long write_mask, > { > long si_code = FPE_FLTINV; > > - alpha_snapshot_usp(regs); > if (summary & 1) { > /* Software-completion summary bit is set, so try to > emulate the instruction. If the processor supports > @@ -208,7 +201,6 @@ do_entIF(unsigned long type, struct pt_regs *regs) > { > int signo, code; > > - alpha_snapshot_usp(regs); > if (type == 3) { /* FEN fault */ > /* Irritating users can call PAL_clrfen to disable the > FPU for the process. The kernel will then trap in > > -- > 2.55.0 > Looks good to me, I see the __pad0 is back again in pt_regs brings back memories from tracking down the stack alignment issues a while back. Reviewed-by: Magnus Lindholm <linmag7@gmail.com> Tested-by: Magnus Lindholm <linmag7@gmail.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/4] alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() 2026-10-11 20:16 [PATCH 0/4] alpha: perf register sampling and user stack dumps Matt Turner 2026-10-11 20:16 ` [PATCH 1/4] alpha: fix stale user_stack_pointer() Matt Turner 2026-10-11 20:16 ` [PATCH 2/4] alpha: stop storing the user stack pointer in pt_regs Matt Turner @ 2026-10-11 20:16 ` Matt Turner 2026-10-12 17:12 ` Magnus Lindholm 2026-10-11 20:16 ` [PATCH 4/4] alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support Matt Turner ` (2 subsequent siblings) 5 siblings, 1 reply; 11+ messages in thread From: Matt Turner @ 2026-10-11 20:16 UTC (permalink / raw) To: Richard Henderson, Magnus Lindholm Cc: linux-alpha, linux-kernel, linux-doc, linux-perf-users, Matt Turner Both open-code the same PCB lookup. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Matt Turner <mattst88@gmail.com> --- arch/alpha/include/asm/processor.h | 3 +-- arch/alpha/kernel/process.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/alpha/include/asm/processor.h b/arch/alpha/include/asm/processor.h index c461a26d47b3..73251cd671e0 100644 --- a/arch/alpha/include/asm/processor.h +++ b/arch/alpha/include/asm/processor.h @@ -43,8 +43,7 @@ unsigned long __get_wchan(struct task_struct *p); #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc) -#define KSTK_ESP(tsk) \ - ((tsk) == current ? rdusp() : task_thread_info(tsk)->pcb.usp) +#define KSTK_ESP(tsk) user_stack_pointer(task_pt_regs(tsk)) #define cpu_relax() barrier() diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 06522451f018..7861c9e767b7 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -318,7 +318,7 @@ dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt, struct thread_info *ti) dest[27] = pt->r27; dest[28] = pt->r28; dest[29] = pt->gp; - dest[30] = ti == current_thread_info() ? rdusp() : ti->pcb.usp; + dest[30] = user_stack_pointer(pt); dest[31] = pt->pc; /* Once upon a time this was the PS value. Which is stupid -- 2.55.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/4] alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() 2026-10-11 20:16 ` [PATCH 3/4] alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() Matt Turner @ 2026-10-12 17:12 ` Magnus Lindholm 0 siblings, 0 replies; 11+ messages in thread From: Magnus Lindholm @ 2026-10-12 17:12 UTC (permalink / raw) To: Matt Turner Cc: Richard Henderson, linux-alpha, linux-kernel, linux-doc, linux-perf-users Hi Matt, On Sun, Oct 11, 2026 at 10:16 PM Matt Turner <mattst88@gmail.com> wrote: > > Both open-code the same PCB lookup. > > Assisted-by: Claude:claude-opus-5-5 > Signed-off-by: Matt Turner <mattst88@gmail.com> > --- > arch/alpha/include/asm/processor.h | 3 +-- > arch/alpha/kernel/process.c | 2 +- > 2 files changed, 2 insertions(+), 3 deletions(-) > > diff --git a/arch/alpha/include/asm/processor.h b/arch/alpha/include/asm/processor.h > index c461a26d47b3..73251cd671e0 100644 > --- a/arch/alpha/include/asm/processor.h > +++ b/arch/alpha/include/asm/processor.h > @@ -43,8 +43,7 @@ unsigned long __get_wchan(struct task_struct *p); > > #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc) > > -#define KSTK_ESP(tsk) \ > - ((tsk) == current ? rdusp() : task_thread_info(tsk)->pcb.usp) > +#define KSTK_ESP(tsk) user_stack_pointer(task_pt_regs(tsk)) > > #define cpu_relax() barrier() > > diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c > index 06522451f018..7861c9e767b7 100644 > --- a/arch/alpha/kernel/process.c > +++ b/arch/alpha/kernel/process.c > @@ -318,7 +318,7 @@ dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt, struct thread_info *ti) > dest[27] = pt->r27; > dest[28] = pt->r28; > dest[29] = pt->gp; > - dest[30] = ti == current_thread_info() ? rdusp() : ti->pcb.usp; > + dest[30] = user_stack_pointer(pt); > dest[31] = pt->pc; > > /* Once upon a time this was the PS value. Which is stupid > > -- > 2.55.0 > Looks good to me. Tested-by: Magnus Lindholm <linmag7@gmail.com> Reviewed-by: Magnus Lindholm <linmag7@gmail.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 4/4] alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support 2026-10-11 20:16 [PATCH 0/4] alpha: perf register sampling and user stack dumps Matt Turner ` (2 preceding siblings ...) 2026-10-11 20:16 ` [PATCH 3/4] alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() Matt Turner @ 2026-10-11 20:16 ` Matt Turner 2026-10-12 17:34 ` Magnus Lindholm 2026-10-11 21:47 ` [PATCH 0/4] alpha: perf register sampling and user stack dumps Ian Rogers 2026-10-12 15:51 ` Magnus Lindholm 5 siblings, 1 reply; 11+ messages in thread From: Matt Turner @ 2026-10-11 20:16 UTC (permalink / raw) To: Richard Henderson, Magnus Lindholm Cc: linux-alpha, linux-kernel, linux-doc, linux-perf-users, Matt Turner Let perf sample registers and dump the user stack, which is what the perf tool needs for --call-graph dwarf. The register indices follow the hardware numbering, so r0-r30 map directly to DWARF register numbers, with pc after them. r9-r15 are callee-saved and live in switch_stack rather than pt_regs, so they cannot be sampled. Without r15 an unwinder cannot recover the CFA of a first frame that uses $15 as its frame pointer. sp is not in pt_regs either: for user frames it comes from user_stack_pointer(), and for kernel frames (PERF_SAMPLE_REGS_INTR) it is the end of the trap frame, as in stacktrace.c. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Matt Turner <mattst88@gmail.com> --- .../features/perf/perf-regs/arch-support.txt | 2 +- .../features/perf/perf-stackdump/arch-support.txt | 2 +- arch/alpha/Kconfig | 2 + arch/alpha/include/uapi/asm/perf_regs.h | 45 +++++++++++++++++ arch/alpha/kernel/Makefile | 1 + arch/alpha/kernel/perf_regs.c | 56 ++++++++++++++++++++++ 6 files changed, 106 insertions(+), 2 deletions(-) diff --git a/Documentation/features/perf/perf-regs/arch-support.txt b/Documentation/features/perf/perf-regs/arch-support.txt index 4c9a5a012075..7d736d678fd4 100644 --- a/Documentation/features/perf/perf-regs/arch-support.txt +++ b/Documentation/features/perf/perf-regs/arch-support.txt @@ -6,7 +6,7 @@ ----------------------- | arch |status| ----------------------- - | alpha: | TODO | + | alpha: | ok | | arc: | TODO | | arm: | ok | | arm64: | ok | diff --git a/Documentation/features/perf/perf-stackdump/arch-support.txt b/Documentation/features/perf/perf-stackdump/arch-support.txt index dd362b5cb638..17b84ea7769d 100644 --- a/Documentation/features/perf/perf-stackdump/arch-support.txt +++ b/Documentation/features/perf/perf-stackdump/arch-support.txt @@ -6,7 +6,7 @@ ----------------------- | arch |status| ----------------------- - | alpha: | TODO | + | alpha: | ok | | arc: | TODO | | arm: | ok | | arm64: | ok | diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index b2c359b947f6..8fafbfabd1e5 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -41,6 +41,8 @@ config ALPHA select HAVE_PAGE_SIZE_8KB select HAVE_PCSPKR_PLATFORM select HAVE_PERF_EVENTS + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP select NEED_DMA_MAP_STATE select NEED_SG_DMA_LENGTH select GENERIC_IRQ_PROBE diff --git a/arch/alpha/include/uapi/asm/perf_regs.h b/arch/alpha/include/uapi/asm/perf_regs.h new file mode 100644 index 000000000000..da96a31b12fb --- /dev/null +++ b/arch/alpha/include/uapi/asm/perf_regs.h @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_ASM_ALPHA_PERF_REGS_H +#define _UAPI_ASM_ALPHA_PERF_REGS_H + +/* + * Indices 0-30 match the hardware (and DWARF) register numbers. + * r9-r15 are not saved in pt_regs and cannot be sampled. + */ +enum perf_event_alpha_regs { + PERF_REG_ALPHA_R0, + PERF_REG_ALPHA_R1, + PERF_REG_ALPHA_R2, + PERF_REG_ALPHA_R3, + PERF_REG_ALPHA_R4, + PERF_REG_ALPHA_R5, + PERF_REG_ALPHA_R6, + PERF_REG_ALPHA_R7, + PERF_REG_ALPHA_R8, + PERF_REG_ALPHA_R9, + PERF_REG_ALPHA_R10, + PERF_REG_ALPHA_R11, + PERF_REG_ALPHA_R12, + PERF_REG_ALPHA_R13, + PERF_REG_ALPHA_R14, + PERF_REG_ALPHA_R15, + PERF_REG_ALPHA_R16, + PERF_REG_ALPHA_R17, + PERF_REG_ALPHA_R18, + PERF_REG_ALPHA_R19, + PERF_REG_ALPHA_R20, + PERF_REG_ALPHA_R21, + PERF_REG_ALPHA_R22, + PERF_REG_ALPHA_R23, + PERF_REG_ALPHA_R24, + PERF_REG_ALPHA_R25, + PERF_REG_ALPHA_R26, + PERF_REG_ALPHA_R27, + PERF_REG_ALPHA_R28, + PERF_REG_ALPHA_GP, + PERF_REG_ALPHA_SP, + PERF_REG_ALPHA_PC, + PERF_REG_ALPHA_MAX, +}; + +#endif /* _UAPI_ASM_ALPHA_PERF_REGS_H */ diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile index 4ea5c189e60e..0c04b89676ed 100644 --- a/arch/alpha/kernel/Makefile +++ b/arch/alpha/kernel/Makefile @@ -18,6 +18,7 @@ obj-$(CONFIG_PCI) += pci.o pci_iommu.o pci-sysfs.o obj-$(CONFIG_SRM_ENV) += srm_env.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_PERF_EVENTS) += perf_event.o +obj-$(CONFIG_HAVE_PERF_REGS) += perf_regs.o obj-$(CONFIG_RTC_DRV_ALPHA) += rtc.o obj-$(CONFIG_AUDIT) += audit.o diff --git a/arch/alpha/kernel/perf_regs.c b/arch/alpha/kernel/perf_regs.c new file mode 100644 index 000000000000..10afe4e205e9 --- /dev/null +++ b/arch/alpha/kernel/perf_regs.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include <linux/bits.h> +#include <linux/perf_event.h> +#include <asm/perf_regs.h> + +#define REG(idx, field) \ + [PERF_REG_ALPHA_##idx] = offsetof(struct pt_regs, field) + +#define REG_RESERVED (~GENMASK_ULL(PERF_REG_ALPHA_MAX - 1, 0) | \ + GENMASK_ULL(PERF_REG_ALPHA_R15, PERF_REG_ALPHA_R9)) + +static const unsigned int pt_regs_offset[PERF_REG_ALPHA_MAX] = { + REG(R0, r0), REG(R1, r1), REG(R2, r2), REG(R3, r3), + REG(R4, r4), REG(R5, r5), REG(R6, r6), REG(R7, r7), + REG(R8, r8), REG(R16, r16), REG(R17, r17), REG(R18, r18), + REG(R19, r19), REG(R20, r20), REG(R21, r21), REG(R22, r22), + REG(R23, r23), REG(R24, r24), REG(R25, r25), REG(R26, r26), + REG(R27, r27), REG(R28, r28), REG(GP, gp), REG(PC, pc), +}; + +u64 perf_reg_value(struct pt_regs *regs, int idx) +{ + if (idx == PERF_REG_ALPHA_SP) { + if (user_mode(regs)) + return user_stack_pointer(regs); + /* Same kernel sp approximation as stacktrace.c. */ + return (unsigned long)(regs + 1); + } + + if (WARN_ON_ONCE((u32)idx >= PERF_REG_ALPHA_MAX || + BIT_ULL(idx) & REG_RESERVED)) + return 0; + + return *(unsigned long *)((void *)regs + pt_regs_offset[idx]); +} + +int perf_reg_validate(u64 mask) +{ + if (!mask || mask & REG_RESERVED) + return -EINVAL; + + return 0; +} + +u64 perf_reg_abi(struct task_struct *task) +{ + return PERF_SAMPLE_REGS_ABI_64; +} + +void perf_get_regs_user(struct perf_regs *regs_user, + struct pt_regs *regs) +{ + regs_user->regs = task_pt_regs(current); + regs_user->abi = perf_reg_abi(current); +} -- 2.55.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/4] alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support 2026-10-11 20:16 ` [PATCH 4/4] alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support Matt Turner @ 2026-10-12 17:34 ` Magnus Lindholm 0 siblings, 0 replies; 11+ messages in thread From: Magnus Lindholm @ 2026-10-12 17:34 UTC (permalink / raw) To: Matt Turner Cc: Richard Henderson, linux-alpha, linux-kernel, linux-doc, linux-perf-users Hi Matt, On Sun, Oct 11, 2026 at 10:16 PM Matt Turner <mattst88@gmail.com> wrote: > > Let perf sample registers and dump the user stack, which is what the > perf tool needs for --call-graph dwarf. > > The register indices follow the hardware numbering, so r0-r30 map > directly to DWARF register numbers, with pc after them. r9-r15 > are callee-saved and live in switch_stack rather than pt_regs, so they > cannot be sampled. Without r15 an unwinder cannot recover the CFA of a > first frame that uses $15 as its frame pointer. > > sp is not in pt_regs either: for user frames it comes from > user_stack_pointer(), and for kernel frames (PERF_SAMPLE_REGS_INTR) it > is the end of the trap frame, as in stacktrace.c. > > Assisted-by: Claude:claude-opus-5-5 > Signed-off-by: Matt Turner <mattst88@gmail.com> > --- > .../features/perf/perf-regs/arch-support.txt | 2 +- > .../features/perf/perf-stackdump/arch-support.txt | 2 +- > arch/alpha/Kconfig | 2 + > arch/alpha/include/uapi/asm/perf_regs.h | 45 +++++++++++++++++ > arch/alpha/kernel/Makefile | 1 + > arch/alpha/kernel/perf_regs.c | 56 ++++++++++++++++++++++ > 6 files changed, 106 insertions(+), 2 deletions(-) > > diff --git a/Documentation/features/perf/perf-regs/arch-support.txt b/Documentation/features/perf/perf-regs/arch-support.txt > index 4c9a5a012075..7d736d678fd4 100644 > --- a/Documentation/features/perf/perf-regs/arch-support.txt > +++ b/Documentation/features/perf/perf-regs/arch-support.txt > @@ -6,7 +6,7 @@ > ----------------------- > | arch |status| > ----------------------- > - | alpha: | TODO | > + | alpha: | ok | > | arc: | TODO | > | arm: | ok | > | arm64: | ok | > diff --git a/Documentation/features/perf/perf-stackdump/arch-support.txt b/Documentation/features/perf/perf-stackdump/arch-support.txt > index dd362b5cb638..17b84ea7769d 100644 > --- a/Documentation/features/perf/perf-stackdump/arch-support.txt > +++ b/Documentation/features/perf/perf-stackdump/arch-support.txt > @@ -6,7 +6,7 @@ > ----------------------- > | arch |status| > ----------------------- > - | alpha: | TODO | > + | alpha: | ok | > | arc: | TODO | > | arm: | ok | > | arm64: | ok | > diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig > index b2c359b947f6..8fafbfabd1e5 100644 > --- a/arch/alpha/Kconfig > +++ b/arch/alpha/Kconfig > @@ -41,6 +41,8 @@ config ALPHA > select HAVE_PAGE_SIZE_8KB > select HAVE_PCSPKR_PLATFORM > select HAVE_PERF_EVENTS > + select HAVE_PERF_REGS > + select HAVE_PERF_USER_STACK_DUMP > select NEED_DMA_MAP_STATE > select NEED_SG_DMA_LENGTH > select GENERIC_IRQ_PROBE > diff --git a/arch/alpha/include/uapi/asm/perf_regs.h b/arch/alpha/include/uapi/asm/perf_regs.h > new file mode 100644 > index 000000000000..da96a31b12fb > --- /dev/null > +++ b/arch/alpha/include/uapi/asm/perf_regs.h > @@ -0,0 +1,45 @@ > +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > +#ifndef _UAPI_ASM_ALPHA_PERF_REGS_H > +#define _UAPI_ASM_ALPHA_PERF_REGS_H > + > +/* > + * Indices 0-30 match the hardware (and DWARF) register numbers. > + * r9-r15 are not saved in pt_regs and cannot be sampled. > + */ > +enum perf_event_alpha_regs { > + PERF_REG_ALPHA_R0, > + PERF_REG_ALPHA_R1, > + PERF_REG_ALPHA_R2, > + PERF_REG_ALPHA_R3, > + PERF_REG_ALPHA_R4, > + PERF_REG_ALPHA_R5, > + PERF_REG_ALPHA_R6, > + PERF_REG_ALPHA_R7, > + PERF_REG_ALPHA_R8, > + PERF_REG_ALPHA_R9, > + PERF_REG_ALPHA_R10, > + PERF_REG_ALPHA_R11, > + PERF_REG_ALPHA_R12, > + PERF_REG_ALPHA_R13, > + PERF_REG_ALPHA_R14, > + PERF_REG_ALPHA_R15, > + PERF_REG_ALPHA_R16, > + PERF_REG_ALPHA_R17, > + PERF_REG_ALPHA_R18, > + PERF_REG_ALPHA_R19, > + PERF_REG_ALPHA_R20, > + PERF_REG_ALPHA_R21, > + PERF_REG_ALPHA_R22, > + PERF_REG_ALPHA_R23, > + PERF_REG_ALPHA_R24, > + PERF_REG_ALPHA_R25, > + PERF_REG_ALPHA_R26, > + PERF_REG_ALPHA_R27, > + PERF_REG_ALPHA_R28, > + PERF_REG_ALPHA_GP, > + PERF_REG_ALPHA_SP, > + PERF_REG_ALPHA_PC, > + PERF_REG_ALPHA_MAX, > +}; > + > +#endif /* _UAPI_ASM_ALPHA_PERF_REGS_H */ > diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile > index 4ea5c189e60e..0c04b89676ed 100644 > --- a/arch/alpha/kernel/Makefile > +++ b/arch/alpha/kernel/Makefile > @@ -18,6 +18,7 @@ obj-$(CONFIG_PCI) += pci.o pci_iommu.o pci-sysfs.o > obj-$(CONFIG_SRM_ENV) += srm_env.o > obj-$(CONFIG_MODULES) += module.o > obj-$(CONFIG_PERF_EVENTS) += perf_event.o > +obj-$(CONFIG_HAVE_PERF_REGS) += perf_regs.o > obj-$(CONFIG_RTC_DRV_ALPHA) += rtc.o > obj-$(CONFIG_AUDIT) += audit.o > > diff --git a/arch/alpha/kernel/perf_regs.c b/arch/alpha/kernel/perf_regs.c > new file mode 100644 > index 000000000000..10afe4e205e9 > --- /dev/null > +++ b/arch/alpha/kernel/perf_regs.c > @@ -0,0 +1,56 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include <linux/bits.h> > +#include <linux/perf_event.h> > +#include <asm/perf_regs.h> > + > +#define REG(idx, field) \ > + [PERF_REG_ALPHA_##idx] = offsetof(struct pt_regs, field) > + > +#define REG_RESERVED (~GENMASK_ULL(PERF_REG_ALPHA_MAX - 1, 0) | \ > + GENMASK_ULL(PERF_REG_ALPHA_R15, PERF_REG_ALPHA_R9)) > + > +static const unsigned int pt_regs_offset[PERF_REG_ALPHA_MAX] = { > + REG(R0, r0), REG(R1, r1), REG(R2, r2), REG(R3, r3), > + REG(R4, r4), REG(R5, r5), REG(R6, r6), REG(R7, r7), > + REG(R8, r8), REG(R16, r16), REG(R17, r17), REG(R18, r18), > + REG(R19, r19), REG(R20, r20), REG(R21, r21), REG(R22, r22), > + REG(R23, r23), REG(R24, r24), REG(R25, r25), REG(R26, r26), > + REG(R27, r27), REG(R28, r28), REG(GP, gp), REG(PC, pc), > +}; > + > +u64 perf_reg_value(struct pt_regs *regs, int idx) > +{ > + if (idx == PERF_REG_ALPHA_SP) { > + if (user_mode(regs)) > + return user_stack_pointer(regs); > + /* Same kernel sp approximation as stacktrace.c. */ > + return (unsigned long)(regs + 1); > + } > + Tested on my ES40: register masks, SP/PC sampling and user stack dumps passed with software-clock, page-fault and hardware-cycle events. For context-switch events, however, regs points to the per-CPU __perf_regs[0], not an on-stack trap frame. This therefore returns a per-CPU address as SP. I reproduced this with: perf record -e context-switches -c 1 -Isp,pc -- sleep 1 The sample reported SP=0xfffffc00045b4310 and PC=0. The missing PC predates this patch, but the incorrect SP is newly exposed here. One limitation I noticed: for context-switch events, regs points to the per-CPU synthetic frame, so regs + 1 reports its address rather than a kernel SP. Alpha already lacks perf_arch_fetch_caller_regs(), so perhaps synthetic-event register capture is better handled as a follow-up. Could we document that limitation here? > + if (WARN_ON_ONCE((u32)idx >= PERF_REG_ALPHA_MAX || > + BIT_ULL(idx) & REG_RESERVED)) > + return 0; > + > + return *(unsigned long *)((void *)regs + pt_regs_offset[idx]); > +} > + > +int perf_reg_validate(u64 mask) > +{ > + if (!mask || mask & REG_RESERVED) > + return -EINVAL; > + > + return 0; > +} > + > +u64 perf_reg_abi(struct task_struct *task) > +{ > + return PERF_SAMPLE_REGS_ABI_64; > +} > + > +void perf_get_regs_user(struct perf_regs *regs_user, > + struct pt_regs *regs) > +{ > + regs_user->regs = task_pt_regs(current); > + regs_user->abi = perf_reg_abi(current); > +} > > -- > 2.55.0 > Tested-by: Magnus Lindholm <linmag7@gmail.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/4] alpha: perf register sampling and user stack dumps 2026-10-11 20:16 [PATCH 0/4] alpha: perf register sampling and user stack dumps Matt Turner ` (3 preceding siblings ...) 2026-10-11 20:16 ` [PATCH 4/4] alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support Matt Turner @ 2026-10-11 21:47 ` Ian Rogers 2026-10-12 15:51 ` Magnus Lindholm 5 siblings, 0 replies; 11+ messages in thread From: Ian Rogers @ 2026-10-11 21:47 UTC (permalink / raw) To: Matt Turner Cc: Richard Henderson, Magnus Lindholm, linux-alpha, linux-kernel, linux-doc, linux-perf-users On Sun, Oct 11, 2026 at 1:16 PM Matt Turner <mattst88@gmail.com> wrote: > > This lets perf sample registers and dump the user stack on alpha, which > perf record --call-graph dwarf needs to unwind user space. > > r9-r15 are not in pt_regs, so they cannot be sampled. An unwinder > therefore cannot get past a first frame that uses $15 as its frame > pointer (-O0 code or alloca). > > The perf tool side is a separate patch for perf-tools-next. libdw also > needs alpha unwinding support, which I am sending to elfutils-devel. > > --- > Matt Turner (4): > alpha: fix stale user_stack_pointer() > alpha: stop storing the user stack pointer in pt_regs > alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() > alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support Acked-by: Ian Rogers <irogers@google.com> Thanks! Ian > .../features/perf/perf-regs/arch-support.txt | 2 +- > .../features/perf/perf-stackdump/arch-support.txt | 2 +- > arch/alpha/Kconfig | 2 + > arch/alpha/include/asm/processor.h | 3 +- > arch/alpha/include/asm/ptrace.h | 7 +-- > arch/alpha/include/uapi/asm/perf_regs.h | 45 +++++++++++++++++ > arch/alpha/include/uapi/asm/ptrace.h | 2 +- > arch/alpha/kernel/Makefile | 1 + > arch/alpha/kernel/asm-offsets.c | 1 - > arch/alpha/kernel/entry.S | 5 -- > arch/alpha/kernel/perf_regs.c | 56 ++++++++++++++++++++++ > arch/alpha/kernel/process.c | 2 +- > arch/alpha/kernel/ptrace.c | 12 +++++ > arch/alpha/kernel/traps.c | 8 ---- > 14 files changed, 122 insertions(+), 26 deletions(-) > --- > base-commit: 8f5dbfb93440d1aba216a1a34369a65654b94be9 > change-id: 20261001-alpha-perf-regs-v3-7e23508c1ca2 > > Best regards, > -- > Matt Turner <mattst88@gmail.com> > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/4] alpha: perf register sampling and user stack dumps 2026-10-11 20:16 [PATCH 0/4] alpha: perf register sampling and user stack dumps Matt Turner ` (4 preceding siblings ...) 2026-10-11 21:47 ` [PATCH 0/4] alpha: perf register sampling and user stack dumps Ian Rogers @ 2026-10-12 15:51 ` Magnus Lindholm 5 siblings, 0 replies; 11+ messages in thread From: Magnus Lindholm @ 2026-10-12 15:51 UTC (permalink / raw) To: Matt Turner Cc: Richard Henderson, linux-alpha, linux-kernel, linux-doc, linux-perf-users Hi Matt, On Sun, Oct 11, 2026 at 10:16 PM Matt Turner <mattst88@gmail.com> wrote: > > This lets perf sample registers and dump the user stack on alpha, which > perf record --call-graph dwarf needs to unwind user space. > > r9-r15 are not in pt_regs, so they cannot be sampled. An unwinder > therefore cannot get past a first frame that uses $15 as its frame > pointer (-O0 code or alloca). > > The perf tool side is a separate patch for perf-tools-next. libdw also > needs alpha unwinding support, which I am sending to elfutils-devel. > > --- > Matt Turner (4): > alpha: fix stale user_stack_pointer() > alpha: stop storing the user stack pointer in pt_regs > alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() > alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support > > .../features/perf/perf-regs/arch-support.txt | 2 +- > .../features/perf/perf-stackdump/arch-support.txt | 2 +- > arch/alpha/Kconfig | 2 + > arch/alpha/include/asm/processor.h | 3 +- > arch/alpha/include/asm/ptrace.h | 7 +-- > arch/alpha/include/uapi/asm/perf_regs.h | 45 +++++++++++++++++ > arch/alpha/include/uapi/asm/ptrace.h | 2 +- > arch/alpha/kernel/Makefile | 1 + > arch/alpha/kernel/asm-offsets.c | 1 - > arch/alpha/kernel/entry.S | 5 -- > arch/alpha/kernel/perf_regs.c | 56 ++++++++++++++++++++++ > arch/alpha/kernel/process.c | 2 +- > arch/alpha/kernel/ptrace.c | 12 +++++ > arch/alpha/kernel/traps.c | 8 ---- > 14 files changed, 122 insertions(+), 26 deletions(-) > --- > base-commit: 8f5dbfb93440d1aba216a1a34369a65654b94be9 > change-id: 20261001-alpha-perf-regs-v3-7e23508c1ca2 > > Best regards, > -- > Matt Turner <mattst88@gmail.com> > The four kernel patches apply cleanly on my for-next branch. I built and booted the series on my ES40 (EV67/Tsunami), and tested software-clock, page-fault and hardware-cycle sampling, register masks and user stack dumps across all three online CPUs. The targeted tests passed. I have a few review comments(I'll respond to the individual patches). The separate perf patch records and decodes the samples, but I cannot yet confirm DWARF unwinding: the installed elfutils 0.195 lacks the required Alpha support. Could you point me to that patch as well? Thanks, Magnus ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-10-12 17:34 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-10-11 20:16 [PATCH 0/4] alpha: perf register sampling and user stack dumps Matt Turner 2026-10-11 20:16 ` [PATCH 1/4] alpha: fix stale user_stack_pointer() Matt Turner 2026-10-12 16:18 ` Magnus Lindholm 2026-10-11 20:16 ` [PATCH 2/4] alpha: stop storing the user stack pointer in pt_regs Matt Turner 2026-10-12 16:20 ` Magnus Lindholm 2026-10-11 20:16 ` [PATCH 3/4] alpha: use user_stack_pointer() in KSTK_ESP() and dump_elf_thread() Matt Turner 2026-10-12 17:12 ` Magnus Lindholm 2026-10-11 20:16 ` [PATCH 4/4] alpha: add HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP support Matt Turner 2026-10-12 17:34 ` Magnus Lindholm 2026-10-11 21:47 ` [PATCH 0/4] alpha: perf register sampling and user stack dumps Ian Rogers 2026-10-12 15:51 ` Magnus Lindholm
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®