On Mon, Feb 2, 2026 at 6:47 PM Dapeng Mi <[email protected]> wrote: > > Fix an issue where the `perf` tool aborts unexpectedly when running the > following command: > > ``` > perf record -e cycles -I -- true > > Usage: perf record [<options>] [<command>] > or: perf record [<options>] -- <command> [<options>] > > -I, --intr-regs[=<any register>] > sample selected machine registers on interrupt, use '-I?' to list > register names > ``` > > The usage of the `-I` or `--user-regs` options without specifying any > registers should default to sampling all general-purpose registers. > However, this currently causes an abnormal termination. > > The issue was introduced by commit 3d06db9bad1a ("perf regs: Refactor > use of arch__sample_reg_masks() to perf_reg_name()"). This patch > resolves the problem, ensuring that the `-I` or `--user-regs` options > work as intended without causing an abort. > > Fixes: 3d06db9bad1a ("perf regs: Refactor use of arch__sample_reg_masks() to > perf_reg_name()") > Signed-off-by: Dapeng Mi <[email protected]>
Reviewed-by: Ian Rogers <[email protected]> Thanks, Ian > --- > tools/perf/util/parse-regs-options.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git a/tools/perf/util/parse-regs-options.c > b/tools/perf/util/parse-regs-options.c > index 8dd35f50f644..b44b47d9059f 100644 > --- a/tools/perf/util/parse-regs-options.c > +++ b/tools/perf/util/parse-regs-options.c > @@ -66,12 +66,14 @@ __parse_regs(const struct option *opt, const char *str, > int unset, bool intr) > if (*mode) > return -1; > > - /* str may be NULL in case no arg is passed to -I */ > - if (!str) > - return -1; > - > mask = intr ? arch__intr_reg_mask() : arch__user_reg_mask(); > > + /* str may be NULL in case no arg is passed to -I */ > + if (!str) { > + *mode = mask; > + return 0; > + } > + > /* because str is read-only */ > s = os = strdup(str); > if (!s) > @@ -104,9 +106,6 @@ __parse_regs(const struct option *opt, const char *str, > int unset, bool intr) > } > ret = 0; > > - /* default to all possible regs */ > - if (*mode == 0) > - *mode = mask; > error: > free(os); > return ret; > -- > 2.34.1 >
