perf syscalltbl: Mask off ABI type for MIPS system calls
authorIan Rogers <irogers@google.com>
Wed, 19 Mar 2025 05:07:38 +0000 (22:07 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 21 Mar 2025 05:58:23 +0000 (22:58 -0700)
Arnd Bergmann described that MIPS system calls don't necessarily start
from 0 as an ABI prefix is applied:
https://lore.kernel.org/lkml/8ed7dfb2-1e4d-4aa4-a04b-0397a89365d1@app.fastmail.com/
When decoding the "id" (aka system call number) for MIPS ignore values
greater-than 1000.

Signed-off-by: Ian Rogers <irogers@google.com>
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Link: https://lore.kernel.org/r/20250319050741.269828-12-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/syscalltbl.c

index 4e6018e2e0b345fe752a05f8c6fa10597e0e6fdd..67a8ec10e9e4bc8dddfd2f44dc2d24af26f3e02e 100644 (file)
@@ -46,6 +46,14 @@ const char *syscalltbl__name(int e_machine, int id)
 {
        const struct syscalltbl *table = find_table(e_machine);
 
+       if (e_machine == EM_MIPS && id > 1000) {
+               /*
+                * MIPS may encode the N32/64/O32 type in the high part of
+                * syscall number. Mask this off if present. See the values of
+                * __NR_N32_Linux, __NR_64_Linux, __NR_O32_Linux and __NR_Linux.
+                */
+               id = id % 1000;
+       }
        if (table && id >= 0 && id < table->num_to_name_len)
                return table->num_to_name[id];
        return NULL;