mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-19 03:59:45 +02:00

The variable 'decode_str_len' defines the string length for KVM event name and every arch defines its own values. This introduces complexity that the variable definition are spreading in multiple source files under arch folder. This patch refactors code to use a macro KVM_EVENT_NAME_LEN to define event name length and thus remove the definitions in arch files. Signed-off-by: Leo Yan <leo.yan@linaro.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.g.garry@oracle.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: linux-arm-kernel@lists.infradead.org Link: https://lore.kernel.org/r/20230315145112.186603-2-leo.yan@linaro.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
111 lines
2.9 KiB
C
111 lines
2.9 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Arch specific functions for perf kvm stat.
|
|
*
|
|
* Copyright 2014 IBM Corp.
|
|
* Author(s): Alexander Yarygin <yarygin@linux.vnet.ibm.com>
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include "../../util/kvm-stat.h"
|
|
#include "../../util/evsel.h"
|
|
#include <asm/sie.h>
|
|
|
|
define_exit_reasons_table(sie_exit_reasons, sie_intercept_code);
|
|
define_exit_reasons_table(sie_icpt_insn_codes, icpt_insn_codes);
|
|
define_exit_reasons_table(sie_sigp_order_codes, sigp_order_codes);
|
|
define_exit_reasons_table(sie_diagnose_codes, diagnose_codes);
|
|
define_exit_reasons_table(sie_icpt_prog_codes, icpt_prog_codes);
|
|
|
|
const char *vcpu_id_str = "id";
|
|
const char *kvm_exit_reason = "icptcode";
|
|
const char *kvm_entry_trace = "kvm:kvm_s390_sie_enter";
|
|
const char *kvm_exit_trace = "kvm:kvm_s390_sie_exit";
|
|
|
|
static void event_icpt_insn_get_key(struct evsel *evsel,
|
|
struct perf_sample *sample,
|
|
struct event_key *key)
|
|
{
|
|
unsigned long insn;
|
|
|
|
insn = evsel__intval(evsel, sample, "instruction");
|
|
key->key = icpt_insn_decoder(insn);
|
|
key->exit_reasons = sie_icpt_insn_codes;
|
|
}
|
|
|
|
static void event_sigp_get_key(struct evsel *evsel,
|
|
struct perf_sample *sample,
|
|
struct event_key *key)
|
|
{
|
|
key->key = evsel__intval(evsel, sample, "order_code");
|
|
key->exit_reasons = sie_sigp_order_codes;
|
|
}
|
|
|
|
static void event_diag_get_key(struct evsel *evsel,
|
|
struct perf_sample *sample,
|
|
struct event_key *key)
|
|
{
|
|
key->key = evsel__intval(evsel, sample, "code");
|
|
key->exit_reasons = sie_diagnose_codes;
|
|
}
|
|
|
|
static void event_icpt_prog_get_key(struct evsel *evsel,
|
|
struct perf_sample *sample,
|
|
struct event_key *key)
|
|
{
|
|
key->key = evsel__intval(evsel, sample, "code");
|
|
key->exit_reasons = sie_icpt_prog_codes;
|
|
}
|
|
|
|
static struct child_event_ops child_events[] = {
|
|
{ .name = "kvm:kvm_s390_intercept_instruction",
|
|
.get_key = event_icpt_insn_get_key },
|
|
{ .name = "kvm:kvm_s390_handle_sigp",
|
|
.get_key = event_sigp_get_key },
|
|
{ .name = "kvm:kvm_s390_handle_diag",
|
|
.get_key = event_diag_get_key },
|
|
{ .name = "kvm:kvm_s390_intercept_prog",
|
|
.get_key = event_icpt_prog_get_key },
|
|
{ NULL, NULL },
|
|
};
|
|
|
|
static struct kvm_events_ops exit_events = {
|
|
.is_begin_event = exit_event_begin,
|
|
.is_end_event = exit_event_end,
|
|
.child_ops = child_events,
|
|
.decode_key = exit_event_decode_key,
|
|
.name = "VM-EXIT"
|
|
};
|
|
|
|
const char *kvm_events_tp[] = {
|
|
"kvm:kvm_s390_sie_enter",
|
|
"kvm:kvm_s390_sie_exit",
|
|
"kvm:kvm_s390_intercept_instruction",
|
|
"kvm:kvm_s390_handle_sigp",
|
|
"kvm:kvm_s390_handle_diag",
|
|
"kvm:kvm_s390_intercept_prog",
|
|
NULL,
|
|
};
|
|
|
|
struct kvm_reg_events_ops kvm_reg_events_ops[] = {
|
|
{ .name = "vmexit", .ops = &exit_events },
|
|
{ NULL, NULL },
|
|
};
|
|
|
|
const char * const kvm_skip_events[] = {
|
|
"Wait state",
|
|
NULL,
|
|
};
|
|
|
|
int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid)
|
|
{
|
|
if (strstr(cpuid, "IBM")) {
|
|
kvm->exit_reasons = sie_exit_reasons;
|
|
kvm->exit_reasons_isa = "SIE";
|
|
} else
|
|
return -ENOTSUP;
|
|
|
|
return 0;
|
|
}
|