1 /* SPDX-License-Identifier: GPL-2.0 */
2 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
3 #define _TRACE_KVM_H
4 
5 #include <linux/tracepoint.h>
6 
7 #undef TRACE_SYSTEM
8 #define TRACE_SYSTEM kvm
9 
10 /*
11  * Tracepoints for entry/exit to guest
12  */
13 TRACE_EVENT(kvm_entry,
14 	TP_PROTO(unsigned long vcpu_pc),
15 	TP_ARGS(vcpu_pc),
16 
17 	TP_STRUCT__entry(
18 		__field(	unsigned long,	vcpu_pc		)
19 	),
20 
21 	TP_fast_assign(
22 		__entry->vcpu_pc		= vcpu_pc;
23 	),
24 
25 	TP_printk("PC: 0x%08lx", __entry->vcpu_pc)
26 );
27 
28 TRACE_EVENT(kvm_exit,
29 	TP_PROTO(int idx, unsigned int exit_reason, unsigned long vcpu_pc),
30 	TP_ARGS(idx, exit_reason, vcpu_pc),
31 
32 	TP_STRUCT__entry(
33 		__field(	int,		idx		)
34 		__field(	unsigned int,	exit_reason	)
35 		__field(	unsigned long,	vcpu_pc		)
36 	),
37 
38 	TP_fast_assign(
39 		__entry->idx			= idx;
40 		__entry->exit_reason		= exit_reason;
41 		__entry->vcpu_pc		= vcpu_pc;
42 	),
43 
44 	TP_printk("%s: HSR_EC: 0x%04x (%s), PC: 0x%08lx",
45 		  __print_symbolic(__entry->idx, kvm_arm_exception_type),
46 		  __entry->exit_reason,
47 		  __print_symbolic(__entry->exit_reason, kvm_arm_exception_class),
48 		  __entry->vcpu_pc)
49 );
50 
51 TRACE_EVENT(kvm_guest_fault,
52 	TP_PROTO(unsigned long vcpu_pc, unsigned long hsr,
53 		 unsigned long hxfar,
54 		 unsigned long long ipa),
55 	TP_ARGS(vcpu_pc, hsr, hxfar, ipa),
56 
57 	TP_STRUCT__entry(
58 		__field(	unsigned long,	vcpu_pc		)
59 		__field(	unsigned long,	hsr		)
60 		__field(	unsigned long,	hxfar		)
61 		__field(   unsigned long long,	ipa		)
62 	),
63 
64 	TP_fast_assign(
65 		__entry->vcpu_pc		= vcpu_pc;
66 		__entry->hsr			= hsr;
67 		__entry->hxfar			= hxfar;
68 		__entry->ipa			= ipa;
69 	),
70 
71 	TP_printk("ipa %#llx, hsr %#08lx, hxfar %#08lx, pc %#08lx",
72 		  __entry->ipa, __entry->hsr,
73 		  __entry->hxfar, __entry->vcpu_pc)
74 );
75 
76 TRACE_EVENT(kvm_access_fault,
77 	TP_PROTO(unsigned long ipa),
78 	TP_ARGS(ipa),
79 
80 	TP_STRUCT__entry(
81 		__field(	unsigned long,	ipa		)
82 	),
83 
84 	TP_fast_assign(
85 		__entry->ipa		= ipa;
86 	),
87 
88 	TP_printk("IPA: %lx", __entry->ipa)
89 );
90 
91 TRACE_EVENT(kvm_irq_line,
92 	TP_PROTO(unsigned int type, int vcpu_idx, int irq_num, int level),
93 	TP_ARGS(type, vcpu_idx, irq_num, level),
94 
95 	TP_STRUCT__entry(
96 		__field(	unsigned int,	type		)
97 		__field(	int,		vcpu_idx	)
98 		__field(	int,		irq_num		)
99 		__field(	int,		level		)
100 	),
101 
102 	TP_fast_assign(
103 		__entry->type		= type;
104 		__entry->vcpu_idx	= vcpu_idx;
105 		__entry->irq_num	= irq_num;
106 		__entry->level		= level;
107 	),
108 
109 	TP_printk("Inject %s interrupt (%d), vcpu->idx: %d, num: %d, level: %d",
110 		  (__entry->type == KVM_ARM_IRQ_TYPE_CPU) ? "CPU" :
111 		  (__entry->type == KVM_ARM_IRQ_TYPE_PPI) ? "VGIC PPI" :
112 		  (__entry->type == KVM_ARM_IRQ_TYPE_SPI) ? "VGIC SPI" : "UNKNOWN",
113 		  __entry->type, __entry->vcpu_idx, __entry->irq_num, __entry->level)
114 );
115 
116 TRACE_EVENT(kvm_mmio_emulate,
117 	TP_PROTO(unsigned long vcpu_pc, unsigned long instr,
118 		 unsigned long cpsr),
119 	TP_ARGS(vcpu_pc, instr, cpsr),
120 
121 	TP_STRUCT__entry(
122 		__field(	unsigned long,	vcpu_pc		)
123 		__field(	unsigned long,	instr		)
124 		__field(	unsigned long,	cpsr		)
125 	),
126 
127 	TP_fast_assign(
128 		__entry->vcpu_pc		= vcpu_pc;
129 		__entry->instr			= instr;
130 		__entry->cpsr			= cpsr;
131 	),
132 
133 	TP_printk("Emulate MMIO at: 0x%08lx (instr: %08lx, cpsr: %08lx)",
134 		  __entry->vcpu_pc, __entry->instr, __entry->cpsr)
135 );
136 
137 TRACE_EVENT(kvm_unmap_hva_range,
138 	TP_PROTO(unsigned long start, unsigned long end),
139 	TP_ARGS(start, end),
140 
141 	TP_STRUCT__entry(
142 		__field(	unsigned long,	start		)
143 		__field(	unsigned long,	end		)
144 	),
145 
146 	TP_fast_assign(
147 		__entry->start		= start;
148 		__entry->end		= end;
149 	),
150 
151 	TP_printk("mmu notifier unmap range: %#08lx -- %#08lx",
152 		  __entry->start, __entry->end)
153 );
154 
155 TRACE_EVENT(kvm_set_spte_hva,
156 	TP_PROTO(unsigned long hva),
157 	TP_ARGS(hva),
158 
159 	TP_STRUCT__entry(
160 		__field(	unsigned long,	hva		)
161 	),
162 
163 	TP_fast_assign(
164 		__entry->hva		= hva;
165 	),
166 
167 	TP_printk("mmu notifier set pte hva: %#08lx", __entry->hva)
168 );
169 
170 TRACE_EVENT(kvm_age_hva,
171 	TP_PROTO(unsigned long start, unsigned long end),
172 	TP_ARGS(start, end),
173 
174 	TP_STRUCT__entry(
175 		__field(	unsigned long,	start		)
176 		__field(	unsigned long,	end		)
177 	),
178 
179 	TP_fast_assign(
180 		__entry->start		= start;
181 		__entry->end		= end;
182 	),
183 
184 	TP_printk("mmu notifier age hva: %#08lx -- %#08lx",
185 		  __entry->start, __entry->end)
186 );
187 
188 TRACE_EVENT(kvm_test_age_hva,
189 	TP_PROTO(unsigned long hva),
190 	TP_ARGS(hva),
191 
192 	TP_STRUCT__entry(
193 		__field(	unsigned long,	hva		)
194 	),
195 
196 	TP_fast_assign(
197 		__entry->hva		= hva;
198 	),
199 
200 	TP_printk("mmu notifier test age hva: %#08lx", __entry->hva)
201 );
202 
203 TRACE_EVENT(kvm_set_way_flush,
204 	    TP_PROTO(unsigned long vcpu_pc, bool cache),
205 	    TP_ARGS(vcpu_pc, cache),
206 
207 	    TP_STRUCT__entry(
208 		    __field(	unsigned long,	vcpu_pc		)
209 		    __field(	bool,		cache		)
210 	    ),
211 
212 	    TP_fast_assign(
213 		    __entry->vcpu_pc		= vcpu_pc;
214 		    __entry->cache		= cache;
215 	    ),
216 
217 	    TP_printk("S/W flush at 0x%016lx (cache %s)",
218 		      __entry->vcpu_pc, __entry->cache ? "on" : "off")
219 );
220 
221 TRACE_EVENT(kvm_toggle_cache,
222 	    TP_PROTO(unsigned long vcpu_pc, bool was, bool now),
223 	    TP_ARGS(vcpu_pc, was, now),
224 
225 	    TP_STRUCT__entry(
226 		    __field(	unsigned long,	vcpu_pc		)
227 		    __field(	bool,		was		)
228 		    __field(	bool,		now		)
229 	    ),
230 
231 	    TP_fast_assign(
232 		    __entry->vcpu_pc		= vcpu_pc;
233 		    __entry->was		= was;
234 		    __entry->now		= now;
235 	    ),
236 
237 	    TP_printk("VM op at 0x%016lx (cache was %s, now %s)",
238 		      __entry->vcpu_pc, __entry->was ? "on" : "off",
239 		      __entry->now ? "on" : "off")
240 );
241 
242 /*
243  * Tracepoints for arch_timer
244  */
245 TRACE_EVENT(kvm_timer_update_irq,
246 	TP_PROTO(unsigned long vcpu_id, __u32 irq, int level),
247 	TP_ARGS(vcpu_id, irq, level),
248 
249 	TP_STRUCT__entry(
250 		__field(	unsigned long,	vcpu_id	)
251 		__field(	__u32,		irq	)
252 		__field(	int,		level	)
253 	),
254 
255 	TP_fast_assign(
256 		__entry->vcpu_id	= vcpu_id;
257 		__entry->irq		= irq;
258 		__entry->level		= level;
259 	),
260 
261 	TP_printk("VCPU: %ld, IRQ %d, level %d",
262 		  __entry->vcpu_id, __entry->irq, __entry->level)
263 );
264 
265 #endif /* _TRACE_KVM_H */
266 
267 #undef TRACE_INCLUDE_PATH
268 #define TRACE_INCLUDE_PATH ../../../virt/kvm/arm
269 #undef TRACE_INCLUDE_FILE
270 #define TRACE_INCLUDE_FILE trace
271 
272 /* This part must be outside protection */
273 #include <trace/define_trace.h>
274