Path: blob/master/tools/perf/arch/riscv/util/kvm-stat.c
26305 views
// SPDX-License-Identifier: GPL-2.01/*2* Arch specific functions for perf kvm stat.3*4* Copyright 2024 Beijing ESWIN Computing Technology Co., Ltd.5*6*/7#include <errno.h>8#include <memory.h>9#include "../../../util/evsel.h"10#include "../../../util/kvm-stat.h"11#include "riscv_trap_types.h"12#include "debug.h"1314define_exit_reasons_table(riscv_exit_reasons, kvm_riscv_trap_class);1516const char *vcpu_id_str = "id";17const char *kvm_exit_reason = "scause";18const char *kvm_entry_trace = "kvm:kvm_entry";19const char *kvm_exit_trace = "kvm:kvm_exit";2021const char *kvm_events_tp[] = {22"kvm:kvm_entry",23"kvm:kvm_exit",24NULL,25};2627static void event_get_key(struct evsel *evsel,28struct perf_sample *sample,29struct event_key *key)30{31key->info = 0;32key->key = evsel__intval(evsel, sample, kvm_exit_reason) & ~CAUSE_IRQ_FLAG;33key->exit_reasons = riscv_exit_reasons;34}3536static bool event_begin(struct evsel *evsel,37struct perf_sample *sample __maybe_unused,38struct event_key *key __maybe_unused)39{40return evsel__name_is(evsel, kvm_entry_trace);41}4243static bool event_end(struct evsel *evsel,44struct perf_sample *sample,45struct event_key *key)46{47if (evsel__name_is(evsel, kvm_exit_trace)) {48event_get_key(evsel, sample, key);49return true;50}51return false;52}5354static struct kvm_events_ops exit_events = {55.is_begin_event = event_begin,56.is_end_event = event_end,57.decode_key = exit_event_decode_key,58.name = "VM-EXIT"59};6061struct kvm_reg_events_ops kvm_reg_events_ops[] = {62{63.name = "vmexit",64.ops = &exit_events,65},66{ NULL, NULL },67};6869const char * const kvm_skip_events[] = {70NULL,71};7273int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unused)74{75kvm->exit_reasons_isa = "riscv64";76return 0;77}787980