xref: /openbmc/linux/arch/powerpc/kvm/trace.h (revision d78c317f)
1 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
2 #define _TRACE_KVM_H
3 
4 #include <linux/tracepoint.h>
5 
6 #undef TRACE_SYSTEM
7 #define TRACE_SYSTEM kvm
8 #define TRACE_INCLUDE_PATH .
9 #define TRACE_INCLUDE_FILE trace
10 
11 /*
12  * Tracepoint for guest mode entry.
13  */
14 TRACE_EVENT(kvm_ppc_instr,
15 	TP_PROTO(unsigned int inst, unsigned long _pc, unsigned int emulate),
16 	TP_ARGS(inst, _pc, emulate),
17 
18 	TP_STRUCT__entry(
19 		__field(	unsigned int,	inst		)
20 		__field(	unsigned long,	pc		)
21 		__field(	unsigned int,	emulate		)
22 	),
23 
24 	TP_fast_assign(
25 		__entry->inst		= inst;
26 		__entry->pc		= _pc;
27 		__entry->emulate	= emulate;
28 	),
29 
30 	TP_printk("inst %u pc 0x%lx emulate %u\n",
31 		  __entry->inst, __entry->pc, __entry->emulate)
32 );
33 
34 TRACE_EVENT(kvm_stlb_inval,
35 	TP_PROTO(unsigned int stlb_index),
36 	TP_ARGS(stlb_index),
37 
38 	TP_STRUCT__entry(
39 		__field(	unsigned int,	stlb_index	)
40 	),
41 
42 	TP_fast_assign(
43 		__entry->stlb_index	= stlb_index;
44 	),
45 
46 	TP_printk("stlb_index %u", __entry->stlb_index)
47 );
48 
49 TRACE_EVENT(kvm_stlb_write,
50 	TP_PROTO(unsigned int victim, unsigned int tid, unsigned int word0,
51 		 unsigned int word1, unsigned int word2),
52 	TP_ARGS(victim, tid, word0, word1, word2),
53 
54 	TP_STRUCT__entry(
55 		__field(	unsigned int,	victim		)
56 		__field(	unsigned int,	tid		)
57 		__field(	unsigned int,	word0		)
58 		__field(	unsigned int,	word1		)
59 		__field(	unsigned int,	word2		)
60 	),
61 
62 	TP_fast_assign(
63 		__entry->victim		= victim;
64 		__entry->tid		= tid;
65 		__entry->word0		= word0;
66 		__entry->word1		= word1;
67 		__entry->word2		= word2;
68 	),
69 
70 	TP_printk("victim %u tid %u w0 %u w1 %u w2 %u",
71 		__entry->victim, __entry->tid, __entry->word0,
72 		__entry->word1, __entry->word2)
73 );
74 
75 TRACE_EVENT(kvm_gtlb_write,
76 	TP_PROTO(unsigned int gtlb_index, unsigned int tid, unsigned int word0,
77 		 unsigned int word1, unsigned int word2),
78 	TP_ARGS(gtlb_index, tid, word0, word1, word2),
79 
80 	TP_STRUCT__entry(
81 		__field(	unsigned int,	gtlb_index	)
82 		__field(	unsigned int,	tid		)
83 		__field(	unsigned int,	word0		)
84 		__field(	unsigned int,	word1		)
85 		__field(	unsigned int,	word2		)
86 	),
87 
88 	TP_fast_assign(
89 		__entry->gtlb_index	= gtlb_index;
90 		__entry->tid		= tid;
91 		__entry->word0		= word0;
92 		__entry->word1		= word1;
93 		__entry->word2		= word2;
94 	),
95 
96 	TP_printk("gtlb_index %u tid %u w0 %u w1 %u w2 %u",
97 		__entry->gtlb_index, __entry->tid, __entry->word0,
98 		__entry->word1, __entry->word2)
99 );
100 
101 
102 /*************************************************************************
103  *                         Book3S trace points                           *
104  *************************************************************************/
105 
106 #ifdef CONFIG_KVM_BOOK3S_PR
107 
108 TRACE_EVENT(kvm_book3s_exit,
109 	TP_PROTO(unsigned int exit_nr, struct kvm_vcpu *vcpu),
110 	TP_ARGS(exit_nr, vcpu),
111 
112 	TP_STRUCT__entry(
113 		__field(	unsigned int,	exit_nr		)
114 		__field(	unsigned long,	pc		)
115 		__field(	unsigned long,	msr		)
116 		__field(	unsigned long,	dar		)
117 		__field(	unsigned long,	srr1		)
118 	),
119 
120 	TP_fast_assign(
121 		__entry->exit_nr	= exit_nr;
122 		__entry->pc		= kvmppc_get_pc(vcpu);
123 		__entry->dar		= kvmppc_get_fault_dar(vcpu);
124 		__entry->msr		= vcpu->arch.shared->msr;
125 		__entry->srr1		= to_svcpu(vcpu)->shadow_srr1;
126 	),
127 
128 	TP_printk("exit=0x%x | pc=0x%lx | msr=0x%lx | dar=0x%lx | srr1=0x%lx",
129 		  __entry->exit_nr, __entry->pc, __entry->msr, __entry->dar,
130 		  __entry->srr1)
131 );
132 
133 TRACE_EVENT(kvm_book3s_reenter,
134 	TP_PROTO(int r, struct kvm_vcpu *vcpu),
135 	TP_ARGS(r, vcpu),
136 
137 	TP_STRUCT__entry(
138 		__field(	unsigned int,	r		)
139 		__field(	unsigned long,	pc		)
140 	),
141 
142 	TP_fast_assign(
143 		__entry->r		= r;
144 		__entry->pc		= kvmppc_get_pc(vcpu);
145 	),
146 
147 	TP_printk("reentry r=%d | pc=0x%lx", __entry->r, __entry->pc)
148 );
149 
150 #ifdef CONFIG_PPC_BOOK3S_64
151 
152 TRACE_EVENT(kvm_book3s_64_mmu_map,
153 	TP_PROTO(int rflags, ulong hpteg, ulong va, pfn_t hpaddr,
154 		 struct kvmppc_pte *orig_pte),
155 	TP_ARGS(rflags, hpteg, va, hpaddr, orig_pte),
156 
157 	TP_STRUCT__entry(
158 		__field(	unsigned char,		flag_w		)
159 		__field(	unsigned char,		flag_x		)
160 		__field(	unsigned long,		eaddr		)
161 		__field(	unsigned long,		hpteg		)
162 		__field(	unsigned long,		va		)
163 		__field(	unsigned long long,	vpage		)
164 		__field(	unsigned long,		hpaddr		)
165 	),
166 
167 	TP_fast_assign(
168 		__entry->flag_w	= ((rflags & HPTE_R_PP) == 3) ? '-' : 'w';
169 		__entry->flag_x	= (rflags & HPTE_R_N) ? '-' : 'x';
170 		__entry->eaddr	= orig_pte->eaddr;
171 		__entry->hpteg	= hpteg;
172 		__entry->va	= va;
173 		__entry->vpage	= orig_pte->vpage;
174 		__entry->hpaddr	= hpaddr;
175 	),
176 
177 	TP_printk("KVM: %c%c Map 0x%lx: [%lx] 0x%lx (0x%llx) -> %lx",
178 		  __entry->flag_w, __entry->flag_x, __entry->eaddr,
179 		  __entry->hpteg, __entry->va, __entry->vpage, __entry->hpaddr)
180 );
181 
182 #endif /* CONFIG_PPC_BOOK3S_64 */
183 
184 TRACE_EVENT(kvm_book3s_mmu_map,
185 	TP_PROTO(struct hpte_cache *pte),
186 	TP_ARGS(pte),
187 
188 	TP_STRUCT__entry(
189 		__field(	u64,		host_va		)
190 		__field(	u64,		pfn		)
191 		__field(	ulong,		eaddr		)
192 		__field(	u64,		vpage		)
193 		__field(	ulong,		raddr		)
194 		__field(	int,		flags		)
195 	),
196 
197 	TP_fast_assign(
198 		__entry->host_va	= pte->host_va;
199 		__entry->pfn		= pte->pfn;
200 		__entry->eaddr		= pte->pte.eaddr;
201 		__entry->vpage		= pte->pte.vpage;
202 		__entry->raddr		= pte->pte.raddr;
203 		__entry->flags		= (pte->pte.may_read ? 0x4 : 0) |
204 					  (pte->pte.may_write ? 0x2 : 0) |
205 					  (pte->pte.may_execute ? 0x1 : 0);
206 	),
207 
208 	TP_printk("Map: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]",
209 		  __entry->host_va, __entry->pfn, __entry->eaddr,
210 		  __entry->vpage, __entry->raddr, __entry->flags)
211 );
212 
213 TRACE_EVENT(kvm_book3s_mmu_invalidate,
214 	TP_PROTO(struct hpte_cache *pte),
215 	TP_ARGS(pte),
216 
217 	TP_STRUCT__entry(
218 		__field(	u64,		host_va		)
219 		__field(	u64,		pfn		)
220 		__field(	ulong,		eaddr		)
221 		__field(	u64,		vpage		)
222 		__field(	ulong,		raddr		)
223 		__field(	int,		flags		)
224 	),
225 
226 	TP_fast_assign(
227 		__entry->host_va	= pte->host_va;
228 		__entry->pfn		= pte->pfn;
229 		__entry->eaddr		= pte->pte.eaddr;
230 		__entry->vpage		= pte->pte.vpage;
231 		__entry->raddr		= pte->pte.raddr;
232 		__entry->flags		= (pte->pte.may_read ? 0x4 : 0) |
233 					  (pte->pte.may_write ? 0x2 : 0) |
234 					  (pte->pte.may_execute ? 0x1 : 0);
235 	),
236 
237 	TP_printk("Flush: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]",
238 		  __entry->host_va, __entry->pfn, __entry->eaddr,
239 		  __entry->vpage, __entry->raddr, __entry->flags)
240 );
241 
242 TRACE_EVENT(kvm_book3s_mmu_flush,
243 	TP_PROTO(const char *type, struct kvm_vcpu *vcpu, unsigned long long p1,
244 		 unsigned long long p2),
245 	TP_ARGS(type, vcpu, p1, p2),
246 
247 	TP_STRUCT__entry(
248 		__field(	int,			count		)
249 		__field(	unsigned long long,	p1		)
250 		__field(	unsigned long long,	p2		)
251 		__field(	const char *,		type		)
252 	),
253 
254 	TP_fast_assign(
255 		__entry->count		= to_book3s(vcpu)->hpte_cache_count;
256 		__entry->p1		= p1;
257 		__entry->p2		= p2;
258 		__entry->type		= type;
259 	),
260 
261 	TP_printk("Flush %d %sPTEs: %llx - %llx",
262 		  __entry->count, __entry->type, __entry->p1, __entry->p2)
263 );
264 
265 TRACE_EVENT(kvm_book3s_slb_found,
266 	TP_PROTO(unsigned long long gvsid, unsigned long long hvsid),
267 	TP_ARGS(gvsid, hvsid),
268 
269 	TP_STRUCT__entry(
270 		__field(	unsigned long long,	gvsid		)
271 		__field(	unsigned long long,	hvsid		)
272 	),
273 
274 	TP_fast_assign(
275 		__entry->gvsid		= gvsid;
276 		__entry->hvsid		= hvsid;
277 	),
278 
279 	TP_printk("%llx -> %llx", __entry->gvsid, __entry->hvsid)
280 );
281 
282 TRACE_EVENT(kvm_book3s_slb_fail,
283 	TP_PROTO(u16 sid_map_mask, unsigned long long gvsid),
284 	TP_ARGS(sid_map_mask, gvsid),
285 
286 	TP_STRUCT__entry(
287 		__field(	unsigned short,		sid_map_mask	)
288 		__field(	unsigned long long,	gvsid		)
289 	),
290 
291 	TP_fast_assign(
292 		__entry->sid_map_mask	= sid_map_mask;
293 		__entry->gvsid		= gvsid;
294 	),
295 
296 	TP_printk("%x/%x: %llx", __entry->sid_map_mask,
297 		  SID_MAP_MASK - __entry->sid_map_mask, __entry->gvsid)
298 );
299 
300 TRACE_EVENT(kvm_book3s_slb_map,
301 	TP_PROTO(u16 sid_map_mask, unsigned long long gvsid,
302 		 unsigned long long hvsid),
303 	TP_ARGS(sid_map_mask, gvsid, hvsid),
304 
305 	TP_STRUCT__entry(
306 		__field(	unsigned short,		sid_map_mask	)
307 		__field(	unsigned long long,	guest_vsid	)
308 		__field(	unsigned long long,	host_vsid	)
309 	),
310 
311 	TP_fast_assign(
312 		__entry->sid_map_mask	= sid_map_mask;
313 		__entry->guest_vsid	= gvsid;
314 		__entry->host_vsid	= hvsid;
315 	),
316 
317 	TP_printk("%x: %llx -> %llx", __entry->sid_map_mask,
318 		  __entry->guest_vsid, __entry->host_vsid)
319 );
320 
321 TRACE_EVENT(kvm_book3s_slbmte,
322 	TP_PROTO(u64 slb_vsid, u64 slb_esid),
323 	TP_ARGS(slb_vsid, slb_esid),
324 
325 	TP_STRUCT__entry(
326 		__field(	u64,	slb_vsid	)
327 		__field(	u64,	slb_esid	)
328 	),
329 
330 	TP_fast_assign(
331 		__entry->slb_vsid	= slb_vsid;
332 		__entry->slb_esid	= slb_esid;
333 	),
334 
335 	TP_printk("%llx, %llx", __entry->slb_vsid, __entry->slb_esid)
336 );
337 
338 #endif /* CONFIG_PPC_BOOK3S */
339 
340 #endif /* _TRACE_KVM_H */
341 
342 /* This part must be outside protection */
343 #include <trace/define_trace.h>
344