xref: /linux/arch/loongarch/kvm/trace.h (revision 63eb28bb1402891b1ad2be02a530f29a9dd7f1cd)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
4  */
5 
6 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
7 #define _TRACE_KVM_H
8 
9 #include <linux/tracepoint.h>
10 #include <asm/kvm_csr.h>
11 
12 #undef	TRACE_SYSTEM
13 #define TRACE_SYSTEM	kvm
14 
15 /*
16  * Tracepoints for VM enters
17  */
18 DECLARE_EVENT_CLASS(kvm_transition,
19 	TP_PROTO(struct kvm_vcpu *vcpu),
20 	TP_ARGS(vcpu),
21 	TP_STRUCT__entry(
22 		__field(unsigned int, vcpu_id)
23 		__field(unsigned long, pc)
24 	),
25 
26 	TP_fast_assign(
27 		__entry->vcpu_id = vcpu->vcpu_id;
28 		__entry->pc = vcpu->arch.pc;
29 	),
30 
31 	TP_printk("vcpu %u PC: 0x%08lx", __entry->vcpu_id, __entry->pc)
32 );
33 
34 DEFINE_EVENT(kvm_transition, kvm_enter,
35 	     TP_PROTO(struct kvm_vcpu *vcpu),
36 	     TP_ARGS(vcpu));
37 
38 DEFINE_EVENT(kvm_transition, kvm_reenter,
39 	     TP_PROTO(struct kvm_vcpu *vcpu),
40 	     TP_ARGS(vcpu));
41 
42 DEFINE_EVENT(kvm_transition, kvm_out,
43 	     TP_PROTO(struct kvm_vcpu *vcpu),
44 	     TP_ARGS(vcpu));
45 
46 /* Further exit reasons */
47 #define KVM_TRACE_EXIT_IDLE		64
48 #define KVM_TRACE_EXIT_CACHE		65
49 #define KVM_TRACE_EXIT_CPUCFG		66
50 #define KVM_TRACE_EXIT_CSR		67
51 
52 /* Tracepoints for VM exits */
53 #define kvm_trace_symbol_exit_types			\
54 	{ KVM_TRACE_EXIT_IDLE,		"IDLE" },	\
55 	{ KVM_TRACE_EXIT_CACHE,		"CACHE" },	\
56 	{ KVM_TRACE_EXIT_CPUCFG,	"CPUCFG" },	\
57 	{ KVM_TRACE_EXIT_CSR,		"CSR" }
58 
59 DECLARE_EVENT_CLASS(kvm_exit,
60 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
61 	    TP_ARGS(vcpu, reason),
62 	    TP_STRUCT__entry(
63 			__field(unsigned int, vcpu_id)
64 			__field(unsigned long, pc)
65 			__field(unsigned int, reason)
66 	    ),
67 
68 	    TP_fast_assign(
69 			__entry->vcpu_id = vcpu->vcpu_id;
70 			__entry->pc = vcpu->arch.pc;
71 			__entry->reason = reason;
72 	    ),
73 
74 	    TP_printk("vcpu %u [%s] PC: 0x%08lx",
75 			__entry->vcpu_id,
76 			__print_symbolic(__entry->reason,
77 				kvm_trace_symbol_exit_types),
78 			__entry->pc)
79 );
80 
81 DEFINE_EVENT(kvm_exit, kvm_exit_idle,
82 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
83 	     TP_ARGS(vcpu, reason));
84 
85 DEFINE_EVENT(kvm_exit, kvm_exit_cache,
86 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
87 	     TP_ARGS(vcpu, reason));
88 
89 DEFINE_EVENT(kvm_exit, kvm_exit_cpucfg,
90 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
91 	     TP_ARGS(vcpu, reason));
92 
93 DEFINE_EVENT(kvm_exit, kvm_exit_csr,
94 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
95 	     TP_ARGS(vcpu, reason));
96 
97 DEFINE_EVENT(kvm_exit, kvm_exit,
98 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
99 	     TP_ARGS(vcpu, reason));
100 
101 TRACE_EVENT(kvm_exit_gspr,
102 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int inst_word),
103 	    TP_ARGS(vcpu, inst_word),
104 	    TP_STRUCT__entry(
105 			__field(unsigned int, vcpu_id)
106 			__field(unsigned int, inst_word)
107 	    ),
108 
109 	    TP_fast_assign(
110 			__entry->vcpu_id = vcpu->vcpu_id;
111 			__entry->inst_word = inst_word;
112 	    ),
113 
114 	    TP_printk("vcpu %u Inst word: 0x%08x", __entry->vcpu_id,
115 			__entry->inst_word)
116 );
117 
118 #define KVM_TRACE_AUX_SAVE		0
119 #define KVM_TRACE_AUX_RESTORE		1
120 #define KVM_TRACE_AUX_ENABLE		2
121 #define KVM_TRACE_AUX_DISABLE		3
122 #define KVM_TRACE_AUX_DISCARD		4
123 
124 #define KVM_TRACE_AUX_FPU		1
125 #define KVM_TRACE_AUX_LSX		2
126 #define KVM_TRACE_AUX_LASX		3
127 
128 #define kvm_trace_symbol_aux_op				\
129 	{ KVM_TRACE_AUX_SAVE,		"save" },	\
130 	{ KVM_TRACE_AUX_RESTORE,	"restore" },	\
131 	{ KVM_TRACE_AUX_ENABLE,		"enable" },	\
132 	{ KVM_TRACE_AUX_DISABLE,	"disable" },	\
133 	{ KVM_TRACE_AUX_DISCARD,	"discard" }
134 
135 #define kvm_trace_symbol_aux_state			\
136 	{ KVM_TRACE_AUX_FPU,     "FPU" },		\
137 	{ KVM_TRACE_AUX_LSX,     "LSX" },		\
138 	{ KVM_TRACE_AUX_LASX,    "LASX" }
139 
140 TRACE_EVENT(kvm_aux,
141 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int op,
142 		     unsigned int state),
143 	    TP_ARGS(vcpu, op, state),
144 	    TP_STRUCT__entry(
145 			__field(unsigned long, pc)
146 			__field(u8, op)
147 			__field(u8, state)
148 	    ),
149 
150 	    TP_fast_assign(
151 			__entry->pc = vcpu->arch.pc;
152 			__entry->op = op;
153 			__entry->state = state;
154 	    ),
155 
156 	    TP_printk("%s %s PC: 0x%08lx",
157 		      __print_symbolic(__entry->op,
158 				       kvm_trace_symbol_aux_op),
159 		      __print_symbolic(__entry->state,
160 				       kvm_trace_symbol_aux_state),
161 		      __entry->pc)
162 );
163 
164 TRACE_EVENT(kvm_vpid_change,
165 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned long vpid),
166 	    TP_ARGS(vcpu, vpid),
167 	    TP_STRUCT__entry(
168 			__field(unsigned long, vpid)
169 	    ),
170 
171 	    TP_fast_assign(
172 			__entry->vpid = vpid;
173 	    ),
174 
175 	    TP_printk("VPID: 0x%08lx", __entry->vpid)
176 );
177 
178 #endif /* _TRACE_KVM_H */
179 
180 #undef TRACE_INCLUDE_PATH
181 #define TRACE_INCLUDE_PATH ../../arch/loongarch/kvm
182 #undef TRACE_INCLUDE_FILE
183 #define TRACE_INCLUDE_FILE trace
184 
185 /* This part must be outside protection */
186 #include <trace/define_trace.h>
187