• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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,
138 	TP_PROTO(unsigned long hva),
139 	TP_ARGS(hva),
140 
141 	TP_STRUCT__entry(
142 		__field(	unsigned long,	hva		)
143 	),
144 
145 	TP_fast_assign(
146 		__entry->hva		= hva;
147 	),
148 
149 	TP_printk("mmu notifier unmap hva: %#08lx", __entry->hva)
150 );
151 
152 TRACE_EVENT(kvm_unmap_hva_range,
153 	TP_PROTO(unsigned long start, unsigned long end),
154 	TP_ARGS(start, end),
155 
156 	TP_STRUCT__entry(
157 		__field(	unsigned long,	start		)
158 		__field(	unsigned long,	end		)
159 	),
160 
161 	TP_fast_assign(
162 		__entry->start		= start;
163 		__entry->end		= end;
164 	),
165 
166 	TP_printk("mmu notifier unmap range: %#08lx -- %#08lx",
167 		  __entry->start, __entry->end)
168 );
169 
170 TRACE_EVENT(kvm_set_spte_hva,
171 	TP_PROTO(unsigned long hva),
172 	TP_ARGS(hva),
173 
174 	TP_STRUCT__entry(
175 		__field(	unsigned long,	hva		)
176 	),
177 
178 	TP_fast_assign(
179 		__entry->hva		= hva;
180 	),
181 
182 	TP_printk("mmu notifier set pte hva: %#08lx", __entry->hva)
183 );
184 
185 TRACE_EVENT(kvm_age_hva,
186 	TP_PROTO(unsigned long start, unsigned long end),
187 	TP_ARGS(start, end),
188 
189 	TP_STRUCT__entry(
190 		__field(	unsigned long,	start		)
191 		__field(	unsigned long,	end		)
192 	),
193 
194 	TP_fast_assign(
195 		__entry->start		= start;
196 		__entry->end		= end;
197 	),
198 
199 	TP_printk("mmu notifier age hva: %#08lx -- %#08lx",
200 		  __entry->start, __entry->end)
201 );
202 
203 TRACE_EVENT(kvm_test_age_hva,
204 	TP_PROTO(unsigned long hva),
205 	TP_ARGS(hva),
206 
207 	TP_STRUCT__entry(
208 		__field(	unsigned long,	hva		)
209 	),
210 
211 	TP_fast_assign(
212 		__entry->hva		= hva;
213 	),
214 
215 	TP_printk("mmu notifier test age hva: %#08lx", __entry->hva)
216 );
217 
218 TRACE_EVENT(kvm_set_way_flush,
219 	    TP_PROTO(unsigned long vcpu_pc, bool cache),
220 	    TP_ARGS(vcpu_pc, cache),
221 
222 	    TP_STRUCT__entry(
223 		    __field(	unsigned long,	vcpu_pc		)
224 		    __field(	bool,		cache		)
225 	    ),
226 
227 	    TP_fast_assign(
228 		    __entry->vcpu_pc		= vcpu_pc;
229 		    __entry->cache		= cache;
230 	    ),
231 
232 	    TP_printk("S/W flush at 0x%016lx (cache %s)",
233 		      __entry->vcpu_pc, __entry->cache ? "on" : "off")
234 );
235 
236 TRACE_EVENT(kvm_toggle_cache,
237 	    TP_PROTO(unsigned long vcpu_pc, bool was, bool now),
238 	    TP_ARGS(vcpu_pc, was, now),
239 
240 	    TP_STRUCT__entry(
241 		    __field(	unsigned long,	vcpu_pc		)
242 		    __field(	bool,		was		)
243 		    __field(	bool,		now		)
244 	    ),
245 
246 	    TP_fast_assign(
247 		    __entry->vcpu_pc		= vcpu_pc;
248 		    __entry->was		= was;
249 		    __entry->now		= now;
250 	    ),
251 
252 	    TP_printk("VM op at 0x%016lx (cache was %s, now %s)",
253 		      __entry->vcpu_pc, __entry->was ? "on" : "off",
254 		      __entry->now ? "on" : "off")
255 );
256 
257 /*
258  * Tracepoints for arch_timer
259  */
260 TRACE_EVENT(kvm_timer_update_irq,
261 	TP_PROTO(unsigned long vcpu_id, __u32 irq, int level),
262 	TP_ARGS(vcpu_id, irq, level),
263 
264 	TP_STRUCT__entry(
265 		__field(	unsigned long,	vcpu_id	)
266 		__field(	__u32,		irq	)
267 		__field(	int,		level	)
268 	),
269 
270 	TP_fast_assign(
271 		__entry->vcpu_id	= vcpu_id;
272 		__entry->irq		= irq;
273 		__entry->level		= level;
274 	),
275 
276 	TP_printk("VCPU: %ld, IRQ %d, level %d",
277 		  __entry->vcpu_id, __entry->irq, __entry->level)
278 );
279 
280 #endif /* _TRACE_KVM_H */
281 
282 #undef TRACE_INCLUDE_PATH
283 #define TRACE_INCLUDE_PATH ../../../virt/kvm/arm
284 #undef TRACE_INCLUDE_FILE
285 #define TRACE_INCLUDE_FILE trace
286 
287 /* This part must be outside protection */
288 #include <trace/define_trace.h>
289