xref: /linux/tools/perf/arch/riscv/util/kvm-stat.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
1*da7b1b52SShenlin Liang // SPDX-License-Identifier: GPL-2.0
2*da7b1b52SShenlin Liang /*
3*da7b1b52SShenlin Liang  * Arch specific functions for perf kvm stat.
4*da7b1b52SShenlin Liang  *
5*da7b1b52SShenlin Liang  * Copyright 2024 Beijing ESWIN Computing Technology Co., Ltd.
6*da7b1b52SShenlin Liang  *
7*da7b1b52SShenlin Liang  */
8*da7b1b52SShenlin Liang #include <errno.h>
9*da7b1b52SShenlin Liang #include <memory.h>
10*da7b1b52SShenlin Liang #include "../../../util/evsel.h"
11*da7b1b52SShenlin Liang #include "../../../util/kvm-stat.h"
12*da7b1b52SShenlin Liang #include "riscv_exception_types.h"
13*da7b1b52SShenlin Liang #include "debug.h"
14*da7b1b52SShenlin Liang 
15*da7b1b52SShenlin Liang define_exit_reasons_table(riscv_exit_reasons, kvm_riscv_exception_class);
16*da7b1b52SShenlin Liang 
17*da7b1b52SShenlin Liang const char *vcpu_id_str = "id";
18*da7b1b52SShenlin Liang const char *kvm_exit_reason = "scause";
19*da7b1b52SShenlin Liang const char *kvm_entry_trace = "kvm:kvm_entry";
20*da7b1b52SShenlin Liang const char *kvm_exit_trace = "kvm:kvm_exit";
21*da7b1b52SShenlin Liang 
22*da7b1b52SShenlin Liang const char *kvm_events_tp[] = {
23*da7b1b52SShenlin Liang 	"kvm:kvm_entry",
24*da7b1b52SShenlin Liang 	"kvm:kvm_exit",
25*da7b1b52SShenlin Liang 	NULL,
26*da7b1b52SShenlin Liang };
27*da7b1b52SShenlin Liang 
event_get_key(struct evsel * evsel,struct perf_sample * sample,struct event_key * key)28*da7b1b52SShenlin Liang static void event_get_key(struct evsel *evsel,
29*da7b1b52SShenlin Liang 			  struct perf_sample *sample,
30*da7b1b52SShenlin Liang 			  struct event_key *key)
31*da7b1b52SShenlin Liang {
32*da7b1b52SShenlin Liang 	key->info = 0;
33*da7b1b52SShenlin Liang 	key->key = evsel__intval(evsel, sample, kvm_exit_reason);
34*da7b1b52SShenlin Liang 	key->exit_reasons = riscv_exit_reasons;
35*da7b1b52SShenlin Liang }
36*da7b1b52SShenlin Liang 
event_begin(struct evsel * evsel,struct perf_sample * sample __maybe_unused,struct event_key * key __maybe_unused)37*da7b1b52SShenlin Liang static bool event_begin(struct evsel *evsel,
38*da7b1b52SShenlin Liang 			struct perf_sample *sample __maybe_unused,
39*da7b1b52SShenlin Liang 			struct event_key *key __maybe_unused)
40*da7b1b52SShenlin Liang {
41*da7b1b52SShenlin Liang 	return evsel__name_is(evsel, kvm_entry_trace);
42*da7b1b52SShenlin Liang }
43*da7b1b52SShenlin Liang 
event_end(struct evsel * evsel,struct perf_sample * sample,struct event_key * key)44*da7b1b52SShenlin Liang static bool event_end(struct evsel *evsel,
45*da7b1b52SShenlin Liang 		      struct perf_sample *sample,
46*da7b1b52SShenlin Liang 		      struct event_key *key)
47*da7b1b52SShenlin Liang {
48*da7b1b52SShenlin Liang 	if (evsel__name_is(evsel, kvm_exit_trace)) {
49*da7b1b52SShenlin Liang 		event_get_key(evsel, sample, key);
50*da7b1b52SShenlin Liang 		return true;
51*da7b1b52SShenlin Liang 	}
52*da7b1b52SShenlin Liang 	return false;
53*da7b1b52SShenlin Liang }
54*da7b1b52SShenlin Liang 
55*da7b1b52SShenlin Liang static struct kvm_events_ops exit_events = {
56*da7b1b52SShenlin Liang 	.is_begin_event = event_begin,
57*da7b1b52SShenlin Liang 	.is_end_event	= event_end,
58*da7b1b52SShenlin Liang 	.decode_key	= exit_event_decode_key,
59*da7b1b52SShenlin Liang 	.name		= "VM-EXIT"
60*da7b1b52SShenlin Liang };
61*da7b1b52SShenlin Liang 
62*da7b1b52SShenlin Liang struct kvm_reg_events_ops kvm_reg_events_ops[] = {
63*da7b1b52SShenlin Liang 	{
64*da7b1b52SShenlin Liang 		.name	= "vmexit",
65*da7b1b52SShenlin Liang 		.ops	= &exit_events,
66*da7b1b52SShenlin Liang 	},
67*da7b1b52SShenlin Liang 	{ NULL, NULL },
68*da7b1b52SShenlin Liang };
69*da7b1b52SShenlin Liang 
70*da7b1b52SShenlin Liang const char * const kvm_skip_events[] = {
71*da7b1b52SShenlin Liang 	NULL,
72*da7b1b52SShenlin Liang };
73*da7b1b52SShenlin Liang 
cpu_isa_init(struct perf_kvm_stat * kvm,const char * cpuid __maybe_unused)74*da7b1b52SShenlin Liang int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unused)
75*da7b1b52SShenlin Liang {
76*da7b1b52SShenlin Liang 	kvm->exit_reasons_isa = "riscv64";
77*da7b1b52SShenlin Liang 	return 0;
78*da7b1b52SShenlin Liang }
79