[PATCH v5 4/7] perf unwind-libunwind: Make libunwind register reading cross platform
Arnaldo Carvalho de Melo
acme at kernel.org
Fri May 15 12:23:02 PDT 2026
On Wed, May 13, 2026 at 04:31:48PM -0700, Ian Rogers wrote:
> --- /dev/null
> +++ b/tools/perf/util/libunwind-arch/libunwind-ppc32.c
> @@ -0,0 +1,31 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +#include "libunwind-arch.h"
> +#include "../debug.h"
> +#include "../../../arch/powerpc/include/uapi/asm/perf_regs.h"
> +#include <linux/compiler.h>
> +#include <errno.h>
> +
> +#ifdef HAVE_LIBUNWIND_PPC32_SUPPORT
> +#include <libunwind-ppc32.h>
> +#endif
> +
> +int __get_perf_regnum_for_unw_regnum_ppc32(int unw_regnum __maybe_unused)
> +{
> +#ifndef HAVE_LIBUNWIND_PPC32_SUPPORT
> + return -EINVAL;
> +#else
> + switch (unw_regnum) {
> + case UNW_PPC32_R0 ... UNW_PPC32_R31:
> + return unw_regnum - UNW_PPC32_R0 + PERF_REG_POWERPC_R0;
> + case UNW_PPC32_LR:
> + return PERF_REG_POWERPC_LINK;
> + case UNW_PPC32_CTR:
> + return PERF_REG_POWERPC_CTR;
> + case UNW_PPC32_XER:
> + return PERF_REG_POWERPC_XER;
> + default:
> + pr_err("unwind: invalid reg id %d\n", unw_regnum);
> + return -EINVAL;
> + }
> +#endif // HAVE_LIBUNWIND_PPC32_SUPPORT
To address this local sashiko comment:
------------------------------------------------------------
Is the instruction pointer (NIP) intentionally omitted from this switch
statement?
When libunwind attempts to read the instruction pointer, will access_reg()
hit the default case here and return -EINVAL, causing stack unwinding
to fail on 32-bit PowerPC architectures?
For comparison, the 64-bit implementation in libunwind-ppc64.c correctly
maps UNW_PPC64_NIP to PERF_REG_POWERPC_NIP.
------------------------------------------------------------
I ammended this patch with:
⬢ [acme at toolbx perf-tools-next]$ vim tools/perf/util/libunwind-arch/libunwind-ppc32.c
⬢ [acme at toolbx perf-tools-next]$ git diff
diff --git a/tools/perf/util/libunwind-arch/libunwind-ppc32.c b/tools/perf/util/libunwind-arch/libunwind-ppc32.c
index bcdeed34d0a81b8d..976a160304073582 100644
--- a/tools/perf/util/libunwind-arch/libunwind-ppc32.c
+++ b/tools/perf/util/libunwind-arch/libunwind-ppc32.c
@@ -23,6 +23,8 @@ int __get_perf_regnum_for_unw_regnum_ppc32(int unw_regnum __maybe_unused)
return PERF_REG_POWERPC_CTR;
case UNW_PPC32_XER:
return PERF_REG_POWERPC_XER;
+ case UNW_PPC32_NIP:
+ return PERF_REG_POWERPC_NIP;
default:
pr_err("unwind: invalid reg id %d\n", unw_regnum);
return -EINVAL;
⬢ [acme at toolbx perf-tools-next]$
Ok? It was the only issue found in this patch.
- Arnaldo
More information about the linux-riscv
mailing list