1 /* SPDX-License-Identifier: GPL-2.0 */
2 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
5 #include <linux/tracepoint.h>
8 #include <asm/clocksource.h>
9 #include <asm/pvclock-abi.h>
12 #define TRACE_SYSTEM kvm
15 * Tracepoint for guest mode entry.
17 TRACE_EVENT(kvm_entry,
18 TP_PROTO(unsigned int vcpu_id),
22 __field( unsigned int, vcpu_id )
26 __entry->vcpu_id = vcpu_id;
29 TP_printk("vcpu %u", __entry->vcpu_id)
33 * Tracepoint for hypercall.
35 TRACE_EVENT(kvm_hypercall,
36 TP_PROTO(unsigned long nr, unsigned long a0, unsigned long a1,
37 unsigned long a2, unsigned long a3),
38 TP_ARGS(nr, a0, a1, a2, a3),
41 __field( unsigned long, nr )
42 __field( unsigned long, a0 )
43 __field( unsigned long, a1 )
44 __field( unsigned long, a2 )
45 __field( unsigned long, a3 )
56 TP_printk("nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx",
57 __entry->nr, __entry->a0, __entry->a1, __entry->a2,
62 * Tracepoint for hypercall.
64 TRACE_EVENT(kvm_hv_hypercall,
65 TP_PROTO(__u16 code, bool fast, __u16 rep_cnt, __u16 rep_idx,
66 __u64 ingpa, __u64 outgpa),
67 TP_ARGS(code, fast, rep_cnt, rep_idx, ingpa, outgpa),
70 __field( __u16, rep_cnt )
71 __field( __u16, rep_idx )
72 __field( __u64, ingpa )
73 __field( __u64, outgpa )
74 __field( __u16, code )
79 __entry->rep_cnt = rep_cnt;
80 __entry->rep_idx = rep_idx;
81 __entry->ingpa = ingpa;
82 __entry->outgpa = outgpa;
87 TP_printk("code 0x%x %s cnt 0x%x idx 0x%x in 0x%llx out 0x%llx",
88 __entry->code, __entry->fast ? "fast" : "slow",
89 __entry->rep_cnt, __entry->rep_idx, __entry->ingpa,
101 TP_PROTO(unsigned int rw, unsigned int port, unsigned int size,
102 unsigned int count, void *data),
103 TP_ARGS(rw, port, size, count, data),
106 __field( unsigned int, rw )
107 __field( unsigned int, port )
108 __field( unsigned int, size )
109 __field( unsigned int, count )
110 __field( unsigned int, val )
115 __entry->port = port;
116 __entry->size = size;
117 __entry->count = count;
119 __entry->val = *(unsigned char *)data;
121 __entry->val = *(unsigned short *)data;
123 __entry->val = *(unsigned int *)data;
126 TP_printk("pio_%s at 0x%x size %d count %d val 0x%x %s",
127 __entry->rw ? "write" : "read",
128 __entry->port, __entry->size, __entry->count, __entry->val,
129 __entry->count > 1 ? "(...)" : "")
133 * Tracepoint for fast mmio.
135 TRACE_EVENT(kvm_fast_mmio,
147 TP_printk("fast mmio at gpa 0x%llx", __entry->gpa)
151 * Tracepoint for cpuid.
153 TRACE_EVENT(kvm_cpuid,
154 TP_PROTO(unsigned int function, unsigned int index, unsigned long rax,
155 unsigned long rbx, unsigned long rcx, unsigned long rdx,
156 bool found, bool used_max_basic),
157 TP_ARGS(function, index, rax, rbx, rcx, rdx, found, used_max_basic),
160 __field( unsigned int, function )
161 __field( unsigned int, index )
162 __field( unsigned long, rax )
163 __field( unsigned long, rbx )
164 __field( unsigned long, rcx )
165 __field( unsigned long, rdx )
166 __field( bool, found )
167 __field( bool, used_max_basic )
171 __entry->function = function;
172 __entry->index = index;
177 __entry->found = found;
178 __entry->used_max_basic = used_max_basic;
181 TP_printk("func %x idx %x rax %lx rbx %lx rcx %lx rdx %lx, cpuid entry %s%s",
182 __entry->function, __entry->index, __entry->rax,
183 __entry->rbx, __entry->rcx, __entry->rdx,
184 __entry->found ? "found" : "not found",
185 __entry->used_max_basic ? ", used max basic" : "")
188 #define AREG(x) { APIC_##x, "APIC_" #x }
190 #define kvm_trace_symbol_apic \
191 AREG(ID), AREG(LVR), AREG(TASKPRI), AREG(ARBPRI), AREG(PROCPRI), \
192 AREG(EOI), AREG(RRR), AREG(LDR), AREG(DFR), AREG(SPIV), AREG(ISR), \
193 AREG(TMR), AREG(IRR), AREG(ESR), AREG(ICR), AREG(ICR2), AREG(LVTT), \
194 AREG(LVTTHMR), AREG(LVTPC), AREG(LVT0), AREG(LVT1), AREG(LVTERR), \
195 AREG(TMICT), AREG(TMCCT), AREG(TDCR), AREG(SELF_IPI), AREG(EFEAT), \
198 * Tracepoint for apic access.
200 TRACE_EVENT(kvm_apic,
201 TP_PROTO(unsigned int rw, unsigned int reg, unsigned int val),
202 TP_ARGS(rw, reg, val),
205 __field( unsigned int, rw )
206 __field( unsigned int, reg )
207 __field( unsigned int, val )
216 TP_printk("apic_%s %s = 0x%x",
217 __entry->rw ? "write" : "read",
218 __print_symbolic(__entry->reg, kvm_trace_symbol_apic),
222 #define trace_kvm_apic_read(reg, val) trace_kvm_apic(0, reg, val)
223 #define trace_kvm_apic_write(reg, val) trace_kvm_apic(1, reg, val)
225 #define KVM_ISA_VMX 1
226 #define KVM_ISA_SVM 2
228 #define kvm_print_exit_reason(exit_reason, isa) \
229 (isa == KVM_ISA_VMX) ? \
230 __print_symbolic(exit_reason & 0xffff, VMX_EXIT_REASONS) : \
231 __print_symbolic(exit_reason, SVM_EXIT_REASONS), \
232 (isa == KVM_ISA_VMX && exit_reason & ~0xffff) ? " " : "", \
233 (isa == KVM_ISA_VMX) ? \
234 __print_flags(exit_reason & ~0xffff, " ", VMX_EXIT_REASON_FLAGS) : ""
237 * Tracepoint for kvm guest exit:
239 TRACE_EVENT(kvm_exit,
240 TP_PROTO(unsigned int exit_reason, struct kvm_vcpu *vcpu, u32 isa),
241 TP_ARGS(exit_reason, vcpu, isa),
244 __field( unsigned int, exit_reason )
245 __field( unsigned long, guest_rip )
247 __field( u64, info1 )
248 __field( u64, info2 )
249 __field( unsigned int, vcpu_id )
253 __entry->exit_reason = exit_reason;
254 __entry->guest_rip = kvm_rip_read(vcpu);
256 __entry->vcpu_id = vcpu->vcpu_id;
257 kvm_x86_ops.get_exit_info(vcpu, &__entry->info1,
261 TP_printk("vcpu %u reason %s%s%s rip 0x%lx info %llx %llx",
263 kvm_print_exit_reason(__entry->exit_reason, __entry->isa),
264 __entry->guest_rip, __entry->info1, __entry->info2)
268 * Tracepoint for kvm interrupt injection:
270 TRACE_EVENT(kvm_inj_virq,
271 TP_PROTO(unsigned int irq),
275 __field( unsigned int, irq )
282 TP_printk("irq %u", __entry->irq)
285 #define EXS(x) { x##_VECTOR, "#" #x }
287 #define kvm_trace_sym_exc \
288 EXS(DE), EXS(DB), EXS(BP), EXS(OF), EXS(BR), EXS(UD), EXS(NM), \
289 EXS(DF), EXS(TS), EXS(NP), EXS(SS), EXS(GP), EXS(PF), \
290 EXS(MF), EXS(AC), EXS(MC)
293 * Tracepoint for kvm interrupt injection:
295 TRACE_EVENT(kvm_inj_exception,
296 TP_PROTO(unsigned exception, bool has_error, unsigned error_code),
297 TP_ARGS(exception, has_error, error_code),
300 __field( u8, exception )
301 __field( u8, has_error )
302 __field( u32, error_code )
306 __entry->exception = exception;
307 __entry->has_error = has_error;
308 __entry->error_code = error_code;
311 TP_printk("%s (0x%x)",
312 __print_symbolic(__entry->exception, kvm_trace_sym_exc),
313 /* FIXME: don't print error_code if not present */
314 __entry->has_error ? __entry->error_code : 0)
318 * Tracepoint for page fault.
320 TRACE_EVENT(kvm_page_fault,
321 TP_PROTO(unsigned long fault_address, unsigned int error_code),
322 TP_ARGS(fault_address, error_code),
325 __field( unsigned long, fault_address )
326 __field( unsigned int, error_code )
330 __entry->fault_address = fault_address;
331 __entry->error_code = error_code;
334 TP_printk("address %lx error_code %x",
335 __entry->fault_address, __entry->error_code)
339 * Tracepoint for guest MSR access.
342 TP_PROTO(unsigned write, u32 ecx, u64 data, bool exception),
343 TP_ARGS(write, ecx, data, exception),
346 __field( unsigned, write )
349 __field( u8, exception )
353 __entry->write = write;
355 __entry->data = data;
356 __entry->exception = exception;
359 TP_printk("msr_%s %x = 0x%llx%s",
360 __entry->write ? "write" : "read",
361 __entry->ecx, __entry->data,
362 __entry->exception ? " (#GP)" : "")
365 #define trace_kvm_msr_read(ecx, data) trace_kvm_msr(0, ecx, data, false)
366 #define trace_kvm_msr_write(ecx, data) trace_kvm_msr(1, ecx, data, false)
367 #define trace_kvm_msr_read_ex(ecx) trace_kvm_msr(0, ecx, 0, true)
368 #define trace_kvm_msr_write_ex(ecx, data) trace_kvm_msr(1, ecx, data, true)
371 * Tracepoint for guest CR access.
374 TP_PROTO(unsigned int rw, unsigned int cr, unsigned long val),
375 TP_ARGS(rw, cr, val),
378 __field( unsigned int, rw )
379 __field( unsigned int, cr )
380 __field( unsigned long, val )
389 TP_printk("cr_%s %x = 0x%lx",
390 __entry->rw ? "write" : "read",
391 __entry->cr, __entry->val)
394 #define trace_kvm_cr_read(cr, val) trace_kvm_cr(0, cr, val)
395 #define trace_kvm_cr_write(cr, val) trace_kvm_cr(1, cr, val)
397 TRACE_EVENT(kvm_pic_set_irq,
398 TP_PROTO(__u8 chip, __u8 pin, __u8 elcr, __u8 imr, bool coalesced),
399 TP_ARGS(chip, pin, elcr, imr, coalesced),
402 __field( __u8, chip )
404 __field( __u8, elcr )
406 __field( bool, coalesced )
410 __entry->chip = chip;
412 __entry->elcr = elcr;
414 __entry->coalesced = coalesced;
417 TP_printk("chip %u pin %u (%s%s)%s",
418 __entry->chip, __entry->pin,
419 (__entry->elcr & (1 << __entry->pin)) ? "level":"edge",
420 (__entry->imr & (1 << __entry->pin)) ? "|masked":"",
421 __entry->coalesced ? " (coalesced)" : "")
424 #define kvm_apic_dst_shorthand \
428 {0x3, "all-but-self"}
430 TRACE_EVENT(kvm_apic_ipi,
431 TP_PROTO(__u32 icr_low, __u32 dest_id),
432 TP_ARGS(icr_low, dest_id),
435 __field( __u32, icr_low )
436 __field( __u32, dest_id )
440 __entry->icr_low = icr_low;
441 __entry->dest_id = dest_id;
444 TP_printk("dst %x vec %u (%s|%s|%s|%s|%s)",
445 __entry->dest_id, (u8)__entry->icr_low,
446 __print_symbolic((__entry->icr_low >> 8 & 0x7),
448 (__entry->icr_low & (1<<11)) ? "logical" : "physical",
449 (__entry->icr_low & (1<<14)) ? "assert" : "de-assert",
450 (__entry->icr_low & (1<<15)) ? "level" : "edge",
451 __print_symbolic((__entry->icr_low >> 18 & 0x3),
452 kvm_apic_dst_shorthand))
455 TRACE_EVENT(kvm_apic_accept_irq,
456 TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
457 TP_ARGS(apicid, dm, tm, vec),
460 __field( __u32, apicid )
467 __entry->apicid = apicid;
473 TP_printk("apicid %x vec %u (%s|%s)",
474 __entry->apicid, __entry->vec,
475 __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
476 __entry->tm ? "level" : "edge")
480 TP_PROTO(struct kvm_lapic *apic, int vector),
481 TP_ARGS(apic, vector),
484 __field( __u32, apicid )
485 __field( int, vector )
489 __entry->apicid = apic->vcpu->vcpu_id;
490 __entry->vector = vector;
493 TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
496 TRACE_EVENT(kvm_pv_eoi,
497 TP_PROTO(struct kvm_lapic *apic, int vector),
498 TP_ARGS(apic, vector),
501 __field( __u32, apicid )
502 __field( int, vector )
506 __entry->apicid = apic->vcpu->vcpu_id;
507 __entry->vector = vector;
510 TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
514 * Tracepoint for nested VMRUN
516 TRACE_EVENT(kvm_nested_vmrun,
517 TP_PROTO(__u64 rip, __u64 vmcb, __u64 nested_rip, __u32 int_ctl,
518 __u32 event_inj, bool npt),
519 TP_ARGS(rip, vmcb, nested_rip, int_ctl, event_inj, npt),
522 __field( __u64, rip )
523 __field( __u64, vmcb )
524 __field( __u64, nested_rip )
525 __field( __u32, int_ctl )
526 __field( __u32, event_inj )
532 __entry->vmcb = vmcb;
533 __entry->nested_rip = nested_rip;
534 __entry->int_ctl = int_ctl;
535 __entry->event_inj = event_inj;
539 TP_printk("rip: 0x%016llx vmcb: 0x%016llx nrip: 0x%016llx int_ctl: 0x%08x "
540 "event_inj: 0x%08x npt: %s",
541 __entry->rip, __entry->vmcb, __entry->nested_rip,
542 __entry->int_ctl, __entry->event_inj,
543 __entry->npt ? "on" : "off")
546 TRACE_EVENT(kvm_nested_intercepts,
547 TP_PROTO(__u16 cr_read, __u16 cr_write, __u32 exceptions,
548 __u32 intercept1, __u32 intercept2, __u32 intercept3),
549 TP_ARGS(cr_read, cr_write, exceptions, intercept1,
550 intercept2, intercept3),
553 __field( __u16, cr_read )
554 __field( __u16, cr_write )
555 __field( __u32, exceptions )
556 __field( __u32, intercept1 )
557 __field( __u32, intercept2 )
558 __field( __u32, intercept3 )
562 __entry->cr_read = cr_read;
563 __entry->cr_write = cr_write;
564 __entry->exceptions = exceptions;
565 __entry->intercept1 = intercept1;
566 __entry->intercept2 = intercept2;
567 __entry->intercept3 = intercept3;
570 TP_printk("cr_read: %04x cr_write: %04x excp: %08x "
571 "intercepts: %08x %08x %08x",
572 __entry->cr_read, __entry->cr_write, __entry->exceptions,
573 __entry->intercept1, __entry->intercept2, __entry->intercept3)
576 * Tracepoint for #VMEXIT while nested
578 TRACE_EVENT(kvm_nested_vmexit,
579 TP_PROTO(__u64 rip, __u32 exit_code,
580 __u64 exit_info1, __u64 exit_info2,
581 __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa),
582 TP_ARGS(rip, exit_code, exit_info1, exit_info2,
583 exit_int_info, exit_int_info_err, isa),
586 __field( __u64, rip )
587 __field( __u32, exit_code )
588 __field( __u64, exit_info1 )
589 __field( __u64, exit_info2 )
590 __field( __u32, exit_int_info )
591 __field( __u32, exit_int_info_err )
592 __field( __u32, isa )
597 __entry->exit_code = exit_code;
598 __entry->exit_info1 = exit_info1;
599 __entry->exit_info2 = exit_info2;
600 __entry->exit_int_info = exit_int_info;
601 __entry->exit_int_info_err = exit_int_info_err;
604 TP_printk("rip: 0x%016llx reason: %s%s%s ext_inf1: 0x%016llx "
605 "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x",
607 kvm_print_exit_reason(__entry->exit_code, __entry->isa),
608 __entry->exit_info1, __entry->exit_info2,
609 __entry->exit_int_info, __entry->exit_int_info_err)
613 * Tracepoint for #VMEXIT reinjected to the guest
615 TRACE_EVENT(kvm_nested_vmexit_inject,
616 TP_PROTO(__u32 exit_code,
617 __u64 exit_info1, __u64 exit_info2,
618 __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa),
619 TP_ARGS(exit_code, exit_info1, exit_info2,
620 exit_int_info, exit_int_info_err, isa),
623 __field( __u32, exit_code )
624 __field( __u64, exit_info1 )
625 __field( __u64, exit_info2 )
626 __field( __u32, exit_int_info )
627 __field( __u32, exit_int_info_err )
628 __field( __u32, isa )
632 __entry->exit_code = exit_code;
633 __entry->exit_info1 = exit_info1;
634 __entry->exit_info2 = exit_info2;
635 __entry->exit_int_info = exit_int_info;
636 __entry->exit_int_info_err = exit_int_info_err;
640 TP_printk("reason: %s%s%s ext_inf1: 0x%016llx "
641 "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x",
642 kvm_print_exit_reason(__entry->exit_code, __entry->isa),
643 __entry->exit_info1, __entry->exit_info2,
644 __entry->exit_int_info, __entry->exit_int_info_err)
648 * Tracepoint for nested #vmexit because of interrupt pending
650 TRACE_EVENT(kvm_nested_intr_vmexit,
655 __field( __u64, rip )
662 TP_printk("rip: 0x%016llx", __entry->rip)
666 * Tracepoint for nested #vmexit because of interrupt pending
668 TRACE_EVENT(kvm_invlpga,
669 TP_PROTO(__u64 rip, int asid, u64 address),
670 TP_ARGS(rip, asid, address),
673 __field( __u64, rip )
675 __field( __u64, address )
680 __entry->asid = asid;
681 __entry->address = address;
684 TP_printk("rip: 0x%016llx asid: %d address: 0x%016llx",
685 __entry->rip, __entry->asid, __entry->address)
689 * Tracepoint for nested #vmexit because of interrupt pending
691 TRACE_EVENT(kvm_skinit,
692 TP_PROTO(__u64 rip, __u32 slb),
696 __field( __u64, rip )
697 __field( __u32, slb )
705 TP_printk("rip: 0x%016llx slb: 0x%08x",
706 __entry->rip, __entry->slb)
709 #define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
710 #define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
711 #define KVM_EMUL_INSN_F_CS_D (1 << 2)
712 #define KVM_EMUL_INSN_F_CS_L (1 << 3)
714 #define kvm_trace_symbol_emul_flags \
716 { KVM_EMUL_INSN_F_CR0_PE \
717 | KVM_EMUL_INSN_F_EFL_VM, "vm16" }, \
718 { KVM_EMUL_INSN_F_CR0_PE, "prot16" }, \
719 { KVM_EMUL_INSN_F_CR0_PE \
720 | KVM_EMUL_INSN_F_CS_D, "prot32" }, \
721 { KVM_EMUL_INSN_F_CR0_PE \
722 | KVM_EMUL_INSN_F_CS_L, "prot64" }
724 #define kei_decode_mode(mode) ({ \
727 case X86EMUL_MODE_REAL: \
730 case X86EMUL_MODE_VM86: \
731 flags = KVM_EMUL_INSN_F_EFL_VM; \
733 case X86EMUL_MODE_PROT16: \
734 flags = KVM_EMUL_INSN_F_CR0_PE; \
736 case X86EMUL_MODE_PROT32: \
737 flags = KVM_EMUL_INSN_F_CR0_PE \
738 | KVM_EMUL_INSN_F_CS_D; \
740 case X86EMUL_MODE_PROT64: \
741 flags = KVM_EMUL_INSN_F_CR0_PE \
742 | KVM_EMUL_INSN_F_CS_L; \
748 TRACE_EVENT(kvm_emulate_insn,
749 TP_PROTO(struct kvm_vcpu *vcpu, __u8 failed),
750 TP_ARGS(vcpu, failed),
753 __field( __u64, rip )
754 __field( __u32, csbase )
756 __array( __u8, insn, 15 )
757 __field( __u8, flags )
758 __field( __u8, failed )
762 __entry->csbase = kvm_x86_ops.get_segment_base(vcpu, VCPU_SREG_CS);
763 __entry->len = vcpu->arch.emulate_ctxt->fetch.ptr
764 - vcpu->arch.emulate_ctxt->fetch.data;
765 __entry->rip = vcpu->arch.emulate_ctxt->_eip - __entry->len;
766 memcpy(__entry->insn,
767 vcpu->arch.emulate_ctxt->fetch.data,
769 __entry->flags = kei_decode_mode(vcpu->arch.emulate_ctxt->mode);
770 __entry->failed = failed;
773 TP_printk("%x:%llx:%s (%s)%s",
774 __entry->csbase, __entry->rip,
775 __print_hex(__entry->insn, __entry->len),
776 __print_symbolic(__entry->flags,
777 kvm_trace_symbol_emul_flags),
778 __entry->failed ? " failed" : ""
782 #define trace_kvm_emulate_insn_start(vcpu) trace_kvm_emulate_insn(vcpu, 0)
783 #define trace_kvm_emulate_insn_failed(vcpu) trace_kvm_emulate_insn(vcpu, 1)
787 TP_PROTO(gva_t gva, gpa_t gpa, bool write, bool gpa_match),
788 TP_ARGS(gva, gpa, write, gpa_match),
794 __field(bool, gpa_match)
800 __entry->write = write;
801 __entry->gpa_match = gpa_match
804 TP_printk("gva %#lx gpa %#llx %s %s", __entry->gva, __entry->gpa,
805 __entry->write ? "Write" : "Read",
806 __entry->gpa_match ? "GPA" : "GVA")
809 TRACE_EVENT(kvm_write_tsc_offset,
810 TP_PROTO(unsigned int vcpu_id, __u64 previous_tsc_offset,
811 __u64 next_tsc_offset),
812 TP_ARGS(vcpu_id, previous_tsc_offset, next_tsc_offset),
815 __field( unsigned int, vcpu_id )
816 __field( __u64, previous_tsc_offset )
817 __field( __u64, next_tsc_offset )
821 __entry->vcpu_id = vcpu_id;
822 __entry->previous_tsc_offset = previous_tsc_offset;
823 __entry->next_tsc_offset = next_tsc_offset;
826 TP_printk("vcpu=%u prev=%llu next=%llu", __entry->vcpu_id,
827 __entry->previous_tsc_offset, __entry->next_tsc_offset)
832 #define host_clocks \
833 {VDSO_CLOCKMODE_NONE, "none"}, \
834 {VDSO_CLOCKMODE_TSC, "tsc"} \
836 TRACE_EVENT(kvm_update_master_clock,
837 TP_PROTO(bool use_master_clock, unsigned int host_clock, bool offset_matched),
838 TP_ARGS(use_master_clock, host_clock, offset_matched),
841 __field( bool, use_master_clock )
842 __field( unsigned int, host_clock )
843 __field( bool, offset_matched )
847 __entry->use_master_clock = use_master_clock;
848 __entry->host_clock = host_clock;
849 __entry->offset_matched = offset_matched;
852 TP_printk("masterclock %d hostclock %s offsetmatched %u",
853 __entry->use_master_clock,
854 __print_symbolic(__entry->host_clock, host_clocks),
855 __entry->offset_matched)
858 TRACE_EVENT(kvm_track_tsc,
859 TP_PROTO(unsigned int vcpu_id, unsigned int nr_matched,
860 unsigned int online_vcpus, bool use_master_clock,
861 unsigned int host_clock),
862 TP_ARGS(vcpu_id, nr_matched, online_vcpus, use_master_clock,
866 __field( unsigned int, vcpu_id )
867 __field( unsigned int, nr_vcpus_matched_tsc )
868 __field( unsigned int, online_vcpus )
869 __field( bool, use_master_clock )
870 __field( unsigned int, host_clock )
874 __entry->vcpu_id = vcpu_id;
875 __entry->nr_vcpus_matched_tsc = nr_matched;
876 __entry->online_vcpus = online_vcpus;
877 __entry->use_master_clock = use_master_clock;
878 __entry->host_clock = host_clock;
881 TP_printk("vcpu_id %u masterclock %u offsetmatched %u nr_online %u"
883 __entry->vcpu_id, __entry->use_master_clock,
884 __entry->nr_vcpus_matched_tsc, __entry->online_vcpus,
885 __print_symbolic(__entry->host_clock, host_clocks))
888 #endif /* CONFIG_X86_64 */
891 * Tracepoint for PML full VMEXIT.
893 TRACE_EVENT(kvm_pml_full,
894 TP_PROTO(unsigned int vcpu_id),
898 __field( unsigned int, vcpu_id )
902 __entry->vcpu_id = vcpu_id;
905 TP_printk("vcpu %d: PML full", __entry->vcpu_id)
908 TRACE_EVENT(kvm_ple_window_update,
909 TP_PROTO(unsigned int vcpu_id, unsigned int new, unsigned int old),
910 TP_ARGS(vcpu_id, new, old),
913 __field( unsigned int, vcpu_id )
914 __field( unsigned int, new )
915 __field( unsigned int, old )
919 __entry->vcpu_id = vcpu_id;
924 TP_printk("vcpu %u old %u new %u (%s)",
925 __entry->vcpu_id, __entry->old, __entry->new,
926 __entry->old < __entry->new ? "growed" : "shrinked")
929 TRACE_EVENT(kvm_pvclock_update,
930 TP_PROTO(unsigned int vcpu_id, struct pvclock_vcpu_time_info *pvclock),
931 TP_ARGS(vcpu_id, pvclock),
934 __field( unsigned int, vcpu_id )
935 __field( __u32, version )
936 __field( __u64, tsc_timestamp )
937 __field( __u64, system_time )
938 __field( __u32, tsc_to_system_mul )
939 __field( __s8, tsc_shift )
940 __field( __u8, flags )
944 __entry->vcpu_id = vcpu_id;
945 __entry->version = pvclock->version;
946 __entry->tsc_timestamp = pvclock->tsc_timestamp;
947 __entry->system_time = pvclock->system_time;
948 __entry->tsc_to_system_mul = pvclock->tsc_to_system_mul;
949 __entry->tsc_shift = pvclock->tsc_shift;
950 __entry->flags = pvclock->flags;
953 TP_printk("vcpu_id %u, pvclock { version %u, tsc_timestamp 0x%llx, "
954 "system_time 0x%llx, tsc_to_system_mul 0x%x, tsc_shift %d, "
958 __entry->tsc_timestamp,
959 __entry->system_time,
960 __entry->tsc_to_system_mul,
965 TRACE_EVENT(kvm_wait_lapic_expire,
966 TP_PROTO(unsigned int vcpu_id, s64 delta),
967 TP_ARGS(vcpu_id, delta),
970 __field( unsigned int, vcpu_id )
971 __field( s64, delta )
975 __entry->vcpu_id = vcpu_id;
976 __entry->delta = delta;
979 TP_printk("vcpu %u: delta %lld (%s)",
982 __entry->delta < 0 ? "early" : "late")
985 TRACE_EVENT(kvm_enter_smm,
986 TP_PROTO(unsigned int vcpu_id, u64 smbase, bool entering),
987 TP_ARGS(vcpu_id, smbase, entering),
990 __field( unsigned int, vcpu_id )
991 __field( u64, smbase )
992 __field( bool, entering )
996 __entry->vcpu_id = vcpu_id;
997 __entry->smbase = smbase;
998 __entry->entering = entering;
1001 TP_printk("vcpu %u: %s SMM, smbase 0x%llx",
1003 __entry->entering ? "entering" : "leaving",
1008 * Tracepoint for VT-d posted-interrupts.
1010 TRACE_EVENT(kvm_pi_irte_update,
1011 TP_PROTO(unsigned int host_irq, unsigned int vcpu_id,
1012 unsigned int gsi, unsigned int gvec,
1013 u64 pi_desc_addr, bool set),
1014 TP_ARGS(host_irq, vcpu_id, gsi, gvec, pi_desc_addr, set),
1017 __field( unsigned int, host_irq )
1018 __field( unsigned int, vcpu_id )
1019 __field( unsigned int, gsi )
1020 __field( unsigned int, gvec )
1021 __field( u64, pi_desc_addr )
1022 __field( bool, set )
1026 __entry->host_irq = host_irq;
1027 __entry->vcpu_id = vcpu_id;
1029 __entry->gvec = gvec;
1030 __entry->pi_desc_addr = pi_desc_addr;
1034 TP_printk("VT-d PI is %s for irq %u, vcpu %u, gsi: 0x%x, "
1035 "gvec: 0x%x, pi_desc_addr: 0x%llx",
1036 __entry->set ? "enabled and being updated" : "disabled",
1041 __entry->pi_desc_addr)
1045 * Tracepoint for kvm_hv_notify_acked_sint.
1047 TRACE_EVENT(kvm_hv_notify_acked_sint,
1048 TP_PROTO(int vcpu_id, u32 sint),
1049 TP_ARGS(vcpu_id, sint),
1052 __field(int, vcpu_id)
1057 __entry->vcpu_id = vcpu_id;
1058 __entry->sint = sint;
1061 TP_printk("vcpu_id %d sint %u", __entry->vcpu_id, __entry->sint)
1065 * Tracepoint for synic_set_irq.
1067 TRACE_EVENT(kvm_hv_synic_set_irq,
1068 TP_PROTO(int vcpu_id, u32 sint, int vector, int ret),
1069 TP_ARGS(vcpu_id, sint, vector, ret),
1072 __field(int, vcpu_id)
1074 __field(int, vector)
1079 __entry->vcpu_id = vcpu_id;
1080 __entry->sint = sint;
1081 __entry->vector = vector;
1085 TP_printk("vcpu_id %d sint %u vector %d ret %d",
1086 __entry->vcpu_id, __entry->sint, __entry->vector,
1091 * Tracepoint for kvm_hv_synic_send_eoi.
1093 TRACE_EVENT(kvm_hv_synic_send_eoi,
1094 TP_PROTO(int vcpu_id, int vector),
1095 TP_ARGS(vcpu_id, vector),
1098 __field(int, vcpu_id)
1100 __field(int, vector)
1105 __entry->vcpu_id = vcpu_id;
1106 __entry->vector = vector;
1109 TP_printk("vcpu_id %d vector %d", __entry->vcpu_id, __entry->vector)
1113 * Tracepoint for synic_set_msr.
1115 TRACE_EVENT(kvm_hv_synic_set_msr,
1116 TP_PROTO(int vcpu_id, u32 msr, u64 data, bool host),
1117 TP_ARGS(vcpu_id, msr, data, host),
1120 __field(int, vcpu_id)
1127 __entry->vcpu_id = vcpu_id;
1129 __entry->data = data;
1130 __entry->host = host
1133 TP_printk("vcpu_id %d msr 0x%x data 0x%llx host %d",
1134 __entry->vcpu_id, __entry->msr, __entry->data, __entry->host)
1138 * Tracepoint for stimer_set_config.
1140 TRACE_EVENT(kvm_hv_stimer_set_config,
1141 TP_PROTO(int vcpu_id, int timer_index, u64 config, bool host),
1142 TP_ARGS(vcpu_id, timer_index, config, host),
1145 __field(int, vcpu_id)
1146 __field(int, timer_index)
1147 __field(u64, config)
1152 __entry->vcpu_id = vcpu_id;
1153 __entry->timer_index = timer_index;
1154 __entry->config = config;
1155 __entry->host = host;
1158 TP_printk("vcpu_id %d timer %d config 0x%llx host %d",
1159 __entry->vcpu_id, __entry->timer_index, __entry->config,
1164 * Tracepoint for stimer_set_count.
1166 TRACE_EVENT(kvm_hv_stimer_set_count,
1167 TP_PROTO(int vcpu_id, int timer_index, u64 count, bool host),
1168 TP_ARGS(vcpu_id, timer_index, count, host),
1171 __field(int, vcpu_id)
1172 __field(int, timer_index)
1178 __entry->vcpu_id = vcpu_id;
1179 __entry->timer_index = timer_index;
1180 __entry->count = count;
1181 __entry->host = host;
1184 TP_printk("vcpu_id %d timer %d count %llu host %d",
1185 __entry->vcpu_id, __entry->timer_index, __entry->count,
1190 * Tracepoint for stimer_start(periodic timer case).
1192 TRACE_EVENT(kvm_hv_stimer_start_periodic,
1193 TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 exp_time),
1194 TP_ARGS(vcpu_id, timer_index, time_now, exp_time),
1197 __field(int, vcpu_id)
1198 __field(int, timer_index)
1199 __field(u64, time_now)
1200 __field(u64, exp_time)
1204 __entry->vcpu_id = vcpu_id;
1205 __entry->timer_index = timer_index;
1206 __entry->time_now = time_now;
1207 __entry->exp_time = exp_time;
1210 TP_printk("vcpu_id %d timer %d time_now %llu exp_time %llu",
1211 __entry->vcpu_id, __entry->timer_index, __entry->time_now,
1216 * Tracepoint for stimer_start(one-shot timer case).
1218 TRACE_EVENT(kvm_hv_stimer_start_one_shot,
1219 TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 count),
1220 TP_ARGS(vcpu_id, timer_index, time_now, count),
1223 __field(int, vcpu_id)
1224 __field(int, timer_index)
1225 __field(u64, time_now)
1230 __entry->vcpu_id = vcpu_id;
1231 __entry->timer_index = timer_index;
1232 __entry->time_now = time_now;
1233 __entry->count = count;
1236 TP_printk("vcpu_id %d timer %d time_now %llu count %llu",
1237 __entry->vcpu_id, __entry->timer_index, __entry->time_now,
1242 * Tracepoint for stimer_timer_callback.
1244 TRACE_EVENT(kvm_hv_stimer_callback,
1245 TP_PROTO(int vcpu_id, int timer_index),
1246 TP_ARGS(vcpu_id, timer_index),
1249 __field(int, vcpu_id)
1250 __field(int, timer_index)
1254 __entry->vcpu_id = vcpu_id;
1255 __entry->timer_index = timer_index;
1258 TP_printk("vcpu_id %d timer %d",
1259 __entry->vcpu_id, __entry->timer_index)
1263 * Tracepoint for stimer_expiration.
1265 TRACE_EVENT(kvm_hv_stimer_expiration,
1266 TP_PROTO(int vcpu_id, int timer_index, int direct, int msg_send_result),
1267 TP_ARGS(vcpu_id, timer_index, direct, msg_send_result),
1270 __field(int, vcpu_id)
1271 __field(int, timer_index)
1272 __field(int, direct)
1273 __field(int, msg_send_result)
1277 __entry->vcpu_id = vcpu_id;
1278 __entry->timer_index = timer_index;
1279 __entry->direct = direct;
1280 __entry->msg_send_result = msg_send_result;
1283 TP_printk("vcpu_id %d timer %d direct %d send result %d",
1284 __entry->vcpu_id, __entry->timer_index,
1285 __entry->direct, __entry->msg_send_result)
1289 * Tracepoint for stimer_cleanup.
1291 TRACE_EVENT(kvm_hv_stimer_cleanup,
1292 TP_PROTO(int vcpu_id, int timer_index),
1293 TP_ARGS(vcpu_id, timer_index),
1296 __field(int, vcpu_id)
1297 __field(int, timer_index)
1301 __entry->vcpu_id = vcpu_id;
1302 __entry->timer_index = timer_index;
1305 TP_printk("vcpu_id %d timer %d",
1306 __entry->vcpu_id, __entry->timer_index)
1309 TRACE_EVENT(kvm_apicv_update_request,
1310 TP_PROTO(bool activate, unsigned long bit),
1311 TP_ARGS(activate, bit),
1314 __field(bool, activate)
1315 __field(unsigned long, bit)
1319 __entry->activate = activate;
1323 TP_printk("%s bit=%lu",
1324 __entry->activate ? "activate" : "deactivate",
1329 * Tracepoint for AMD AVIC
1331 TRACE_EVENT(kvm_avic_incomplete_ipi,
1332 TP_PROTO(u32 vcpu, u32 icrh, u32 icrl, u32 id, u32 index),
1333 TP_ARGS(vcpu, icrh, icrl, id, index),
1344 __entry->vcpu = vcpu;
1345 __entry->icrh = icrh;
1346 __entry->icrl = icrl;
1348 __entry->index = index;
1351 TP_printk("vcpu=%u, icrh:icrl=%#010x:%08x, id=%u, index=%u",
1352 __entry->vcpu, __entry->icrh, __entry->icrl,
1353 __entry->id, __entry->index)
1356 TRACE_EVENT(kvm_avic_unaccelerated_access,
1357 TP_PROTO(u32 vcpu, u32 offset, bool ft, bool rw, u32 vec),
1358 TP_ARGS(vcpu, offset, ft, rw, vec),
1362 __field(u32, offset)
1369 __entry->vcpu = vcpu;
1370 __entry->offset = offset;
1376 TP_printk("vcpu=%u, offset=%#x(%s), %s, %s, vec=%#x",
1379 __print_symbolic(__entry->offset, kvm_trace_symbol_apic),
1380 __entry->ft ? "trap" : "fault",
1381 __entry->rw ? "write" : "read",
1385 TRACE_EVENT(kvm_avic_ga_log,
1386 TP_PROTO(u32 vmid, u32 vcpuid),
1387 TP_ARGS(vmid, vcpuid),
1391 __field(u32, vcpuid)
1395 __entry->vmid = vmid;
1396 __entry->vcpuid = vcpuid;
1399 TP_printk("vmid=%u, vcpuid=%u",
1400 __entry->vmid, __entry->vcpuid)
1403 TRACE_EVENT(kvm_hv_timer_state,
1404 TP_PROTO(unsigned int vcpu_id, unsigned int hv_timer_in_use),
1405 TP_ARGS(vcpu_id, hv_timer_in_use),
1407 __field(unsigned int, vcpu_id)
1408 __field(unsigned int, hv_timer_in_use)
1411 __entry->vcpu_id = vcpu_id;
1412 __entry->hv_timer_in_use = hv_timer_in_use;
1414 TP_printk("vcpu_id %x hv_timer %x",
1416 __entry->hv_timer_in_use)
1420 * Tracepoint for kvm_hv_flush_tlb.
1422 TRACE_EVENT(kvm_hv_flush_tlb,
1423 TP_PROTO(u64 processor_mask, u64 address_space, u64 flags),
1424 TP_ARGS(processor_mask, address_space, flags),
1427 __field(u64, processor_mask)
1428 __field(u64, address_space)
1433 __entry->processor_mask = processor_mask;
1434 __entry->address_space = address_space;
1435 __entry->flags = flags;
1438 TP_printk("processor_mask 0x%llx address_space 0x%llx flags 0x%llx",
1439 __entry->processor_mask, __entry->address_space,
1444 * Tracepoint for kvm_hv_flush_tlb_ex.
1446 TRACE_EVENT(kvm_hv_flush_tlb_ex,
1447 TP_PROTO(u64 valid_bank_mask, u64 format, u64 address_space, u64 flags),
1448 TP_ARGS(valid_bank_mask, format, address_space, flags),
1451 __field(u64, valid_bank_mask)
1452 __field(u64, format)
1453 __field(u64, address_space)
1458 __entry->valid_bank_mask = valid_bank_mask;
1459 __entry->format = format;
1460 __entry->address_space = address_space;
1461 __entry->flags = flags;
1464 TP_printk("valid_bank_mask 0x%llx format 0x%llx "
1465 "address_space 0x%llx flags 0x%llx",
1466 __entry->valid_bank_mask, __entry->format,
1467 __entry->address_space, __entry->flags)
1471 * Tracepoints for kvm_hv_send_ipi.
1473 TRACE_EVENT(kvm_hv_send_ipi,
1474 TP_PROTO(u32 vector, u64 processor_mask),
1475 TP_ARGS(vector, processor_mask),
1478 __field(u32, vector)
1479 __field(u64, processor_mask)
1483 __entry->vector = vector;
1484 __entry->processor_mask = processor_mask;
1487 TP_printk("vector %x processor_mask 0x%llx",
1488 __entry->vector, __entry->processor_mask)
1491 TRACE_EVENT(kvm_hv_send_ipi_ex,
1492 TP_PROTO(u32 vector, u64 format, u64 valid_bank_mask),
1493 TP_ARGS(vector, format, valid_bank_mask),
1496 __field(u32, vector)
1497 __field(u64, format)
1498 __field(u64, valid_bank_mask)
1502 __entry->vector = vector;
1503 __entry->format = format;
1504 __entry->valid_bank_mask = valid_bank_mask;
1507 TP_printk("vector %x format %llx valid_bank_mask 0x%llx",
1508 __entry->vector, __entry->format,
1509 __entry->valid_bank_mask)
1512 TRACE_EVENT(kvm_pv_tlb_flush,
1513 TP_PROTO(unsigned int vcpu_id, bool need_flush_tlb),
1514 TP_ARGS(vcpu_id, need_flush_tlb),
1517 __field( unsigned int, vcpu_id )
1518 __field( bool, need_flush_tlb )
1522 __entry->vcpu_id = vcpu_id;
1523 __entry->need_flush_tlb = need_flush_tlb;
1526 TP_printk("vcpu %u need_flush_tlb %s", __entry->vcpu_id,
1527 __entry->need_flush_tlb ? "true" : "false")
1531 * Tracepoint for failed nested VMX VM-Enter.
1533 TRACE_EVENT(kvm_nested_vmenter_failed,
1534 TP_PROTO(const char *msg, u32 err),
1538 __field(const char *, msg)
1547 TP_printk("%s%s", __entry->msg, !__entry->err ? "" :
1548 __print_symbolic(__entry->err, VMX_VMENTER_INSTRUCTION_ERRORS))
1552 * Tracepoint for syndbg_set_msr.
1554 TRACE_EVENT(kvm_hv_syndbg_set_msr,
1555 TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
1556 TP_ARGS(vcpu_id, vp_index, msr, data),
1559 __field(int, vcpu_id)
1560 __field(u32, vp_index)
1566 __entry->vcpu_id = vcpu_id;
1567 __entry->vp_index = vp_index;
1569 __entry->data = data;
1572 TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
1573 __entry->vcpu_id, __entry->vp_index, __entry->msr,
1578 * Tracepoint for syndbg_get_msr.
1580 TRACE_EVENT(kvm_hv_syndbg_get_msr,
1581 TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
1582 TP_ARGS(vcpu_id, vp_index, msr, data),
1585 __field(int, vcpu_id)
1586 __field(u32, vp_index)
1592 __entry->vcpu_id = vcpu_id;
1593 __entry->vp_index = vp_index;
1595 __entry->data = data;
1598 TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
1599 __entry->vcpu_id, __entry->vp_index, __entry->msr,
1602 #endif /* _TRACE_KVM_H */
1604 #undef TRACE_INCLUDE_PATH
1605 #define TRACE_INCLUDE_PATH ../../arch/x86/kvm
1606 #undef TRACE_INCLUDE_FILE
1607 #define TRACE_INCLUDE_FILE trace
1609 /* This part must be outside protection */
1610 #include <trace/define_trace.h>