56b2e0937e611e5b9b16069486b32648bf47e707
[lttng-modules.git] / instrumentation / events / lttng-module / arch / x86 / kvm / trace.h
1 #if !defined(LTTNG_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
2 #define LTTNG_TRACE_KVM_H
3
4 #include "../../../../../../probes/lttng-tracepoint-event.h"
5 #include <asm/vmx.h>
6 #include <asm/svm.h>
7 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
8 #include <asm/clocksource.h>
9 #endif
10 #include <linux/version.h>
11 #include <../arch/x86/kvm/lapic.h>
12 #include <../arch/x86/kvm/kvm_cache_regs.h>
13
14 #undef TRACE_SYSTEM
15 #define TRACE_SYSTEM kvm
16
17 /*
18 * Tracepoint for guest mode entry.
19 */
20 LTTNG_TRACEPOINT_EVENT(kvm_entry,
21 TP_PROTO(unsigned int vcpu_id),
22 TP_ARGS(vcpu_id),
23
24 TP_STRUCT__entry(
25 __field( unsigned int, vcpu_id )
26 ),
27
28 TP_fast_assign(
29 tp_assign(vcpu_id, vcpu_id)
30 ),
31
32 TP_printk("vcpu %u", __entry->vcpu_id)
33 )
34
35 /*
36 * Tracepoint for hypercall.
37 */
38 LTTNG_TRACEPOINT_EVENT(kvm_hypercall,
39 TP_PROTO(unsigned long nr, unsigned long a0, unsigned long a1,
40 unsigned long a2, unsigned long a3),
41 TP_ARGS(nr, a0, a1, a2, a3),
42
43 TP_STRUCT__entry(
44 __field( unsigned long, nr )
45 __field( unsigned long, a0 )
46 __field( unsigned long, a1 )
47 __field( unsigned long, a2 )
48 __field( unsigned long, a3 )
49 ),
50
51 TP_fast_assign(
52 tp_assign(nr, nr)
53 tp_assign(a0, a0)
54 tp_assign(a1, a1)
55 tp_assign(a2, a2)
56 tp_assign(a3, a3)
57 ),
58
59 TP_printk("nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx",
60 __entry->nr, __entry->a0, __entry->a1, __entry->a2,
61 __entry->a3)
62 )
63
64 /*
65 * Tracepoint for hypercall.
66 */
67 LTTNG_TRACEPOINT_EVENT(kvm_hv_hypercall,
68 TP_PROTO(__u16 code, bool fast, __u16 rep_cnt, __u16 rep_idx,
69 __u64 ingpa, __u64 outgpa),
70 TP_ARGS(code, fast, rep_cnt, rep_idx, ingpa, outgpa),
71
72 TP_STRUCT__entry(
73 __field( __u16, rep_cnt )
74 __field( __u16, rep_idx )
75 __field( __u64, ingpa )
76 __field( __u64, outgpa )
77 __field( __u16, code )
78 __field( bool, fast )
79 ),
80
81 TP_fast_assign(
82 tp_assign(rep_cnt, rep_cnt)
83 tp_assign(rep_idx, rep_idx)
84 tp_assign(ingpa, ingpa)
85 tp_assign(outgpa, outgpa)
86 tp_assign(code, code)
87 tp_assign(fast, fast)
88 ),
89
90 TP_printk("code 0x%x %s cnt 0x%x idx 0x%x in 0x%llx out 0x%llx",
91 __entry->code, __entry->fast ? "fast" : "slow",
92 __entry->rep_cnt, __entry->rep_idx, __entry->ingpa,
93 __entry->outgpa)
94 )
95
96 /*
97 * Tracepoint for PIO.
98 */
99 LTTNG_TRACEPOINT_EVENT(kvm_pio,
100 TP_PROTO(unsigned int rw, unsigned int port, unsigned int size,
101 unsigned int count),
102 TP_ARGS(rw, port, size, count),
103
104 TP_STRUCT__entry(
105 __field( unsigned int, rw )
106 __field( unsigned int, port )
107 __field( unsigned int, size )
108 __field( unsigned int, count )
109 ),
110
111 TP_fast_assign(
112 tp_assign(rw, rw)
113 tp_assign(port, port)
114 tp_assign(size, size)
115 tp_assign(count, count)
116 ),
117
118 TP_printk("pio_%s at 0x%x size %d count %d",
119 __entry->rw ? "write" : "read",
120 __entry->port, __entry->size, __entry->count)
121 )
122
123 /*
124 * Tracepoint for cpuid.
125 */
126 LTTNG_TRACEPOINT_EVENT(kvm_cpuid,
127 TP_PROTO(unsigned int function, unsigned long rax, unsigned long rbx,
128 unsigned long rcx, unsigned long rdx),
129 TP_ARGS(function, rax, rbx, rcx, rdx),
130
131 TP_STRUCT__entry(
132 __field( unsigned int, function )
133 __field( unsigned long, rax )
134 __field( unsigned long, rbx )
135 __field( unsigned long, rcx )
136 __field( unsigned long, rdx )
137 ),
138
139 TP_fast_assign(
140 tp_assign(function, function)
141 tp_assign(rax, rax)
142 tp_assign(rbx, rbx)
143 tp_assign(rcx, rcx)
144 tp_assign(rdx, rdx)
145 ),
146
147 TP_printk("func %x rax %lx rbx %lx rcx %lx rdx %lx",
148 __entry->function, __entry->rax,
149 __entry->rbx, __entry->rcx, __entry->rdx)
150 )
151
152 #define AREG(x) { APIC_##x, "APIC_" #x }
153
154 #define kvm_trace_symbol_apic \
155 AREG(ID), AREG(LVR), AREG(TASKPRI), AREG(ARBPRI), AREG(PROCPRI), \
156 AREG(EOI), AREG(RRR), AREG(LDR), AREG(DFR), AREG(SPIV), AREG(ISR), \
157 AREG(TMR), AREG(IRR), AREG(ESR), AREG(ICR), AREG(ICR2), AREG(LVTT), \
158 AREG(LVTTHMR), AREG(LVTPC), AREG(LVT0), AREG(LVT1), AREG(LVTERR), \
159 AREG(TMICT), AREG(TMCCT), AREG(TDCR), AREG(SELF_IPI), AREG(EFEAT), \
160 AREG(ECTRL)
161 /*
162 * Tracepoint for apic access.
163 */
164 LTTNG_TRACEPOINT_EVENT(kvm_apic,
165 TP_PROTO(unsigned int rw, unsigned int reg, unsigned int val),
166 TP_ARGS(rw, reg, val),
167
168 TP_STRUCT__entry(
169 __field( unsigned int, rw )
170 __field( unsigned int, reg )
171 __field( unsigned int, val )
172 ),
173
174 TP_fast_assign(
175 tp_assign(rw, rw)
176 tp_assign(reg, reg)
177 tp_assign(val, val)
178 ),
179
180 TP_printk("apic_%s %s = 0x%x",
181 __entry->rw ? "write" : "read",
182 __print_symbolic(__entry->reg, kvm_trace_symbol_apic),
183 __entry->val)
184 )
185
186 #define trace_kvm_apic_read(reg, val) trace_kvm_apic(0, reg, val)
187 #define trace_kvm_apic_write(reg, val) trace_kvm_apic(1, reg, val)
188
189 #define KVM_ISA_VMX 1
190 #define KVM_ISA_SVM 2
191
192 /*
193 * Tracepoint for kvm guest exit:
194 */
195 LTTNG_TRACEPOINT_EVENT(kvm_exit,
196 TP_PROTO(unsigned int exit_reason, struct kvm_vcpu *vcpu, u32 isa, u64 info1, u64 info2),
197 TP_ARGS(exit_reason, vcpu, isa, info1, info2),
198
199 TP_STRUCT__entry(
200 __field( unsigned int, exit_reason )
201 __field( unsigned long, guest_rip )
202 __field( u32, isa )
203 __field( u64, info1 )
204 __field( u64, info2 )
205 ),
206
207 TP_fast_assign(
208 tp_assign(exit_reason, exit_reason)
209 tp_assign(guest_rip, kvm_rip_read(vcpu))
210 tp_assign(isa, isa)
211 kvm_x86_ops->get_exit_info(vcpu, &info1,
212 &info2);
213 tp_assign(info1, info1)
214 tp_assign(info2, info2)
215 ),
216
217 TP_printk("reason %s rip info %llx %llx",
218 (__entry->isa == KVM_ISA_VMX) ?
219 __print_symbolic(__entry->exit_reason, VMX_EXIT_REASONS) :
220 __print_symbolic(__entry->exit_reason, SVM_EXIT_REASONS),
221 /* __entry->guest_rip,*/ __entry->info1, __entry->info2)
222 )
223
224 /*
225 * Tracepoint for kvm interrupt injection:
226 */
227 LTTNG_TRACEPOINT_EVENT(kvm_inj_virq,
228 TP_PROTO(unsigned int irq),
229 TP_ARGS(irq),
230
231 TP_STRUCT__entry(
232 __field( unsigned int, irq )
233 ),
234
235 TP_fast_assign(
236 tp_assign(irq, irq)
237 ),
238
239 TP_printk("irq %u", __entry->irq)
240 )
241
242 #define EXS(x) { x##_VECTOR, "#" #x }
243
244 #define kvm_trace_sym_exc \
245 EXS(DE), EXS(DB), EXS(BP), EXS(OF), EXS(BR), EXS(UD), EXS(NM), \
246 EXS(DF), EXS(TS), EXS(NP), EXS(SS), EXS(GP), EXS(PF), \
247 EXS(MF), EXS(MC)
248
249 /*
250 * Tracepoint for kvm interrupt injection:
251 */
252 LTTNG_TRACEPOINT_EVENT(kvm_inj_exception,
253 TP_PROTO(unsigned exception, bool has_error, unsigned error_code),
254 TP_ARGS(exception, has_error, error_code),
255
256 TP_STRUCT__entry(
257 __field( u8, exception )
258 __field( u8, has_error )
259 __field( u32, error_code )
260 ),
261
262 TP_fast_assign(
263 tp_assign(exception, exception)
264 tp_assign(has_error, has_error)
265 tp_assign(error_code, error_code)
266 ),
267
268 TP_printk("%s (0x%x)",
269 __print_symbolic(__entry->exception, kvm_trace_sym_exc),
270 /* FIXME: don't print error_code if not present */
271 __entry->has_error ? __entry->error_code : 0)
272 )
273
274 /*
275 * Tracepoint for page fault.
276 */
277 LTTNG_TRACEPOINT_EVENT(kvm_page_fault,
278 TP_PROTO(unsigned long fault_address, unsigned int error_code),
279 TP_ARGS(fault_address, error_code),
280
281 TP_STRUCT__entry(
282 __field( unsigned long, fault_address )
283 __field( unsigned int, error_code )
284 ),
285
286 TP_fast_assign(
287 tp_assign(fault_address, fault_address)
288 tp_assign(error_code, error_code)
289 ),
290
291 TP_printk("address %lx error_code %x",
292 __entry->fault_address, __entry->error_code)
293 )
294
295 /*
296 * Tracepoint for guest MSR access.
297 */
298 LTTNG_TRACEPOINT_EVENT(kvm_msr,
299 TP_PROTO(unsigned write, u32 ecx, u64 data, bool exception),
300 TP_ARGS(write, ecx, data, exception),
301
302 TP_STRUCT__entry(
303 __field( unsigned, write )
304 __field( u32, ecx )
305 __field( u64, data )
306 __field( u8, exception )
307 ),
308
309 TP_fast_assign(
310 tp_assign(write, write)
311 tp_assign(ecx, ecx)
312 tp_assign(data, data)
313 tp_assign(exception, exception)
314 ),
315
316 TP_printk("msr_%s %x = 0x%llx%s",
317 __entry->write ? "write" : "read",
318 __entry->ecx, __entry->data,
319 __entry->exception ? " (#GP)" : "")
320 )
321
322 #define trace_kvm_msr_read(ecx, data) trace_kvm_msr(0, ecx, data, false)
323 #define trace_kvm_msr_write(ecx, data) trace_kvm_msr(1, ecx, data, false)
324 #define trace_kvm_msr_read_ex(ecx) trace_kvm_msr(0, ecx, 0, true)
325 #define trace_kvm_msr_write_ex(ecx, data) trace_kvm_msr(1, ecx, data, true)
326
327 /*
328 * Tracepoint for guest CR access.
329 */
330 LTTNG_TRACEPOINT_EVENT(kvm_cr,
331 TP_PROTO(unsigned int rw, unsigned int cr, unsigned long val),
332 TP_ARGS(rw, cr, val),
333
334 TP_STRUCT__entry(
335 __field( unsigned int, rw )
336 __field( unsigned int, cr )
337 __field( unsigned long, val )
338 ),
339
340 TP_fast_assign(
341 tp_assign(rw, rw)
342 tp_assign(cr, cr)
343 tp_assign(val, val)
344 ),
345
346 TP_printk("cr_%s %x = 0x%lx",
347 __entry->rw ? "write" : "read",
348 __entry->cr, __entry->val)
349 )
350
351 #define trace_kvm_cr_read(cr, val) trace_kvm_cr(0, cr, val)
352 #define trace_kvm_cr_write(cr, val) trace_kvm_cr(1, cr, val)
353
354 LTTNG_TRACEPOINT_EVENT(kvm_pic_set_irq,
355 TP_PROTO(__u8 chip, __u8 pin, __u8 elcr, __u8 imr, bool coalesced),
356 TP_ARGS(chip, pin, elcr, imr, coalesced),
357
358 TP_STRUCT__entry(
359 __field( __u8, chip )
360 __field( __u8, pin )
361 __field( __u8, elcr )
362 __field( __u8, imr )
363 __field( bool, coalesced )
364 ),
365
366 TP_fast_assign(
367 tp_assign(chip, chip)
368 tp_assign(pin, pin)
369 tp_assign(elcr, elcr)
370 tp_assign(imr, imr)
371 tp_assign(coalesced, coalesced)
372 ),
373
374 TP_printk("chip %u pin %u (%s%s)%s",
375 __entry->chip, __entry->pin,
376 (__entry->elcr & (1 << __entry->pin)) ? "level":"edge",
377 (__entry->imr & (1 << __entry->pin)) ? "|masked":"",
378 __entry->coalesced ? " (coalesced)" : "")
379 )
380
381 #define kvm_apic_dst_shorthand \
382 {0x0, "dst"}, \
383 {0x1, "self"}, \
384 {0x2, "all"}, \
385 {0x3, "all-but-self"}
386
387 LTTNG_TRACEPOINT_EVENT(kvm_apic_ipi,
388 TP_PROTO(__u32 icr_low, __u32 dest_id),
389 TP_ARGS(icr_low, dest_id),
390
391 TP_STRUCT__entry(
392 __field( __u32, icr_low )
393 __field( __u32, dest_id )
394 ),
395
396 TP_fast_assign(
397 tp_assign(icr_low, icr_low)
398 tp_assign(dest_id, dest_id)
399 ),
400
401 TP_printk("dst %x vec %u (%s|%s|%s|%s|%s)",
402 __entry->dest_id, (u8)__entry->icr_low,
403 __print_symbolic((__entry->icr_low >> 8 & 0x7),
404 kvm_deliver_mode),
405 (__entry->icr_low & (1<<11)) ? "logical" : "physical",
406 (__entry->icr_low & (1<<14)) ? "assert" : "de-assert",
407 (__entry->icr_low & (1<<15)) ? "level" : "edge",
408 __print_symbolic((__entry->icr_low >> 18 & 0x3),
409 kvm_apic_dst_shorthand))
410 )
411
412 LTTNG_TRACEPOINT_EVENT(kvm_apic_accept_irq,
413 TP_PROTO(__u32 apicid, __u16 dm, __u8 tm, __u8 vec, bool coalesced),
414 TP_ARGS(apicid, dm, tm, vec, coalesced),
415
416 TP_STRUCT__entry(
417 __field( __u32, apicid )
418 __field( __u16, dm )
419 __field( __u8, tm )
420 __field( __u8, vec )
421 __field( bool, coalesced )
422 ),
423
424 TP_fast_assign(
425 tp_assign(apicid, apicid)
426 tp_assign(dm, dm)
427 tp_assign(tm, tm)
428 tp_assign(vec, vec)
429 tp_assign(coalesced, coalesced)
430 ),
431
432 TP_printk("apicid %x vec %u (%s|%s)%s",
433 __entry->apicid, __entry->vec,
434 __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
435 __entry->tm ? "level" : "edge",
436 __entry->coalesced ? " (coalesced)" : "")
437 )
438
439 LTTNG_TRACEPOINT_EVENT(kvm_eoi,
440 TP_PROTO(struct kvm_lapic *apic, int vector),
441 TP_ARGS(apic, vector),
442
443 TP_STRUCT__entry(
444 __field( __u32, apicid )
445 __field( int, vector )
446 ),
447
448 TP_fast_assign(
449 tp_assign(apicid, apic->vcpu->vcpu_id)
450 tp_assign(vector, vector)
451 ),
452
453 TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
454 )
455
456 LTTNG_TRACEPOINT_EVENT(kvm_pv_eoi,
457 TP_PROTO(struct kvm_lapic *apic, int vector),
458 TP_ARGS(apic, vector),
459
460 TP_STRUCT__entry(
461 __field( __u32, apicid )
462 __field( int, vector )
463 ),
464
465 TP_fast_assign(
466 tp_assign(apicid, apic->vcpu->vcpu_id)
467 tp_assign(vector, vector)
468 ),
469
470 TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
471 )
472
473 /*
474 * Tracepoint for nested VMRUN
475 */
476 LTTNG_TRACEPOINT_EVENT(kvm_nested_vmrun,
477 TP_PROTO(__u64 rip, __u64 vmcb, __u64 nested_rip, __u32 int_ctl,
478 __u32 event_inj, bool npt),
479 TP_ARGS(rip, vmcb, nested_rip, int_ctl, event_inj, npt),
480
481 TP_STRUCT__entry(
482 __field( __u64, rip )
483 __field( __u64, vmcb )
484 __field( __u64, nested_rip )
485 __field( __u32, int_ctl )
486 __field( __u32, event_inj )
487 __field( bool, npt )
488 ),
489
490 TP_fast_assign(
491 tp_assign(rip, rip)
492 tp_assign(vmcb, vmcb)
493 tp_assign(nested_rip, nested_rip)
494 tp_assign(int_ctl, int_ctl)
495 tp_assign(event_inj, event_inj)
496 tp_assign(npt, npt)
497 ),
498
499 TP_printk("rip: 0x%016llx vmcb: 0x%016llx nrip: 0x%016llx int_ctl: 0x%08x "
500 "event_inj: 0x%08x npt: %s",
501 __entry->rip, __entry->vmcb, __entry->nested_rip,
502 __entry->int_ctl, __entry->event_inj,
503 __entry->npt ? "on" : "off")
504 )
505
506 LTTNG_TRACEPOINT_EVENT(kvm_nested_intercepts,
507 TP_PROTO(__u16 cr_read, __u16 cr_write, __u32 exceptions, __u64 intercept),
508 TP_ARGS(cr_read, cr_write, exceptions, intercept),
509
510 TP_STRUCT__entry(
511 __field( __u16, cr_read )
512 __field( __u16, cr_write )
513 __field( __u32, exceptions )
514 __field( __u64, intercept )
515 ),
516
517 TP_fast_assign(
518 tp_assign(cr_read, cr_read)
519 tp_assign(cr_write, cr_write)
520 tp_assign(exceptions, exceptions)
521 tp_assign(intercept, intercept)
522 ),
523
524 TP_printk("cr_read: %04x cr_write: %04x excp: %08x intercept: %016llx",
525 __entry->cr_read, __entry->cr_write, __entry->exceptions,
526 __entry->intercept)
527 )
528 /*
529 * Tracepoint for #VMEXIT while nested
530 */
531 LTTNG_TRACEPOINT_EVENT(kvm_nested_vmexit,
532 TP_PROTO(__u64 rip, __u32 exit_code,
533 __u64 exit_info1, __u64 exit_info2,
534 __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa),
535 TP_ARGS(rip, exit_code, exit_info1, exit_info2,
536 exit_int_info, exit_int_info_err, isa),
537
538 TP_STRUCT__entry(
539 __field( __u64, rip )
540 __field( __u32, exit_code )
541 __field( __u64, exit_info1 )
542 __field( __u64, exit_info2 )
543 __field( __u32, exit_int_info )
544 __field( __u32, exit_int_info_err )
545 __field( __u32, isa )
546 ),
547
548 TP_fast_assign(
549 tp_assign(rip, rip)
550 tp_assign(exit_code, exit_code)
551 tp_assign(exit_info1, exit_info1)
552 tp_assign(exit_info2, exit_info2)
553 tp_assign(exit_int_info, exit_int_info)
554 tp_assign(exit_int_info_err, exit_int_info_err)
555 tp_assign(isa, isa)
556 ),
557 TP_printk("rip: 0x%016llx reason: %s ext_inf1: 0x%016llx "
558 "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x",
559 __entry->rip,
560 (__entry->isa == KVM_ISA_VMX) ?
561 __print_symbolic(__entry->exit_code, VMX_EXIT_REASONS) :
562 __print_symbolic(__entry->exit_code, SVM_EXIT_REASONS),
563 __entry->exit_info1, __entry->exit_info2,
564 __entry->exit_int_info, __entry->exit_int_info_err)
565 )
566
567 /*
568 * Tracepoint for #VMEXIT reinjected to the guest
569 */
570 LTTNG_TRACEPOINT_EVENT(kvm_nested_vmexit_inject,
571 TP_PROTO(__u32 exit_code,
572 __u64 exit_info1, __u64 exit_info2,
573 __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa),
574 TP_ARGS(exit_code, exit_info1, exit_info2,
575 exit_int_info, exit_int_info_err, isa),
576
577 TP_STRUCT__entry(
578 __field( __u32, exit_code )
579 __field( __u64, exit_info1 )
580 __field( __u64, exit_info2 )
581 __field( __u32, exit_int_info )
582 __field( __u32, exit_int_info_err )
583 __field( __u32, isa )
584 ),
585
586 TP_fast_assign(
587 tp_assign(exit_code, exit_code)
588 tp_assign(exit_info1, exit_info1)
589 tp_assign(exit_info2, exit_info2)
590 tp_assign(exit_int_info, exit_int_info)
591 tp_assign(exit_int_info_err, exit_int_info_err)
592 tp_assign(isa, isa)
593 ),
594
595 TP_printk("reason: %s ext_inf1: 0x%016llx "
596 "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x",
597 (__entry->isa == KVM_ISA_VMX) ?
598 __print_symbolic(__entry->exit_code, VMX_EXIT_REASONS) :
599 __print_symbolic(__entry->exit_code, SVM_EXIT_REASONS),
600 __entry->exit_info1, __entry->exit_info2,
601 __entry->exit_int_info, __entry->exit_int_info_err)
602 )
603
604 /*
605 * Tracepoint for nested #vmexit because of interrupt pending
606 */
607 LTTNG_TRACEPOINT_EVENT(kvm_nested_intr_vmexit,
608 TP_PROTO(__u64 rip),
609 TP_ARGS(rip),
610
611 TP_STRUCT__entry(
612 __field( __u64, rip )
613 ),
614
615 TP_fast_assign(
616 tp_assign(rip, rip)
617 ),
618
619 TP_printk("rip: 0x%016llx", __entry->rip)
620 )
621
622 /*
623 * Tracepoint for nested #vmexit because of interrupt pending
624 */
625 LTTNG_TRACEPOINT_EVENT(kvm_invlpga,
626 TP_PROTO(__u64 rip, int asid, u64 address),
627 TP_ARGS(rip, asid, address),
628
629 TP_STRUCT__entry(
630 __field( __u64, rip )
631 __field( int, asid )
632 __field( __u64, address )
633 ),
634
635 TP_fast_assign(
636 tp_assign(rip, rip)
637 tp_assign(asid, asid)
638 tp_assign(address, address)
639 ),
640
641 TP_printk("rip: 0x%016llx asid: %d address: 0x%016llx",
642 __entry->rip, __entry->asid, __entry->address)
643 )
644
645 /*
646 * Tracepoint for nested #vmexit because of interrupt pending
647 */
648 LTTNG_TRACEPOINT_EVENT(kvm_skinit,
649 TP_PROTO(__u64 rip, __u32 slb),
650 TP_ARGS(rip, slb),
651
652 TP_STRUCT__entry(
653 __field( __u64, rip )
654 __field( __u32, slb )
655 ),
656
657 TP_fast_assign(
658 tp_assign(rip, rip)
659 tp_assign(slb, slb)
660 ),
661
662 TP_printk("rip: 0x%016llx slb: 0x%08x",
663 __entry->rip, __entry->slb)
664 )
665
666 #define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
667 #define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
668 #define KVM_EMUL_INSN_F_CS_D (1 << 2)
669 #define KVM_EMUL_INSN_F_CS_L (1 << 3)
670
671 #define kvm_trace_symbol_emul_flags \
672 { 0, "real" }, \
673 { KVM_EMUL_INSN_F_CR0_PE \
674 | KVM_EMUL_INSN_F_EFL_VM, "vm16" }, \
675 { KVM_EMUL_INSN_F_CR0_PE, "prot16" }, \
676 { KVM_EMUL_INSN_F_CR0_PE \
677 | KVM_EMUL_INSN_F_CS_D, "prot32" }, \
678 { KVM_EMUL_INSN_F_CR0_PE \
679 | KVM_EMUL_INSN_F_CS_L, "prot64" }
680
681 #define kei_decode_mode(mode) ({ \
682 u8 flags = 0xff; \
683 switch (mode) { \
684 case X86EMUL_MODE_REAL: \
685 flags = 0; \
686 break; \
687 case X86EMUL_MODE_VM86: \
688 flags = KVM_EMUL_INSN_F_EFL_VM; \
689 break; \
690 case X86EMUL_MODE_PROT16: \
691 flags = KVM_EMUL_INSN_F_CR0_PE; \
692 break; \
693 case X86EMUL_MODE_PROT32: \
694 flags = KVM_EMUL_INSN_F_CR0_PE \
695 | KVM_EMUL_INSN_F_CS_D; \
696 break; \
697 case X86EMUL_MODE_PROT64: \
698 flags = KVM_EMUL_INSN_F_CR0_PE \
699 | KVM_EMUL_INSN_F_CS_L; \
700 break; \
701 } \
702 flags; \
703 })
704
705 LTTNG_TRACEPOINT_EVENT(kvm_emulate_insn,
706 TP_PROTO(struct kvm_vcpu *vcpu, __u8 failed),
707 TP_ARGS(vcpu, failed),
708
709 TP_STRUCT__entry(
710 __field( __u64, rip )
711 __field( __u32, csbase )
712 __field( __u8, len )
713 __array( __u8, insn, 15 )
714 __field( __u8, flags )
715 __field( __u8, failed )
716 ),
717
718 TP_fast_assign(
719 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0))
720 tp_assign(rip, vcpu->arch.emulate_ctxt.decode.fetch.start)
721 tp_assign(csbase, kvm_x86_ops->get_segment_base(vcpu, VCPU_SREG_CS))
722 tp_assign(len, vcpu->arch.emulate_ctxt.decode.eip
723 - vcpu->arch.emulate_ctxt.decode.fetch.start)
724 tp_memcpy(insn,
725 vcpu->arch.emulate_ctxt.decode.fetch.data,
726 15)
727 #elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0))
728 tp_assign(rip, vcpu->arch.emulate_ctxt.fetch.start)
729 tp_assign(csbase, kvm_x86_ops->get_segment_base(vcpu, VCPU_SREG_CS))
730 tp_assign(len, vcpu->arch.emulate_ctxt._eip
731 - vcpu->arch.emulate_ctxt.fetch.start)
732 tp_memcpy(insn,
733 vcpu->arch.emulate_ctxt.fetch.data,
734 15)
735 #else
736 tp_assign(rip, vcpu->arch.emulate_ctxt._eip -
737 (vcpu->arch.emulate_ctxt.fetch.ptr -
738 vcpu->arch.emulate_ctxt.fetch.data))
739 tp_assign(csbase, kvm_x86_ops->get_segment_base(vcpu, VCPU_SREG_CS))
740 tp_assign(len, vcpu->arch.emulate_ctxt.fetch.ptr -
741 vcpu->arch.emulate_ctxt.fetch.data)
742 tp_memcpy(insn,
743 vcpu->arch.emulate_ctxt.fetch.data,
744 15)
745 #endif
746 tp_assign(flags, kei_decode_mode(vcpu->arch.emulate_ctxt.mode))
747 tp_assign(failed, failed)
748 ),
749
750 TP_printk("%x:%llx:%s (%s)%s",
751 __entry->csbase, __entry->rip,
752 __print_hex(__entry->insn, __entry->len),
753 __print_symbolic(__entry->flags,
754 kvm_trace_symbol_emul_flags),
755 __entry->failed ? " failed" : ""
756 )
757 )
758
759 #define trace_kvm_emulate_insn_start(vcpu) trace_kvm_emulate_insn(vcpu, 0)
760 #define trace_kvm_emulate_insn_failed(vcpu) trace_kvm_emulate_insn(vcpu, 1)
761
762 LTTNG_TRACEPOINT_EVENT(
763 vcpu_match_mmio,
764 TP_PROTO(gva_t gva, gpa_t gpa, bool write, bool gpa_match),
765 TP_ARGS(gva, gpa, write, gpa_match),
766
767 TP_STRUCT__entry(
768 __field(gva_t, gva)
769 __field(gpa_t, gpa)
770 __field(bool, write)
771 __field(bool, gpa_match)
772 ),
773
774 TP_fast_assign(
775 tp_assign(gva, gva)
776 tp_assign(gpa, gpa)
777 tp_assign(write, write)
778 tp_assign(gpa_match, gpa_match)
779 ),
780
781 TP_printk("gva %#lx gpa %#llx %s %s", __entry->gva, __entry->gpa,
782 __entry->write ? "Write" : "Read",
783 __entry->gpa_match ? "GPA" : "GVA")
784 )
785
786 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0))
787 LTTNG_TRACEPOINT_EVENT(kvm_write_tsc_offset,
788 TP_PROTO(unsigned int vcpu_id, __u64 previous_tsc_offset,
789 __u64 next_tsc_offset),
790 TP_ARGS(vcpu_id, previous_tsc_offset, next_tsc_offset),
791
792 TP_STRUCT__entry(
793 __field( unsigned int, vcpu_id )
794 __field( __u64, previous_tsc_offset )
795 __field( __u64, next_tsc_offset )
796 ),
797
798 TP_fast_assign(
799 tp_assign(vcpu_id, vcpu_id)
800 tp_assign(previous_tsc_offset, previous_tsc_offset)
801 tp_assign(next_tsc_offset, next_tsc_offset)
802 ),
803
804 TP_printk("vcpu=%u prev=%llu next=%llu", __entry->vcpu_id,
805 __entry->previous_tsc_offset, __entry->next_tsc_offset)
806 )
807 #endif
808
809 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
810 #ifdef CONFIG_X86_64
811
812 #define host_clocks \
813 {VCLOCK_NONE, "none"}, \
814 {VCLOCK_TSC, "tsc"}, \
815 {VCLOCK_HPET, "hpet"} \
816
817 LTTNG_TRACEPOINT_EVENT(kvm_update_master_clock,
818 TP_PROTO(bool use_master_clock, unsigned int host_clock, bool offset_matched),
819 TP_ARGS(use_master_clock, host_clock, offset_matched),
820
821 TP_STRUCT__entry(
822 __field( bool, use_master_clock )
823 __field( unsigned int, host_clock )
824 __field( bool, offset_matched )
825 ),
826
827 TP_fast_assign(
828 tp_assign(use_master_clock, use_master_clock)
829 tp_assign(host_clock, host_clock)
830 tp_assign(offset_matched, offset_matched)
831 ),
832
833 TP_printk("masterclock %d hostclock %s offsetmatched %u",
834 __entry->use_master_clock,
835 __print_symbolic(__entry->host_clock, host_clocks),
836 __entry->offset_matched)
837 )
838
839 LTTNG_TRACEPOINT_EVENT(kvm_track_tsc,
840 TP_PROTO(unsigned int vcpu_id, unsigned int nr_matched,
841 unsigned int online_vcpus, bool use_master_clock,
842 unsigned int host_clock),
843 TP_ARGS(vcpu_id, nr_matched, online_vcpus, use_master_clock,
844 host_clock),
845
846 TP_STRUCT__entry(
847 __field( unsigned int, vcpu_id )
848 __field( unsigned int, nr_vcpus_matched_tsc )
849 __field( unsigned int, online_vcpus )
850 __field( bool, use_master_clock )
851 __field( unsigned int, host_clock )
852 ),
853
854 TP_fast_assign(
855 tp_assign(vcpu_id, vcpu_id)
856 tp_assign(nr_vcpus_matched_tsc, nr_matched)
857 tp_assign(online_vcpus, online_vcpus)
858 tp_assign(use_master_clock, use_master_clock)
859 tp_assign(host_clock, host_clock)
860 ),
861
862 TP_printk("vcpu_id %u masterclock %u offsetmatched %u nr_online %u"
863 " hostclock %s",
864 __entry->vcpu_id, __entry->use_master_clock,
865 __entry->nr_vcpus_matched_tsc, __entry->online_vcpus,
866 __print_symbolic(__entry->host_clock, host_clocks))
867 )
868
869 #endif /* CONFIG_X86_64 */
870 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0) */
871
872 #endif /* LTTNG_TRACE_KVM_H */
873
874 #undef TRACE_INCLUDE_PATH
875 #define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module/arch/x86/kvm
876 #undef TRACE_INCLUDE_FILE
877 #define TRACE_INCLUDE_FILE trace
878
879 /* This part must be outside protection */
880 #include "../../../../../../probes/define_trace.h"
This page took 0.045751 seconds and 3 git commands to generate.