xref: /linux/tools/perf/util/kvm-stat.c (revision 7685b334d1e4927cc73b62c65293ba65748d9c52)
1 // SPDX-License-Identifier: GPL-2.0
2 #include "debug.h"
3 #include "evsel.h"
4 #include "kvm-stat.h"
5 
6 #if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
7 
8 bool kvm_exit_event(struct evsel *evsel)
9 {
10 	return evsel__name_is(evsel, kvm_exit_trace);
11 }
12 
13 void exit_event_get_key(struct evsel *evsel,
14 			struct perf_sample *sample,
15 			struct event_key *key)
16 {
17 	key->info = 0;
18 	key->key  = evsel__intval(evsel, sample, kvm_exit_reason);
19 }
20 
21 
22 bool exit_event_begin(struct evsel *evsel,
23 		      struct perf_sample *sample, struct event_key *key)
24 {
25 	if (kvm_exit_event(evsel)) {
26 		exit_event_get_key(evsel, sample, key);
27 		return true;
28 	}
29 
30 	return false;
31 }
32 
33 bool kvm_entry_event(struct evsel *evsel)
34 {
35 	return evsel__name_is(evsel, kvm_entry_trace);
36 }
37 
38 bool exit_event_end(struct evsel *evsel,
39 		    struct perf_sample *sample __maybe_unused,
40 		    struct event_key *key __maybe_unused)
41 {
42 	return kvm_entry_event(evsel);
43 }
44 
45 static const char *get_exit_reason(struct perf_kvm_stat *kvm,
46 				   struct exit_reasons_table *tbl,
47 				   u64 exit_code)
48 {
49 	while (tbl->reason != NULL) {
50 		if (tbl->exit_code == exit_code)
51 			return tbl->reason;
52 		tbl++;
53 	}
54 
55 	pr_err("unknown kvm exit code:%lld on %s\n",
56 		(unsigned long long)exit_code, kvm->exit_reasons_isa);
57 	return "UNKNOWN";
58 }
59 
60 void exit_event_decode_key(struct perf_kvm_stat *kvm,
61 			   struct event_key *key,
62 			   char *decode)
63 {
64 	const char *exit_reason = get_exit_reason(kvm, key->exit_reasons,
65 						  key->key);
66 
67 	scnprintf(decode, KVM_EVENT_NAME_LEN, "%s", exit_reason);
68 }
69 
70 #endif
71