[PATCH] perf riscv: fix register name strings

Martin Kaiser posted 1 patch 2 weeks, 2 days ago
tools/perf/arch/riscv/include/dwarf-regs-table.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] perf riscv: fix register name strings
Posted by Martin Kaiser 2 weeks, 2 days ago
On risc-v, pref probe generates an invalid syntax for a named register in
a kprobe.

$ perf probe --debug verbose --add "n_tty_write tty"
...
Writing event: p:probe/n_tty_write _text+8922528 tty=%"%a0":x64
Failed to write event: Invalid argument

The problem is the combination of

   #define REG_DWARFNUM_NAME(reg, idx) [idx] = "%" #reg

and entries such as

   REG_DWARFNUM_NAME("%a0", 10)

where #reg will escape the quotes of the first macro parameter.

Update the macro definition to produce the correct syntax for a named
register in a kprobe, i.e. the unquoted register name with only one
leading %.

Fixes: a90c4519186d ("perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h")
Signed-off-by: Martin Kaiser <martin@kaiser.cx>
---
 tools/perf/arch/riscv/include/dwarf-regs-table.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/arch/riscv/include/dwarf-regs-table.h b/tools/perf/arch/riscv/include/dwarf-regs-table.h
index a45b63a6d5a8..c0a6e84e7a75 100644
--- a/tools/perf/arch/riscv/include/dwarf-regs-table.h
+++ b/tools/perf/arch/riscv/include/dwarf-regs-table.h
@@ -2,7 +2,7 @@
 #ifdef DEFINE_DWARF_REGSTR_TABLE
 /* This is included in perf/util/dwarf-regs.c */
 
-#define REG_DWARFNUM_NAME(reg, idx)	[idx] = "%" #reg
+#define REG_DWARFNUM_NAME(reg, idx)	[idx] = reg
 
 static const char * const riscv_regstr_tbl[] = {
 	REG_DWARFNUM_NAME("%zero", 0),
-- 
2.43.7
Re: [PATCH] perf riscv: fix register name strings
Posted by Ian Rogers 2 weeks, 2 days ago
On Mon, Jun 8, 2026 at 12:27 PM Martin Kaiser <martin@kaiser.cx> wrote:
>
> On risc-v, pref probe generates an invalid syntax for a named register in
> a kprobe.
>
> $ perf probe --debug verbose --add "n_tty_write tty"
> ...
> Writing event: p:probe/n_tty_write _text+8922528 tty=%"%a0":x64
> Failed to write event: Invalid argument
>
> The problem is the combination of
>
>    #define REG_DWARFNUM_NAME(reg, idx) [idx] = "%" #reg
>
> and entries such as
>
>    REG_DWARFNUM_NAME("%a0", 10)
>
> where #reg will escape the quotes of the first macro parameter.
>
> Update the macro definition to produce the correct syntax for a named
> register in a kprobe, i.e. the unquoted register name with only one
> leading %.
>
> Fixes: a90c4519186d ("perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h")
> Signed-off-by: Martin Kaiser <martin@kaiser.cx>

Reviewed-by: Ian Rogers <irogers@google.com>

Thanks for catching this! Sashiko is also green for this change:
https://sashiko.dev/#/patchset/20260608192731.708606-1-martin%40kaiser.cx

Thanks,
Ian

> ---
>  tools/perf/arch/riscv/include/dwarf-regs-table.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/perf/arch/riscv/include/dwarf-regs-table.h b/tools/perf/arch/riscv/include/dwarf-regs-table.h
> index a45b63a6d5a8..c0a6e84e7a75 100644
> --- a/tools/perf/arch/riscv/include/dwarf-regs-table.h
> +++ b/tools/perf/arch/riscv/include/dwarf-regs-table.h
> @@ -2,7 +2,7 @@
>  #ifdef DEFINE_DWARF_REGSTR_TABLE
>  /* This is included in perf/util/dwarf-regs.c */
>
> -#define REG_DWARFNUM_NAME(reg, idx)    [idx] = "%" #reg
> +#define REG_DWARFNUM_NAME(reg, idx)    [idx] = reg
>
>  static const char * const riscv_regstr_tbl[] = {
>         REG_DWARFNUM_NAME("%zero", 0),
> --
> 2.43.7
>
Re: [PATCH] perf riscv: fix register name strings
Posted by Arnaldo Carvalho de Melo 2 weeks, 2 days ago
On Mon, Jun 08, 2026 at 01:08:28PM -0700, Ian Rogers wrote:
> On Mon, Jun 8, 2026 at 12:27 PM Martin Kaiser <martin@kaiser.cx> wrote:
> >
> > On risc-v, pref probe generates an invalid syntax for a named register in
> > a kprobe.
> >
> > $ perf probe --debug verbose --add "n_tty_write tty"
> > ...
> > Writing event: p:probe/n_tty_write _text+8922528 tty=%"%a0":x64
> > Failed to write event: Invalid argument
> >
> > The problem is the combination of
> >
> >    #define REG_DWARFNUM_NAME(reg, idx) [idx] = "%" #reg
> >
> > and entries such as
> >
> >    REG_DWARFNUM_NAME("%a0", 10)
> >
> > where #reg will escape the quotes of the first macro parameter.
> >
> > Update the macro definition to produce the correct syntax for a named
> > register in a kprobe, i.e. the unquoted register name with only one
> > leading %.
> >
> > Fixes: a90c4519186d ("perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h")
> > Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> 
> Reviewed-by: Ian Rogers <irogers@google.com>
> 
> Thanks for catching this! Sashiko is also green for this change:
> https://sashiko.dev/#/patchset/20260608192731.708606-1-martin%40kaiser.cx

Strange,

  LD      /tmp/build/perf-tools-next/tests/perf-test-in.o
  LD      /tmp/build/perf-tools-next/perf-test-in.o
In file included from util/dwarf-regs.c:23:
util/../arch/riscv/include/dwarf-regs-table.h:5:9: error: ‘REG_DWARFNUM_NAME’ redefined [-Werror]
    5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = reg
      |         ^~~~~~~~~~~~~~~~~
In file included from util/dwarf-regs.c:22:
util/../arch/powerpc/include/dwarf-regs-table.h:10:9: note: this is the location of the previous definition
   10 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = "%" #reg
      |         ^~~~~~~~~~~~~~~~~
In file included from util/dwarf-regs.c:24:
util/../arch/s390/include/dwarf-regs-table.h:5:9: error: ‘REG_DWARFNUM_NAME’ redefined [-Werror]
    5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = "%" #reg
      |         ^~~~~~~~~~~~~~~~~
util/../arch/riscv/include/dwarf-regs-table.h:5:9: note: this is the location of the previous definition
    5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = reg
      |         ^~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/util/dwarf-regs.o] Error 1


Trying to figure out why Sashiko is green on it but it doesn't buind
here...

- Arnaldo
Re: [PATCH] perf riscv: fix register name strings
Posted by Arnaldo Carvalho de Melo 2 weeks, 2 days ago
On Mon, Jun 08, 2026 at 05:27:03PM -0300, Arnaldo Carvalho de Melo wrote:
> On Mon, Jun 08, 2026 at 01:08:28PM -0700, Ian Rogers wrote:
> > On Mon, Jun 8, 2026 at 12:27 PM Martin Kaiser <martin@kaiser.cx> wrote:
> > >
> > > On risc-v, pref probe generates an invalid syntax for a named register in
> > > a kprobe.
> > >
> > > $ perf probe --debug verbose --add "n_tty_write tty"
> > > ...
> > > Writing event: p:probe/n_tty_write _text+8922528 tty=%"%a0":x64
> > > Failed to write event: Invalid argument
> > >
> > > The problem is the combination of
> > >
> > >    #define REG_DWARFNUM_NAME(reg, idx) [idx] = "%" #reg
> > >
> > > and entries such as
> > >
> > >    REG_DWARFNUM_NAME("%a0", 10)
> > >
> > > where #reg will escape the quotes of the first macro parameter.
> > >
> > > Update the macro definition to produce the correct syntax for a named
> > > register in a kprobe, i.e. the unquoted register name with only one
> > > leading %.
> > >
> > > Fixes: a90c4519186d ("perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h")
> > > Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> > 
> > Reviewed-by: Ian Rogers <irogers@google.com>
> > 
> > Thanks for catching this! Sashiko is also green for this change:
> > https://sashiko.dev/#/patchset/20260608192731.708606-1-martin%40kaiser.cx
> 
> Strange,
> 
>   LD      /tmp/build/perf-tools-next/tests/perf-test-in.o
>   LD      /tmp/build/perf-tools-next/perf-test-in.o
> In file included from util/dwarf-regs.c:23:
> util/../arch/riscv/include/dwarf-regs-table.h:5:9: error: ‘REG_DWARFNUM_NAME’ redefined [-Werror]
>     5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = reg
>       |         ^~~~~~~~~~~~~~~~~
> In file included from util/dwarf-regs.c:22:
> util/../arch/powerpc/include/dwarf-regs-table.h:10:9: note: this is the location of the previous definition
>    10 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = "%" #reg
>       |         ^~~~~~~~~~~~~~~~~
> In file included from util/dwarf-regs.c:24:
> util/../arch/s390/include/dwarf-regs-table.h:5:9: error: ‘REG_DWARFNUM_NAME’ redefined [-Werror]
>     5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = "%" #reg
>       |         ^~~~~~~~~~~~~~~~~
> util/../arch/riscv/include/dwarf-regs-table.h:5:9: note: this is the location of the previous definition
>     5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = reg
>       |         ^~~~~~~~~~~~~~~~~
> cc1: all warnings being treated as errors
> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/util/dwarf-regs.o] Error 1
> 
> 
> Trying to figure out why Sashiko is green on it but it doesn't build
> here...

C preprocessor benign redefinition rule kicked in, this is a preexisting
problem, the headers need to undef that REG_DWARFNUM_NAME that now is
different in one of the headers, Risc-V's.

I'll cook up a patch to merge before this one.

- Arnaldo
Re: [PATCH] perf riscv: fix register name strings
Posted by Martin Kaiser 2 weeks, 1 day ago
Thus wrote Arnaldo Carvalho de Melo (acme@kernel.org):

> On Mon, Jun 08, 2026 at 05:27:03PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Mon, Jun 08, 2026 at 01:08:28PM -0700, Ian Rogers wrote:
> > > On Mon, Jun 8, 2026 at 12:27 PM Martin Kaiser <martin@kaiser.cx> wrote:

> > > > On risc-v, pref probe generates an invalid syntax for a named register in
> > > > a kprobe.

> > > > $ perf probe --debug verbose --add "n_tty_write tty"
> > > > ...
> > > > Writing event: p:probe/n_tty_write _text+8922528 tty=%"%a0":x64
> > > > Failed to write event: Invalid argument

> > > > The problem is the combination of

> > > >    #define REG_DWARFNUM_NAME(reg, idx) [idx] = "%" #reg

> > > > and entries such as

> > > >    REG_DWARFNUM_NAME("%a0", 10)

> > > > where #reg will escape the quotes of the first macro parameter.

> > > > Update the macro definition to produce the correct syntax for a named
> > > > register in a kprobe, i.e. the unquoted register name with only one
> > > > leading %.

> > > > Fixes: a90c4519186d ("perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h")
> > > > Signed-off-by: Martin Kaiser <martin@kaiser.cx>

> > > Reviewed-by: Ian Rogers <irogers@google.com>

> > > Thanks for catching this! Sashiko is also green for this change:
> > > https://sashiko.dev/#/patchset/20260608192731.708606-1-martin%40kaiser.cx

> > Strange,

> >   LD      /tmp/build/perf-tools-next/tests/perf-test-in.o
> >   LD      /tmp/build/perf-tools-next/perf-test-in.o
> > In file included from util/dwarf-regs.c:23:
> > util/../arch/riscv/include/dwarf-regs-table.h:5:9: error: ‘REG_DWARFNUM_NAME’ redefined [-Werror]
> >     5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = reg
> >       |         ^~~~~~~~~~~~~~~~~
> > In file included from util/dwarf-regs.c:22:
> > util/../arch/powerpc/include/dwarf-regs-table.h:10:9: note: this is the location of the previous definition
> >    10 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = "%" #reg
> >       |         ^~~~~~~~~~~~~~~~~
> > In file included from util/dwarf-regs.c:24:
> > util/../arch/s390/include/dwarf-regs-table.h:5:9: error: ‘REG_DWARFNUM_NAME’ redefined [-Werror]
> >     5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = "%" #reg
> >       |         ^~~~~~~~~~~~~~~~~
> > util/../arch/riscv/include/dwarf-regs-table.h:5:9: note: this is the location of the previous definition
> >     5 | #define REG_DWARFNUM_NAME(reg, idx)     [idx] = reg
> >       |         ^~~~~~~~~~~~~~~~~
> > cc1: all warnings being treated as errors
> > make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:96: /tmp/build/perf-tools-next/util/dwarf-regs.o] Error 1


> > Trying to figure out why Sashiko is green on it but it doesn't build
> > here...

> C preprocessor benign redefinition rule kicked in, this is a preexisting
> problem, the headers need to undef that REG_DWARFNUM_NAME that now is
> different in one of the headers, Risc-V's.

> I'll cook up a patch to merge before this one.

I see. We need an undef for risc-v, similar to mips.

Let me send a v2 so we have all in one patch, that should be simpler to
backport to stable.

Thanks,
Martin
Re: [PATCH] perf riscv: fix register name strings
Posted by Arnaldo Carvalho de Melo 2 weeks, 2 days ago
On Mon, Jun 08, 2026 at 01:08:28PM -0700, Ian Rogers wrote:
> On Mon, Jun 8, 2026 at 12:27 PM Martin Kaiser <martin@kaiser.cx> wrote:
> >
> > On risc-v, pref probe generates an invalid syntax for a named register in
> > a kprobe.
> >
> > $ perf probe --debug verbose --add "n_tty_write tty"
> > ...
> > Writing event: p:probe/n_tty_write _text+8922528 tty=%"%a0":x64
> > Failed to write event: Invalid argument
> >
> > The problem is the combination of
> >
> >    #define REG_DWARFNUM_NAME(reg, idx) [idx] = "%" #reg
> >
> > and entries such as
> >
> >    REG_DWARFNUM_NAME("%a0", 10)
> >
> > where #reg will escape the quotes of the first macro parameter.
> >
> > Update the macro definition to produce the correct syntax for a named
> > register in a kprobe, i.e. the unquoted register name with only one
> > leading %.
> >
> > Fixes: a90c4519186d ("perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h")
> > Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> 
> Reviewed-by: Ian Rogers <irogers@google.com>
> 
> Thanks for catching this! Sashiko is also green for this change:
> https://sashiko.dev/#/patchset/20260608192731.708606-1-martin%40kaiser.cx

Thanks, applying.

- Arnaldo