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
kvm_exit_event(struct evsel * evsel)8 bool kvm_exit_event(struct evsel *evsel)
9 {
10 return evsel__name_is(evsel, kvm_exit_trace);
11 }
12
exit_event_get_key(struct evsel * evsel,struct perf_sample * sample,struct event_key * key)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
exit_event_begin(struct evsel * evsel,struct perf_sample * sample,struct event_key * key)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
kvm_entry_event(struct evsel * evsel)33 bool kvm_entry_event(struct evsel *evsel)
34 {
35 return evsel__name_is(evsel, kvm_entry_trace);
36 }
37
exit_event_end(struct evsel * evsel,struct perf_sample * sample __maybe_unused,struct event_key * key __maybe_unused)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
get_exit_reason(struct perf_kvm_stat * kvm,struct exit_reasons_table * tbl,u64 exit_code)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
exit_event_decode_key(struct perf_kvm_stat * kvm,struct event_key * key,char * decode)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