mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
arch__sample_reg_masks isn't supported on ARM(32), csky, loongarch, MIPS, RISC-V and s390. The table returned by the function just has the name of a register paired with the corresponding sample_regs_user mask value. For a given perf register we can compute the name with perf_reg_name and the mask is just 1 left-shifted by the perf register number. Change __parse_regs to use this method for finding registers rather than arch__sample_reg_masks, thereby adding __parse_regs support for ARM(32), csky, loongarch, MIPS, RISC-V and s390. As arch__sample_reg_masks is then unused, remove the now unneeded declarations. Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Thomas Richter <tmricht@linux.ibm.com> Cc: Aditya Bodkhe <aditya.b1@linux.ibm.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexandre Ghiti <alex@ghiti.fr> Cc: Andi Kleen <ak@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.ibm.com> Cc: Chun-Tse Shao <ctshao@google.com> Cc: Dapeng Mi <dapeng1.mi@linux.intel.com> Cc: Dmitriy Vyukov <dvyukov@google.com> Cc: Dr. David Alan Gilbert <linux@treblig.org> Cc: Guo Ren <guoren@kernel.org> Cc: Haibo Xu <haibo1.xu@intel.com> Cc: Howard Chu <howardchu95@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.g.garry@oracle.com> Cc: Krzysztof Łopatowski <krzysztof.m.lopatowski@gmail.com> Cc: Leo Yan <leo.yan@linux.dev> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <pjw@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sergei Trofimovich <slyich@gmail.com> Cc: Shimin Guo <shimin.guo@skydio.com> Cc: Stephen Brennan <stephen.s.brennan@oracle.com> Cc: Thomas Falcon <thomas.falcon@intel.com> Cc: Will Deacon <will@kernel.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
126 lines
2.3 KiB
C
126 lines
2.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "util/debug.h"
|
|
#include <dwarf-regs.h>
|
|
#include <subcmd/parse-options.h>
|
|
#include "util/perf_regs.h"
|
|
#include "util/parse-regs-options.h"
|
|
|
|
static void list_perf_regs(FILE *fp, uint64_t mask)
|
|
{
|
|
const char *last_name = NULL;
|
|
|
|
fprintf(fp, "available registers: ");
|
|
for (int reg = 0; reg < 64; reg++) {
|
|
const char *name;
|
|
|
|
if (((1ULL << reg) & mask) == 0)
|
|
continue;
|
|
|
|
name = perf_reg_name(reg, EM_HOST);
|
|
if (name && (!last_name || strcmp(last_name, name)))
|
|
fprintf(fp, "%s%s", reg > 0 ? " " : "", name);
|
|
last_name = name;
|
|
}
|
|
fputc('\n', fp);
|
|
}
|
|
|
|
static uint64_t name_to_perf_reg_mask(const char *to_match, uint64_t mask)
|
|
{
|
|
uint64_t reg_mask = 0;
|
|
|
|
for (int reg = 0; reg < 64; reg++) {
|
|
const char *name;
|
|
|
|
if (((1ULL << reg) & mask) == 0)
|
|
continue;
|
|
|
|
name = perf_reg_name(reg, EM_HOST);
|
|
if (!name)
|
|
continue;
|
|
|
|
if (!strcasecmp(to_match, name))
|
|
reg_mask |= 1ULL << reg;
|
|
}
|
|
return reg_mask;
|
|
}
|
|
|
|
static int
|
|
__parse_regs(const struct option *opt, const char *str, int unset, bool intr)
|
|
{
|
|
uint64_t *mode = (uint64_t *)opt->value;
|
|
char *s, *os = NULL, *p;
|
|
int ret = -1;
|
|
uint64_t mask;
|
|
|
|
if (unset)
|
|
return 0;
|
|
|
|
/*
|
|
* cannot set it twice
|
|
*/
|
|
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();
|
|
|
|
/* because str is read-only */
|
|
s = os = strdup(str);
|
|
if (!s)
|
|
return -1;
|
|
|
|
for (;;) {
|
|
uint64_t reg_mask;
|
|
|
|
p = strchr(s, ',');
|
|
if (p)
|
|
*p = '\0';
|
|
|
|
if (!strcmp(s, "?")) {
|
|
list_perf_regs(stderr, mask);
|
|
goto error;
|
|
}
|
|
|
|
reg_mask = name_to_perf_reg_mask(s, mask);
|
|
if (reg_mask == 0) {
|
|
ui__warning("Unknown register \"%s\", check man page or run \"perf record %s?\"\n",
|
|
s, intr ? "-I" : "--user-regs=");
|
|
goto error;
|
|
}
|
|
*mode |= reg_mask;
|
|
|
|
if (!p)
|
|
break;
|
|
|
|
s = p + 1;
|
|
}
|
|
ret = 0;
|
|
|
|
/* default to all possible regs */
|
|
if (*mode == 0)
|
|
*mode = mask;
|
|
error:
|
|
free(os);
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
parse_user_regs(const struct option *opt, const char *str, int unset)
|
|
{
|
|
return __parse_regs(opt, str, unset, false);
|
|
}
|
|
|
|
int
|
|
parse_intr_regs(const struct option *opt, const char *str, int unset)
|
|
{
|
|
return __parse_regs(opt, str, unset, true);
|
|
}
|