KVM: x86: Print error code in exception injection tracepoint iff valid
[linux-2.6-microblaze.git] / arch / x86 / kvm / trace.h
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 #include <asm/vmx.h>
7 #include <asm/svm.h>
8 #include <asm/clocksource.h>
9 #include <asm/pvclock-abi.h>
10
11 #undef TRACE_SYSTEM
12 #define TRACE_SYSTEM kvm
13
14 /*
15  * Tracepoint for guest mode entry.
16  */
17 TRACE_EVENT(kvm_entry,
18         TP_PROTO(struct kvm_vcpu *vcpu),
19         TP_ARGS(vcpu),
20
21         TP_STRUCT__entry(
22                 __field(        unsigned int,   vcpu_id         )
23                 __field(        unsigned long,  rip             )
24         ),
25
26         TP_fast_assign(
27                 __entry->vcpu_id        = vcpu->vcpu_id;
28                 __entry->rip            = kvm_rip_read(vcpu);
29         ),
30
31         TP_printk("vcpu %u, rip 0x%lx", __entry->vcpu_id, __entry->rip)
32 );
33
34 /*
35  * Tracepoint for hypercall.
36  */
37 TRACE_EVENT(kvm_hypercall,
38         TP_PROTO(unsigned long nr, unsigned long a0, unsigned long a1,
39                  unsigned long a2, unsigned long a3),
40         TP_ARGS(nr, a0, a1, a2, a3),
41
42         TP_STRUCT__entry(
43                 __field(        unsigned long,  nr              )
44                 __field(        unsigned long,  a0              )
45                 __field(        unsigned long,  a1              )
46                 __field(        unsigned long,  a2              )
47                 __field(        unsigned long,  a3              )
48         ),
49
50         TP_fast_assign(
51                 __entry->nr             = nr;
52                 __entry->a0             = a0;
53                 __entry->a1             = a1;
54                 __entry->a2             = a2;
55                 __entry->a3             = a3;
56         ),
57
58         TP_printk("nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx",
59                  __entry->nr, __entry->a0, __entry->a1,  __entry->a2,
60                  __entry->a3)
61 );
62
63 /*
64  * Tracepoint for hypercall.
65  */
66 TRACE_EVENT(kvm_hv_hypercall,
67         TP_PROTO(__u16 code, bool fast,  __u16 var_cnt, __u16 rep_cnt,
68                  __u16 rep_idx, __u64 ingpa, __u64 outgpa),
69         TP_ARGS(code, fast, var_cnt, rep_cnt, rep_idx, ingpa, outgpa),
70
71         TP_STRUCT__entry(
72                 __field(        __u16,          rep_cnt         )
73                 __field(        __u16,          rep_idx         )
74                 __field(        __u64,          ingpa           )
75                 __field(        __u64,          outgpa          )
76                 __field(        __u16,          code            )
77                 __field(        __u16,          var_cnt         )
78                 __field(        bool,           fast            )
79         ),
80
81         TP_fast_assign(
82                 __entry->rep_cnt        = rep_cnt;
83                 __entry->rep_idx        = rep_idx;
84                 __entry->ingpa          = ingpa;
85                 __entry->outgpa         = outgpa;
86                 __entry->code           = code;
87                 __entry->var_cnt        = var_cnt;
88                 __entry->fast           = fast;
89         ),
90
91         TP_printk("code 0x%x %s var_cnt 0x%x rep_cnt 0x%x idx 0x%x in 0x%llx out 0x%llx",
92                   __entry->code, __entry->fast ? "fast" : "slow",
93                   __entry->var_cnt, __entry->rep_cnt, __entry->rep_idx,
94                   __entry->ingpa, __entry->outgpa)
95 );
96
97 TRACE_EVENT(kvm_hv_hypercall_done,
98         TP_PROTO(u64 result),
99         TP_ARGS(result),
100
101         TP_STRUCT__entry(
102                 __field(__u64, result)
103         ),
104
105         TP_fast_assign(
106                 __entry->result = result;
107         ),
108
109         TP_printk("result 0x%llx", __entry->result)
110 );
111
112 /*
113  * Tracepoint for Xen hypercall.
114  */
115 TRACE_EVENT(kvm_xen_hypercall,
116         TP_PROTO(unsigned long nr, unsigned long a0, unsigned long a1,
117                  unsigned long a2, unsigned long a3, unsigned long a4,
118                  unsigned long a5),
119             TP_ARGS(nr, a0, a1, a2, a3, a4, a5),
120
121         TP_STRUCT__entry(
122                 __field(unsigned long, nr)
123                 __field(unsigned long, a0)
124                 __field(unsigned long, a1)
125                 __field(unsigned long, a2)
126                 __field(unsigned long, a3)
127                 __field(unsigned long, a4)
128                 __field(unsigned long, a5)
129         ),
130
131         TP_fast_assign(
132                 __entry->nr = nr;
133                 __entry->a0 = a0;
134                 __entry->a1 = a1;
135                 __entry->a2 = a2;
136                 __entry->a3 = a3;
137                 __entry->a4 = a4;
138                 __entry->a4 = a5;
139         ),
140
141         TP_printk("nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx a4 0x%lx a5 %lx",
142                   __entry->nr, __entry->a0, __entry->a1,  __entry->a2,
143                   __entry->a3, __entry->a4, __entry->a5)
144 );
145
146
147
148 /*
149  * Tracepoint for PIO.
150  */
151
152 #define KVM_PIO_IN   0
153 #define KVM_PIO_OUT  1
154
155 TRACE_EVENT(kvm_pio,
156         TP_PROTO(unsigned int rw, unsigned int port, unsigned int size,
157                  unsigned int count, void *data),
158         TP_ARGS(rw, port, size, count, data),
159
160         TP_STRUCT__entry(
161                 __field(        unsigned int,   rw              )
162                 __field(        unsigned int,   port            )
163                 __field(        unsigned int,   size            )
164                 __field(        unsigned int,   count           )
165                 __field(        unsigned int,   val             )
166         ),
167
168         TP_fast_assign(
169                 __entry->rw             = rw;
170                 __entry->port           = port;
171                 __entry->size           = size;
172                 __entry->count          = count;
173                 if (size == 1)
174                         __entry->val    = *(unsigned char *)data;
175                 else if (size == 2)
176                         __entry->val    = *(unsigned short *)data;
177                 else
178                         __entry->val    = *(unsigned int *)data;
179         ),
180
181         TP_printk("pio_%s at 0x%x size %d count %d val 0x%x %s",
182                   __entry->rw ? "write" : "read",
183                   __entry->port, __entry->size, __entry->count, __entry->val,
184                   __entry->count > 1 ? "(...)" : "")
185 );
186
187 /*
188  * Tracepoint for fast mmio.
189  */
190 TRACE_EVENT(kvm_fast_mmio,
191         TP_PROTO(u64 gpa),
192         TP_ARGS(gpa),
193
194         TP_STRUCT__entry(
195                 __field(u64,    gpa)
196         ),
197
198         TP_fast_assign(
199                 __entry->gpa            = gpa;
200         ),
201
202         TP_printk("fast mmio at gpa 0x%llx", __entry->gpa)
203 );
204
205 /*
206  * Tracepoint for cpuid.
207  */
208 TRACE_EVENT(kvm_cpuid,
209         TP_PROTO(unsigned int function, unsigned int index, unsigned long rax,
210                  unsigned long rbx, unsigned long rcx, unsigned long rdx,
211                  bool found, bool used_max_basic),
212         TP_ARGS(function, index, rax, rbx, rcx, rdx, found, used_max_basic),
213
214         TP_STRUCT__entry(
215                 __field(        unsigned int,   function        )
216                 __field(        unsigned int,   index           )
217                 __field(        unsigned long,  rax             )
218                 __field(        unsigned long,  rbx             )
219                 __field(        unsigned long,  rcx             )
220                 __field(        unsigned long,  rdx             )
221                 __field(        bool,           found           )
222                 __field(        bool,           used_max_basic  )
223         ),
224
225         TP_fast_assign(
226                 __entry->function       = function;
227                 __entry->index          = index;
228                 __entry->rax            = rax;
229                 __entry->rbx            = rbx;
230                 __entry->rcx            = rcx;
231                 __entry->rdx            = rdx;
232                 __entry->found          = found;
233                 __entry->used_max_basic = used_max_basic;
234         ),
235
236         TP_printk("func %x idx %x rax %lx rbx %lx rcx %lx rdx %lx, cpuid entry %s%s",
237                   __entry->function, __entry->index, __entry->rax,
238                   __entry->rbx, __entry->rcx, __entry->rdx,
239                   __entry->found ? "found" : "not found",
240                   __entry->used_max_basic ? ", used max basic" : "")
241 );
242
243 #define AREG(x) { APIC_##x, "APIC_" #x }
244
245 #define kvm_trace_symbol_apic                                               \
246         AREG(ID), AREG(LVR), AREG(TASKPRI), AREG(ARBPRI), AREG(PROCPRI),    \
247         AREG(EOI), AREG(RRR), AREG(LDR), AREG(DFR), AREG(SPIV), AREG(ISR),  \
248         AREG(TMR), AREG(IRR), AREG(ESR), AREG(ICR), AREG(ICR2), AREG(LVTT), \
249         AREG(LVTTHMR), AREG(LVTPC), AREG(LVT0), AREG(LVT1), AREG(LVTERR),   \
250         AREG(TMICT), AREG(TMCCT), AREG(TDCR), AREG(SELF_IPI), AREG(EFEAT),  \
251         AREG(ECTRL)
252 /*
253  * Tracepoint for apic access.
254  */
255 TRACE_EVENT(kvm_apic,
256         TP_PROTO(unsigned int rw, unsigned int reg, u64 val),
257         TP_ARGS(rw, reg, val),
258
259         TP_STRUCT__entry(
260                 __field(        unsigned int,   rw              )
261                 __field(        unsigned int,   reg             )
262                 __field(        u64,            val             )
263         ),
264
265         TP_fast_assign(
266                 __entry->rw             = rw;
267                 __entry->reg            = reg;
268                 __entry->val            = val;
269         ),
270
271         TP_printk("apic_%s %s = 0x%llx",
272                   __entry->rw ? "write" : "read",
273                   __print_symbolic(__entry->reg, kvm_trace_symbol_apic),
274                   __entry->val)
275 );
276
277 #define trace_kvm_apic_read(reg, val)           trace_kvm_apic(0, reg, val)
278 #define trace_kvm_apic_write(reg, val)          trace_kvm_apic(1, reg, val)
279
280 #define KVM_ISA_VMX   1
281 #define KVM_ISA_SVM   2
282
283 #define kvm_print_exit_reason(exit_reason, isa)                         \
284         (isa == KVM_ISA_VMX) ?                                          \
285         __print_symbolic(exit_reason & 0xffff, VMX_EXIT_REASONS) :      \
286         __print_symbolic(exit_reason, SVM_EXIT_REASONS),                \
287         (isa == KVM_ISA_VMX && exit_reason & ~0xffff) ? " " : "",       \
288         (isa == KVM_ISA_VMX) ?                                          \
289         __print_flags(exit_reason & ~0xffff, " ", VMX_EXIT_REASON_FLAGS) : ""
290
291 #define TRACE_EVENT_KVM_EXIT(name)                                           \
292 TRACE_EVENT(name,                                                            \
293         TP_PROTO(struct kvm_vcpu *vcpu, u32 isa),                            \
294         TP_ARGS(vcpu, isa),                                                  \
295                                                                              \
296         TP_STRUCT__entry(                                                    \
297                 __field(        unsigned int,   exit_reason     )            \
298                 __field(        unsigned long,  guest_rip       )            \
299                 __field(        u32,            isa             )            \
300                 __field(        u64,            info1           )            \
301                 __field(        u64,            info2           )            \
302                 __field(        u32,            intr_info       )            \
303                 __field(        u32,            error_code      )            \
304                 __field(        unsigned int,   vcpu_id         )            \
305         ),                                                                   \
306                                                                              \
307         TP_fast_assign(                                                      \
308                 __entry->guest_rip      = kvm_rip_read(vcpu);                \
309                 __entry->isa            = isa;                               \
310                 __entry->vcpu_id        = vcpu->vcpu_id;                     \
311                 static_call(kvm_x86_get_exit_info)(vcpu,                     \
312                                           &__entry->exit_reason,             \
313                                           &__entry->info1,                   \
314                                           &__entry->info2,                   \
315                                           &__entry->intr_info,               \
316                                           &__entry->error_code);             \
317         ),                                                                   \
318                                                                              \
319         TP_printk("vcpu %u reason %s%s%s rip 0x%lx info1 0x%016llx "         \
320                   "info2 0x%016llx intr_info 0x%08x error_code 0x%08x",      \
321                   __entry->vcpu_id,                                          \
322                   kvm_print_exit_reason(__entry->exit_reason, __entry->isa), \
323                   __entry->guest_rip, __entry->info1, __entry->info2,        \
324                   __entry->intr_info, __entry->error_code)                   \
325 )
326
327 /*
328  * Tracepoint for kvm guest exit:
329  */
330 TRACE_EVENT_KVM_EXIT(kvm_exit);
331
332 /*
333  * Tracepoint for kvm interrupt injection:
334  */
335 TRACE_EVENT(kvm_inj_virq,
336         TP_PROTO(unsigned int irq),
337         TP_ARGS(irq),
338
339         TP_STRUCT__entry(
340                 __field(        unsigned int,   irq             )
341         ),
342
343         TP_fast_assign(
344                 __entry->irq            = irq;
345         ),
346
347         TP_printk("irq %u", __entry->irq)
348 );
349
350 #define EXS(x) { x##_VECTOR, "#" #x }
351
352 #define kvm_trace_sym_exc                                               \
353         EXS(DE), EXS(DB), EXS(BP), EXS(OF), EXS(BR), EXS(UD), EXS(NM),  \
354         EXS(DF), EXS(TS), EXS(NP), EXS(SS), EXS(GP), EXS(PF),           \
355         EXS(MF), EXS(AC), EXS(MC)
356
357 /*
358  * Tracepoint for kvm interrupt injection:
359  */
360 TRACE_EVENT(kvm_inj_exception,
361         TP_PROTO(unsigned exception, bool has_error, unsigned error_code,
362                  bool reinjected),
363         TP_ARGS(exception, has_error, error_code, reinjected),
364
365         TP_STRUCT__entry(
366                 __field(        u8,     exception       )
367                 __field(        u8,     has_error       )
368                 __field(        u32,    error_code      )
369                 __field(        bool,   reinjected      )
370         ),
371
372         TP_fast_assign(
373                 __entry->exception      = exception;
374                 __entry->has_error      = has_error;
375                 __entry->error_code     = error_code;
376                 __entry->reinjected     = reinjected;
377         ),
378
379         TP_printk("%s%s%s%s%s",
380                   __print_symbolic(__entry->exception, kvm_trace_sym_exc),
381                   !__entry->has_error ? "" : " (",
382                   !__entry->has_error ? "" : __print_symbolic(__entry->error_code, { }),
383                   !__entry->has_error ? "" : ")",
384                   __entry->reinjected ? " [reinjected]" : "")
385 );
386
387 /*
388  * Tracepoint for page fault.
389  */
390 TRACE_EVENT(kvm_page_fault,
391         TP_PROTO(unsigned long fault_address, unsigned int error_code),
392         TP_ARGS(fault_address, error_code),
393
394         TP_STRUCT__entry(
395                 __field(        unsigned long,  fault_address   )
396                 __field(        unsigned int,   error_code      )
397         ),
398
399         TP_fast_assign(
400                 __entry->fault_address  = fault_address;
401                 __entry->error_code     = error_code;
402         ),
403
404         TP_printk("address %lx error_code %x",
405                   __entry->fault_address, __entry->error_code)
406 );
407
408 /*
409  * Tracepoint for guest MSR access.
410  */
411 TRACE_EVENT(kvm_msr,
412         TP_PROTO(unsigned write, u32 ecx, u64 data, bool exception),
413         TP_ARGS(write, ecx, data, exception),
414
415         TP_STRUCT__entry(
416                 __field(        unsigned,       write           )
417                 __field(        u32,            ecx             )
418                 __field(        u64,            data            )
419                 __field(        u8,             exception       )
420         ),
421
422         TP_fast_assign(
423                 __entry->write          = write;
424                 __entry->ecx            = ecx;
425                 __entry->data           = data;
426                 __entry->exception      = exception;
427         ),
428
429         TP_printk("msr_%s %x = 0x%llx%s",
430                   __entry->write ? "write" : "read",
431                   __entry->ecx, __entry->data,
432                   __entry->exception ? " (#GP)" : "")
433 );
434
435 #define trace_kvm_msr_read(ecx, data)      trace_kvm_msr(0, ecx, data, false)
436 #define trace_kvm_msr_write(ecx, data)     trace_kvm_msr(1, ecx, data, false)
437 #define trace_kvm_msr_read_ex(ecx)         trace_kvm_msr(0, ecx, 0, true)
438 #define trace_kvm_msr_write_ex(ecx, data)  trace_kvm_msr(1, ecx, data, true)
439
440 /*
441  * Tracepoint for guest CR access.
442  */
443 TRACE_EVENT(kvm_cr,
444         TP_PROTO(unsigned int rw, unsigned int cr, unsigned long val),
445         TP_ARGS(rw, cr, val),
446
447         TP_STRUCT__entry(
448                 __field(        unsigned int,   rw              )
449                 __field(        unsigned int,   cr              )
450                 __field(        unsigned long,  val             )
451         ),
452
453         TP_fast_assign(
454                 __entry->rw             = rw;
455                 __entry->cr             = cr;
456                 __entry->val            = val;
457         ),
458
459         TP_printk("cr_%s %x = 0x%lx",
460                   __entry->rw ? "write" : "read",
461                   __entry->cr, __entry->val)
462 );
463
464 #define trace_kvm_cr_read(cr, val)              trace_kvm_cr(0, cr, val)
465 #define trace_kvm_cr_write(cr, val)             trace_kvm_cr(1, cr, val)
466
467 TRACE_EVENT(kvm_pic_set_irq,
468             TP_PROTO(__u8 chip, __u8 pin, __u8 elcr, __u8 imr, bool coalesced),
469             TP_ARGS(chip, pin, elcr, imr, coalesced),
470
471         TP_STRUCT__entry(
472                 __field(        __u8,           chip            )
473                 __field(        __u8,           pin             )
474                 __field(        __u8,           elcr            )
475                 __field(        __u8,           imr             )
476                 __field(        bool,           coalesced       )
477         ),
478
479         TP_fast_assign(
480                 __entry->chip           = chip;
481                 __entry->pin            = pin;
482                 __entry->elcr           = elcr;
483                 __entry->imr            = imr;
484                 __entry->coalesced      = coalesced;
485         ),
486
487         TP_printk("chip %u pin %u (%s%s)%s",
488                   __entry->chip, __entry->pin,
489                   (__entry->elcr & (1 << __entry->pin)) ? "level":"edge",
490                   (__entry->imr & (1 << __entry->pin)) ? "|masked":"",
491                   __entry->coalesced ? " (coalesced)" : "")
492 );
493
494 #define kvm_apic_dst_shorthand          \
495         {0x0, "dst"},                   \
496         {0x1, "self"},                  \
497         {0x2, "all"},                   \
498         {0x3, "all-but-self"}
499
500 TRACE_EVENT(kvm_apic_ipi,
501             TP_PROTO(__u32 icr_low, __u32 dest_id),
502             TP_ARGS(icr_low, dest_id),
503
504         TP_STRUCT__entry(
505                 __field(        __u32,          icr_low         )
506                 __field(        __u32,          dest_id         )
507         ),
508
509         TP_fast_assign(
510                 __entry->icr_low        = icr_low;
511                 __entry->dest_id        = dest_id;
512         ),
513
514         TP_printk("dst %x vec %u (%s|%s|%s|%s|%s)",
515                   __entry->dest_id, (u8)__entry->icr_low,
516                   __print_symbolic((__entry->icr_low >> 8 & 0x7),
517                                    kvm_deliver_mode),
518                   (__entry->icr_low & (1<<11)) ? "logical" : "physical",
519                   (__entry->icr_low & (1<<14)) ? "assert" : "de-assert",
520                   (__entry->icr_low & (1<<15)) ? "level" : "edge",
521                   __print_symbolic((__entry->icr_low >> 18 & 0x3),
522                                    kvm_apic_dst_shorthand))
523 );
524
525 TRACE_EVENT(kvm_apic_accept_irq,
526             TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
527             TP_ARGS(apicid, dm, tm, vec),
528
529         TP_STRUCT__entry(
530                 __field(        __u32,          apicid          )
531                 __field(        __u16,          dm              )
532                 __field(        __u16,          tm              )
533                 __field(        __u8,           vec             )
534         ),
535
536         TP_fast_assign(
537                 __entry->apicid         = apicid;
538                 __entry->dm             = dm;
539                 __entry->tm             = tm;
540                 __entry->vec            = vec;
541         ),
542
543         TP_printk("apicid %x vec %u (%s|%s)",
544                   __entry->apicid, __entry->vec,
545                   __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
546                   __entry->tm ? "level" : "edge")
547 );
548
549 TRACE_EVENT(kvm_eoi,
550             TP_PROTO(struct kvm_lapic *apic, int vector),
551             TP_ARGS(apic, vector),
552
553         TP_STRUCT__entry(
554                 __field(        __u32,          apicid          )
555                 __field(        int,            vector          )
556         ),
557
558         TP_fast_assign(
559                 __entry->apicid         = apic->vcpu->vcpu_id;
560                 __entry->vector         = vector;
561         ),
562
563         TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
564 );
565
566 TRACE_EVENT(kvm_pv_eoi,
567             TP_PROTO(struct kvm_lapic *apic, int vector),
568             TP_ARGS(apic, vector),
569
570         TP_STRUCT__entry(
571                 __field(        __u32,          apicid          )
572                 __field(        int,            vector          )
573         ),
574
575         TP_fast_assign(
576                 __entry->apicid         = apic->vcpu->vcpu_id;
577                 __entry->vector         = vector;
578         ),
579
580         TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
581 );
582
583 /*
584  * Tracepoint for nested VMRUN
585  */
586 TRACE_EVENT(kvm_nested_vmrun,
587             TP_PROTO(__u64 rip, __u64 vmcb, __u64 nested_rip, __u32 int_ctl,
588                      __u32 event_inj, bool npt),
589             TP_ARGS(rip, vmcb, nested_rip, int_ctl, event_inj, npt),
590
591         TP_STRUCT__entry(
592                 __field(        __u64,          rip             )
593                 __field(        __u64,          vmcb            )
594                 __field(        __u64,          nested_rip      )
595                 __field(        __u32,          int_ctl         )
596                 __field(        __u32,          event_inj       )
597                 __field(        bool,           npt             )
598         ),
599
600         TP_fast_assign(
601                 __entry->rip            = rip;
602                 __entry->vmcb           = vmcb;
603                 __entry->nested_rip     = nested_rip;
604                 __entry->int_ctl        = int_ctl;
605                 __entry->event_inj      = event_inj;
606                 __entry->npt            = npt;
607         ),
608
609         TP_printk("rip: 0x%016llx vmcb: 0x%016llx nrip: 0x%016llx int_ctl: 0x%08x "
610                   "event_inj: 0x%08x npt: %s",
611                 __entry->rip, __entry->vmcb, __entry->nested_rip,
612                 __entry->int_ctl, __entry->event_inj,
613                 __entry->npt ? "on" : "off")
614 );
615
616 TRACE_EVENT(kvm_nested_intercepts,
617             TP_PROTO(__u16 cr_read, __u16 cr_write, __u32 exceptions,
618                      __u32 intercept1, __u32 intercept2, __u32 intercept3),
619             TP_ARGS(cr_read, cr_write, exceptions, intercept1,
620                     intercept2, intercept3),
621
622         TP_STRUCT__entry(
623                 __field(        __u16,          cr_read         )
624                 __field(        __u16,          cr_write        )
625                 __field(        __u32,          exceptions      )
626                 __field(        __u32,          intercept1      )
627                 __field(        __u32,          intercept2      )
628                 __field(        __u32,          intercept3      )
629         ),
630
631         TP_fast_assign(
632                 __entry->cr_read        = cr_read;
633                 __entry->cr_write       = cr_write;
634                 __entry->exceptions     = exceptions;
635                 __entry->intercept1     = intercept1;
636                 __entry->intercept2     = intercept2;
637                 __entry->intercept3     = intercept3;
638         ),
639
640         TP_printk("cr_read: %04x cr_write: %04x excp: %08x "
641                   "intercepts: %08x %08x %08x",
642                   __entry->cr_read, __entry->cr_write, __entry->exceptions,
643                   __entry->intercept1, __entry->intercept2, __entry->intercept3)
644 );
645 /*
646  * Tracepoint for #VMEXIT while nested
647  */
648 TRACE_EVENT_KVM_EXIT(kvm_nested_vmexit);
649
650 /*
651  * Tracepoint for #VMEXIT reinjected to the guest
652  */
653 TRACE_EVENT(kvm_nested_vmexit_inject,
654             TP_PROTO(__u32 exit_code,
655                      __u64 exit_info1, __u64 exit_info2,
656                      __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa),
657             TP_ARGS(exit_code, exit_info1, exit_info2,
658                     exit_int_info, exit_int_info_err, isa),
659
660         TP_STRUCT__entry(
661                 __field(        __u32,          exit_code               )
662                 __field(        __u64,          exit_info1              )
663                 __field(        __u64,          exit_info2              )
664                 __field(        __u32,          exit_int_info           )
665                 __field(        __u32,          exit_int_info_err       )
666                 __field(        __u32,          isa                     )
667         ),
668
669         TP_fast_assign(
670                 __entry->exit_code              = exit_code;
671                 __entry->exit_info1             = exit_info1;
672                 __entry->exit_info2             = exit_info2;
673                 __entry->exit_int_info          = exit_int_info;
674                 __entry->exit_int_info_err      = exit_int_info_err;
675                 __entry->isa                    = isa;
676         ),
677
678         TP_printk("reason: %s%s%s ext_inf1: 0x%016llx "
679                   "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x",
680                   kvm_print_exit_reason(__entry->exit_code, __entry->isa),
681                   __entry->exit_info1, __entry->exit_info2,
682                   __entry->exit_int_info, __entry->exit_int_info_err)
683 );
684
685 /*
686  * Tracepoint for nested #vmexit because of interrupt pending
687  */
688 TRACE_EVENT(kvm_nested_intr_vmexit,
689             TP_PROTO(__u64 rip),
690             TP_ARGS(rip),
691
692         TP_STRUCT__entry(
693                 __field(        __u64,  rip     )
694         ),
695
696         TP_fast_assign(
697                 __entry->rip    =       rip
698         ),
699
700         TP_printk("rip: 0x%016llx", __entry->rip)
701 );
702
703 /*
704  * Tracepoint for nested #vmexit because of interrupt pending
705  */
706 TRACE_EVENT(kvm_invlpga,
707             TP_PROTO(__u64 rip, int asid, u64 address),
708             TP_ARGS(rip, asid, address),
709
710         TP_STRUCT__entry(
711                 __field(        __u64,  rip     )
712                 __field(        int,    asid    )
713                 __field(        __u64,  address )
714         ),
715
716         TP_fast_assign(
717                 __entry->rip            =       rip;
718                 __entry->asid           =       asid;
719                 __entry->address        =       address;
720         ),
721
722         TP_printk("rip: 0x%016llx asid: %d address: 0x%016llx",
723                   __entry->rip, __entry->asid, __entry->address)
724 );
725
726 /*
727  * Tracepoint for nested #vmexit because of interrupt pending
728  */
729 TRACE_EVENT(kvm_skinit,
730             TP_PROTO(__u64 rip, __u32 slb),
731             TP_ARGS(rip, slb),
732
733         TP_STRUCT__entry(
734                 __field(        __u64,  rip     )
735                 __field(        __u32,  slb     )
736         ),
737
738         TP_fast_assign(
739                 __entry->rip            =       rip;
740                 __entry->slb            =       slb;
741         ),
742
743         TP_printk("rip: 0x%016llx slb: 0x%08x",
744                   __entry->rip, __entry->slb)
745 );
746
747 #define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
748 #define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
749 #define KVM_EMUL_INSN_F_CS_D   (1 << 2)
750 #define KVM_EMUL_INSN_F_CS_L   (1 << 3)
751
752 #define kvm_trace_symbol_emul_flags                       \
753         { 0,                        "real" },             \
754         { KVM_EMUL_INSN_F_CR0_PE                          \
755           | KVM_EMUL_INSN_F_EFL_VM, "vm16" },             \
756         { KVM_EMUL_INSN_F_CR0_PE,   "prot16" },           \
757         { KVM_EMUL_INSN_F_CR0_PE                          \
758           | KVM_EMUL_INSN_F_CS_D,   "prot32" },           \
759         { KVM_EMUL_INSN_F_CR0_PE                          \
760           | KVM_EMUL_INSN_F_CS_L,   "prot64" }
761
762 #define kei_decode_mode(mode) ({                        \
763         u8 flags = 0xff;                                \
764         switch (mode) {                                 \
765         case X86EMUL_MODE_REAL:                         \
766                 flags = 0;                              \
767                 break;                                  \
768         case X86EMUL_MODE_VM86:                         \
769                 flags = KVM_EMUL_INSN_F_EFL_VM;         \
770                 break;                                  \
771         case X86EMUL_MODE_PROT16:                       \
772                 flags = KVM_EMUL_INSN_F_CR0_PE;         \
773                 break;                                  \
774         case X86EMUL_MODE_PROT32:                       \
775                 flags = KVM_EMUL_INSN_F_CR0_PE          \
776                         | KVM_EMUL_INSN_F_CS_D;         \
777                 break;                                  \
778         case X86EMUL_MODE_PROT64:                       \
779                 flags = KVM_EMUL_INSN_F_CR0_PE          \
780                         | KVM_EMUL_INSN_F_CS_L;         \
781                 break;                                  \
782         }                                               \
783         flags;                                          \
784         })
785
786 TRACE_EVENT(kvm_emulate_insn,
787         TP_PROTO(struct kvm_vcpu *vcpu, __u8 failed),
788         TP_ARGS(vcpu, failed),
789
790         TP_STRUCT__entry(
791                 __field(    __u64, rip                       )
792                 __field(    __u32, csbase                    )
793                 __field(    __u8,  len                       )
794                 __array(    __u8,  insn,    15               )
795                 __field(    __u8,  flags                     )
796                 __field(    __u8,  failed                    )
797                 ),
798
799         TP_fast_assign(
800                 __entry->csbase = static_call(kvm_x86_get_segment_base)(vcpu, VCPU_SREG_CS);
801                 __entry->len = vcpu->arch.emulate_ctxt->fetch.ptr
802                                - vcpu->arch.emulate_ctxt->fetch.data;
803                 __entry->rip = vcpu->arch.emulate_ctxt->_eip - __entry->len;
804                 memcpy(__entry->insn,
805                        vcpu->arch.emulate_ctxt->fetch.data,
806                        15);
807                 __entry->flags = kei_decode_mode(vcpu->arch.emulate_ctxt->mode);
808                 __entry->failed = failed;
809                 ),
810
811         TP_printk("%x:%llx:%s (%s)%s",
812                   __entry->csbase, __entry->rip,
813                   __print_hex(__entry->insn, __entry->len),
814                   __print_symbolic(__entry->flags,
815                                    kvm_trace_symbol_emul_flags),
816                   __entry->failed ? " failed" : ""
817                 )
818         );
819
820 #define trace_kvm_emulate_insn_start(vcpu) trace_kvm_emulate_insn(vcpu, 0)
821 #define trace_kvm_emulate_insn_failed(vcpu) trace_kvm_emulate_insn(vcpu, 1)
822
823 TRACE_EVENT(
824         vcpu_match_mmio,
825         TP_PROTO(gva_t gva, gpa_t gpa, bool write, bool gpa_match),
826         TP_ARGS(gva, gpa, write, gpa_match),
827
828         TP_STRUCT__entry(
829                 __field(gva_t, gva)
830                 __field(gpa_t, gpa)
831                 __field(bool, write)
832                 __field(bool, gpa_match)
833                 ),
834
835         TP_fast_assign(
836                 __entry->gva = gva;
837                 __entry->gpa = gpa;
838                 __entry->write = write;
839                 __entry->gpa_match = gpa_match
840                 ),
841
842         TP_printk("gva %#lx gpa %#llx %s %s", __entry->gva, __entry->gpa,
843                   __entry->write ? "Write" : "Read",
844                   __entry->gpa_match ? "GPA" : "GVA")
845 );
846
847 TRACE_EVENT(kvm_write_tsc_offset,
848         TP_PROTO(unsigned int vcpu_id, __u64 previous_tsc_offset,
849                  __u64 next_tsc_offset),
850         TP_ARGS(vcpu_id, previous_tsc_offset, next_tsc_offset),
851
852         TP_STRUCT__entry(
853                 __field( unsigned int,  vcpu_id                         )
854                 __field(        __u64,  previous_tsc_offset             )
855                 __field(        __u64,  next_tsc_offset                 )
856         ),
857
858         TP_fast_assign(
859                 __entry->vcpu_id                = vcpu_id;
860                 __entry->previous_tsc_offset    = previous_tsc_offset;
861                 __entry->next_tsc_offset        = next_tsc_offset;
862         ),
863
864         TP_printk("vcpu=%u prev=%llu next=%llu", __entry->vcpu_id,
865                   __entry->previous_tsc_offset, __entry->next_tsc_offset)
866 );
867
868 #ifdef CONFIG_X86_64
869
870 #define host_clocks                                     \
871         {VDSO_CLOCKMODE_NONE, "none"},                  \
872         {VDSO_CLOCKMODE_TSC,  "tsc"}                    \
873
874 TRACE_EVENT(kvm_update_master_clock,
875         TP_PROTO(bool use_master_clock, unsigned int host_clock, bool offset_matched),
876         TP_ARGS(use_master_clock, host_clock, offset_matched),
877
878         TP_STRUCT__entry(
879                 __field(                bool,   use_master_clock        )
880                 __field(        unsigned int,   host_clock              )
881                 __field(                bool,   offset_matched          )
882         ),
883
884         TP_fast_assign(
885                 __entry->use_master_clock       = use_master_clock;
886                 __entry->host_clock             = host_clock;
887                 __entry->offset_matched         = offset_matched;
888         ),
889
890         TP_printk("masterclock %d hostclock %s offsetmatched %u",
891                   __entry->use_master_clock,
892                   __print_symbolic(__entry->host_clock, host_clocks),
893                   __entry->offset_matched)
894 );
895
896 TRACE_EVENT(kvm_track_tsc,
897         TP_PROTO(unsigned int vcpu_id, unsigned int nr_matched,
898                  unsigned int online_vcpus, bool use_master_clock,
899                  unsigned int host_clock),
900         TP_ARGS(vcpu_id, nr_matched, online_vcpus, use_master_clock,
901                 host_clock),
902
903         TP_STRUCT__entry(
904                 __field(        unsigned int,   vcpu_id                 )
905                 __field(        unsigned int,   nr_vcpus_matched_tsc    )
906                 __field(        unsigned int,   online_vcpus            )
907                 __field(        bool,           use_master_clock        )
908                 __field(        unsigned int,   host_clock              )
909         ),
910
911         TP_fast_assign(
912                 __entry->vcpu_id                = vcpu_id;
913                 __entry->nr_vcpus_matched_tsc   = nr_matched;
914                 __entry->online_vcpus           = online_vcpus;
915                 __entry->use_master_clock       = use_master_clock;
916                 __entry->host_clock             = host_clock;
917         ),
918
919         TP_printk("vcpu_id %u masterclock %u offsetmatched %u nr_online %u"
920                   " hostclock %s",
921                   __entry->vcpu_id, __entry->use_master_clock,
922                   __entry->nr_vcpus_matched_tsc, __entry->online_vcpus,
923                   __print_symbolic(__entry->host_clock, host_clocks))
924 );
925
926 #endif /* CONFIG_X86_64 */
927
928 /*
929  * Tracepoint for PML full VMEXIT.
930  */
931 TRACE_EVENT(kvm_pml_full,
932         TP_PROTO(unsigned int vcpu_id),
933         TP_ARGS(vcpu_id),
934
935         TP_STRUCT__entry(
936                 __field(        unsigned int,   vcpu_id                 )
937         ),
938
939         TP_fast_assign(
940                 __entry->vcpu_id                = vcpu_id;
941         ),
942
943         TP_printk("vcpu %d: PML full", __entry->vcpu_id)
944 );
945
946 TRACE_EVENT(kvm_ple_window_update,
947         TP_PROTO(unsigned int vcpu_id, unsigned int new, unsigned int old),
948         TP_ARGS(vcpu_id, new, old),
949
950         TP_STRUCT__entry(
951                 __field(        unsigned int,   vcpu_id         )
952                 __field(        unsigned int,       new         )
953                 __field(        unsigned int,       old         )
954         ),
955
956         TP_fast_assign(
957                 __entry->vcpu_id        = vcpu_id;
958                 __entry->new            = new;
959                 __entry->old            = old;
960         ),
961
962         TP_printk("vcpu %u old %u new %u (%s)",
963                   __entry->vcpu_id, __entry->old, __entry->new,
964                   __entry->old < __entry->new ? "growed" : "shrinked")
965 );
966
967 TRACE_EVENT(kvm_pvclock_update,
968         TP_PROTO(unsigned int vcpu_id, struct pvclock_vcpu_time_info *pvclock),
969         TP_ARGS(vcpu_id, pvclock),
970
971         TP_STRUCT__entry(
972                 __field(        unsigned int,   vcpu_id                 )
973                 __field(        __u32,          version                 )
974                 __field(        __u64,          tsc_timestamp           )
975                 __field(        __u64,          system_time             )
976                 __field(        __u32,          tsc_to_system_mul       )
977                 __field(        __s8,           tsc_shift               )
978                 __field(        __u8,           flags                   )
979         ),
980
981         TP_fast_assign(
982                 __entry->vcpu_id           = vcpu_id;
983                 __entry->version           = pvclock->version;
984                 __entry->tsc_timestamp     = pvclock->tsc_timestamp;
985                 __entry->system_time       = pvclock->system_time;
986                 __entry->tsc_to_system_mul = pvclock->tsc_to_system_mul;
987                 __entry->tsc_shift         = pvclock->tsc_shift;
988                 __entry->flags             = pvclock->flags;
989         ),
990
991         TP_printk("vcpu_id %u, pvclock { version %u, tsc_timestamp 0x%llx, "
992                   "system_time 0x%llx, tsc_to_system_mul 0x%x, tsc_shift %d, "
993                   "flags 0x%x }",
994                   __entry->vcpu_id,
995                   __entry->version,
996                   __entry->tsc_timestamp,
997                   __entry->system_time,
998                   __entry->tsc_to_system_mul,
999                   __entry->tsc_shift,
1000                   __entry->flags)
1001 );
1002
1003 TRACE_EVENT(kvm_wait_lapic_expire,
1004         TP_PROTO(unsigned int vcpu_id, s64 delta),
1005         TP_ARGS(vcpu_id, delta),
1006
1007         TP_STRUCT__entry(
1008                 __field(        unsigned int,   vcpu_id         )
1009                 __field(        s64,            delta           )
1010         ),
1011
1012         TP_fast_assign(
1013                 __entry->vcpu_id           = vcpu_id;
1014                 __entry->delta             = delta;
1015         ),
1016
1017         TP_printk("vcpu %u: delta %lld (%s)",
1018                   __entry->vcpu_id,
1019                   __entry->delta,
1020                   __entry->delta < 0 ? "early" : "late")
1021 );
1022
1023 TRACE_EVENT(kvm_smm_transition,
1024         TP_PROTO(unsigned int vcpu_id, u64 smbase, bool entering),
1025         TP_ARGS(vcpu_id, smbase, entering),
1026
1027         TP_STRUCT__entry(
1028                 __field(        unsigned int,   vcpu_id         )
1029                 __field(        u64,            smbase          )
1030                 __field(        bool,           entering        )
1031         ),
1032
1033         TP_fast_assign(
1034                 __entry->vcpu_id        = vcpu_id;
1035                 __entry->smbase         = smbase;
1036                 __entry->entering       = entering;
1037         ),
1038
1039         TP_printk("vcpu %u: %s SMM, smbase 0x%llx",
1040                   __entry->vcpu_id,
1041                   __entry->entering ? "entering" : "leaving",
1042                   __entry->smbase)
1043 );
1044
1045 /*
1046  * Tracepoint for VT-d posted-interrupts.
1047  */
1048 TRACE_EVENT(kvm_pi_irte_update,
1049         TP_PROTO(unsigned int host_irq, unsigned int vcpu_id,
1050                  unsigned int gsi, unsigned int gvec,
1051                  u64 pi_desc_addr, bool set),
1052         TP_ARGS(host_irq, vcpu_id, gsi, gvec, pi_desc_addr, set),
1053
1054         TP_STRUCT__entry(
1055                 __field(        unsigned int,   host_irq        )
1056                 __field(        unsigned int,   vcpu_id         )
1057                 __field(        unsigned int,   gsi             )
1058                 __field(        unsigned int,   gvec            )
1059                 __field(        u64,            pi_desc_addr    )
1060                 __field(        bool,           set             )
1061         ),
1062
1063         TP_fast_assign(
1064                 __entry->host_irq       = host_irq;
1065                 __entry->vcpu_id        = vcpu_id;
1066                 __entry->gsi            = gsi;
1067                 __entry->gvec           = gvec;
1068                 __entry->pi_desc_addr   = pi_desc_addr;
1069                 __entry->set            = set;
1070         ),
1071
1072         TP_printk("VT-d PI is %s for irq %u, vcpu %u, gsi: 0x%x, "
1073                   "gvec: 0x%x, pi_desc_addr: 0x%llx",
1074                   __entry->set ? "enabled and being updated" : "disabled",
1075                   __entry->host_irq,
1076                   __entry->vcpu_id,
1077                   __entry->gsi,
1078                   __entry->gvec,
1079                   __entry->pi_desc_addr)
1080 );
1081
1082 /*
1083  * Tracepoint for kvm_hv_notify_acked_sint.
1084  */
1085 TRACE_EVENT(kvm_hv_notify_acked_sint,
1086         TP_PROTO(int vcpu_id, u32 sint),
1087         TP_ARGS(vcpu_id, sint),
1088
1089         TP_STRUCT__entry(
1090                 __field(int, vcpu_id)
1091                 __field(u32, sint)
1092         ),
1093
1094         TP_fast_assign(
1095                 __entry->vcpu_id = vcpu_id;
1096                 __entry->sint = sint;
1097         ),
1098
1099         TP_printk("vcpu_id %d sint %u", __entry->vcpu_id, __entry->sint)
1100 );
1101
1102 /*
1103  * Tracepoint for synic_set_irq.
1104  */
1105 TRACE_EVENT(kvm_hv_synic_set_irq,
1106         TP_PROTO(int vcpu_id, u32 sint, int vector, int ret),
1107         TP_ARGS(vcpu_id, sint, vector, ret),
1108
1109         TP_STRUCT__entry(
1110                 __field(int, vcpu_id)
1111                 __field(u32, sint)
1112                 __field(int, vector)
1113                 __field(int, ret)
1114         ),
1115
1116         TP_fast_assign(
1117                 __entry->vcpu_id = vcpu_id;
1118                 __entry->sint = sint;
1119                 __entry->vector = vector;
1120                 __entry->ret = ret;
1121         ),
1122
1123         TP_printk("vcpu_id %d sint %u vector %d ret %d",
1124                   __entry->vcpu_id, __entry->sint, __entry->vector,
1125                   __entry->ret)
1126 );
1127
1128 /*
1129  * Tracepoint for kvm_hv_synic_send_eoi.
1130  */
1131 TRACE_EVENT(kvm_hv_synic_send_eoi,
1132         TP_PROTO(int vcpu_id, int vector),
1133         TP_ARGS(vcpu_id, vector),
1134
1135         TP_STRUCT__entry(
1136                 __field(int, vcpu_id)
1137                 __field(u32, sint)
1138                 __field(int, vector)
1139                 __field(int, ret)
1140         ),
1141
1142         TP_fast_assign(
1143                 __entry->vcpu_id = vcpu_id;
1144                 __entry->vector = vector;
1145         ),
1146
1147         TP_printk("vcpu_id %d vector %d", __entry->vcpu_id, __entry->vector)
1148 );
1149
1150 /*
1151  * Tracepoint for synic_set_msr.
1152  */
1153 TRACE_EVENT(kvm_hv_synic_set_msr,
1154         TP_PROTO(int vcpu_id, u32 msr, u64 data, bool host),
1155         TP_ARGS(vcpu_id, msr, data, host),
1156
1157         TP_STRUCT__entry(
1158                 __field(int, vcpu_id)
1159                 __field(u32, msr)
1160                 __field(u64, data)
1161                 __field(bool, host)
1162         ),
1163
1164         TP_fast_assign(
1165                 __entry->vcpu_id = vcpu_id;
1166                 __entry->msr = msr;
1167                 __entry->data = data;
1168                 __entry->host = host
1169         ),
1170
1171         TP_printk("vcpu_id %d msr 0x%x data 0x%llx host %d",
1172                   __entry->vcpu_id, __entry->msr, __entry->data, __entry->host)
1173 );
1174
1175 /*
1176  * Tracepoint for stimer_set_config.
1177  */
1178 TRACE_EVENT(kvm_hv_stimer_set_config,
1179         TP_PROTO(int vcpu_id, int timer_index, u64 config, bool host),
1180         TP_ARGS(vcpu_id, timer_index, config, host),
1181
1182         TP_STRUCT__entry(
1183                 __field(int, vcpu_id)
1184                 __field(int, timer_index)
1185                 __field(u64, config)
1186                 __field(bool, host)
1187         ),
1188
1189         TP_fast_assign(
1190                 __entry->vcpu_id = vcpu_id;
1191                 __entry->timer_index = timer_index;
1192                 __entry->config = config;
1193                 __entry->host = host;
1194         ),
1195
1196         TP_printk("vcpu_id %d timer %d config 0x%llx host %d",
1197                   __entry->vcpu_id, __entry->timer_index, __entry->config,
1198                   __entry->host)
1199 );
1200
1201 /*
1202  * Tracepoint for stimer_set_count.
1203  */
1204 TRACE_EVENT(kvm_hv_stimer_set_count,
1205         TP_PROTO(int vcpu_id, int timer_index, u64 count, bool host),
1206         TP_ARGS(vcpu_id, timer_index, count, host),
1207
1208         TP_STRUCT__entry(
1209                 __field(int, vcpu_id)
1210                 __field(int, timer_index)
1211                 __field(u64, count)
1212                 __field(bool, host)
1213         ),
1214
1215         TP_fast_assign(
1216                 __entry->vcpu_id = vcpu_id;
1217                 __entry->timer_index = timer_index;
1218                 __entry->count = count;
1219                 __entry->host = host;
1220         ),
1221
1222         TP_printk("vcpu_id %d timer %d count %llu host %d",
1223                   __entry->vcpu_id, __entry->timer_index, __entry->count,
1224                   __entry->host)
1225 );
1226
1227 /*
1228  * Tracepoint for stimer_start(periodic timer case).
1229  */
1230 TRACE_EVENT(kvm_hv_stimer_start_periodic,
1231         TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 exp_time),
1232         TP_ARGS(vcpu_id, timer_index, time_now, exp_time),
1233
1234         TP_STRUCT__entry(
1235                 __field(int, vcpu_id)
1236                 __field(int, timer_index)
1237                 __field(u64, time_now)
1238                 __field(u64, exp_time)
1239         ),
1240
1241         TP_fast_assign(
1242                 __entry->vcpu_id = vcpu_id;
1243                 __entry->timer_index = timer_index;
1244                 __entry->time_now = time_now;
1245                 __entry->exp_time = exp_time;
1246         ),
1247
1248         TP_printk("vcpu_id %d timer %d time_now %llu exp_time %llu",
1249                   __entry->vcpu_id, __entry->timer_index, __entry->time_now,
1250                   __entry->exp_time)
1251 );
1252
1253 /*
1254  * Tracepoint for stimer_start(one-shot timer case).
1255  */
1256 TRACE_EVENT(kvm_hv_stimer_start_one_shot,
1257         TP_PROTO(int vcpu_id, int timer_index, u64 time_now, u64 count),
1258         TP_ARGS(vcpu_id, timer_index, time_now, count),
1259
1260         TP_STRUCT__entry(
1261                 __field(int, vcpu_id)
1262                 __field(int, timer_index)
1263                 __field(u64, time_now)
1264                 __field(u64, count)
1265         ),
1266
1267         TP_fast_assign(
1268                 __entry->vcpu_id = vcpu_id;
1269                 __entry->timer_index = timer_index;
1270                 __entry->time_now = time_now;
1271                 __entry->count = count;
1272         ),
1273
1274         TP_printk("vcpu_id %d timer %d time_now %llu count %llu",
1275                   __entry->vcpu_id, __entry->timer_index, __entry->time_now,
1276                   __entry->count)
1277 );
1278
1279 /*
1280  * Tracepoint for stimer_timer_callback.
1281  */
1282 TRACE_EVENT(kvm_hv_stimer_callback,
1283         TP_PROTO(int vcpu_id, int timer_index),
1284         TP_ARGS(vcpu_id, timer_index),
1285
1286         TP_STRUCT__entry(
1287                 __field(int, vcpu_id)
1288                 __field(int, timer_index)
1289         ),
1290
1291         TP_fast_assign(
1292                 __entry->vcpu_id = vcpu_id;
1293                 __entry->timer_index = timer_index;
1294         ),
1295
1296         TP_printk("vcpu_id %d timer %d",
1297                   __entry->vcpu_id, __entry->timer_index)
1298 );
1299
1300 /*
1301  * Tracepoint for stimer_expiration.
1302  */
1303 TRACE_EVENT(kvm_hv_stimer_expiration,
1304         TP_PROTO(int vcpu_id, int timer_index, int direct, int msg_send_result),
1305         TP_ARGS(vcpu_id, timer_index, direct, msg_send_result),
1306
1307         TP_STRUCT__entry(
1308                 __field(int, vcpu_id)
1309                 __field(int, timer_index)
1310                 __field(int, direct)
1311                 __field(int, msg_send_result)
1312         ),
1313
1314         TP_fast_assign(
1315                 __entry->vcpu_id = vcpu_id;
1316                 __entry->timer_index = timer_index;
1317                 __entry->direct = direct;
1318                 __entry->msg_send_result = msg_send_result;
1319         ),
1320
1321         TP_printk("vcpu_id %d timer %d direct %d send result %d",
1322                   __entry->vcpu_id, __entry->timer_index,
1323                   __entry->direct, __entry->msg_send_result)
1324 );
1325
1326 /*
1327  * Tracepoint for stimer_cleanup.
1328  */
1329 TRACE_EVENT(kvm_hv_stimer_cleanup,
1330         TP_PROTO(int vcpu_id, int timer_index),
1331         TP_ARGS(vcpu_id, timer_index),
1332
1333         TP_STRUCT__entry(
1334                 __field(int, vcpu_id)
1335                 __field(int, timer_index)
1336         ),
1337
1338         TP_fast_assign(
1339                 __entry->vcpu_id = vcpu_id;
1340                 __entry->timer_index = timer_index;
1341         ),
1342
1343         TP_printk("vcpu_id %d timer %d",
1344                   __entry->vcpu_id, __entry->timer_index)
1345 );
1346
1347 TRACE_EVENT(kvm_apicv_inhibit_changed,
1348             TP_PROTO(int reason, bool set, unsigned long inhibits),
1349             TP_ARGS(reason, set, inhibits),
1350
1351         TP_STRUCT__entry(
1352                 __field(int, reason)
1353                 __field(bool, set)
1354                 __field(unsigned long, inhibits)
1355         ),
1356
1357         TP_fast_assign(
1358                 __entry->reason = reason;
1359                 __entry->set = set;
1360                 __entry->inhibits = inhibits;
1361         ),
1362
1363         TP_printk("%s reason=%u, inhibits=0x%lx",
1364                   __entry->set ? "set" : "cleared",
1365                   __entry->reason, __entry->inhibits)
1366 );
1367
1368 TRACE_EVENT(kvm_apicv_accept_irq,
1369             TP_PROTO(__u32 apicid, __u16 dm, __u16 tm, __u8 vec),
1370             TP_ARGS(apicid, dm, tm, vec),
1371
1372         TP_STRUCT__entry(
1373                 __field(        __u32,          apicid          )
1374                 __field(        __u16,          dm              )
1375                 __field(        __u16,          tm              )
1376                 __field(        __u8,           vec             )
1377         ),
1378
1379         TP_fast_assign(
1380                 __entry->apicid         = apicid;
1381                 __entry->dm             = dm;
1382                 __entry->tm             = tm;
1383                 __entry->vec            = vec;
1384         ),
1385
1386         TP_printk("apicid %x vec %u (%s|%s)",
1387                   __entry->apicid, __entry->vec,
1388                   __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
1389                   __entry->tm ? "level" : "edge")
1390 );
1391
1392 /*
1393  * Tracepoint for AMD AVIC
1394  */
1395 TRACE_EVENT(kvm_avic_incomplete_ipi,
1396             TP_PROTO(u32 vcpu, u32 icrh, u32 icrl, u32 id, u32 index),
1397             TP_ARGS(vcpu, icrh, icrl, id, index),
1398
1399         TP_STRUCT__entry(
1400                 __field(u32, vcpu)
1401                 __field(u32, icrh)
1402                 __field(u32, icrl)
1403                 __field(u32, id)
1404                 __field(u32, index)
1405         ),
1406
1407         TP_fast_assign(
1408                 __entry->vcpu = vcpu;
1409                 __entry->icrh = icrh;
1410                 __entry->icrl = icrl;
1411                 __entry->id = id;
1412                 __entry->index = index;
1413         ),
1414
1415         TP_printk("vcpu=%u, icrh:icrl=%#010x:%08x, id=%u, index=%u",
1416                   __entry->vcpu, __entry->icrh, __entry->icrl,
1417                   __entry->id, __entry->index)
1418 );
1419
1420 TRACE_EVENT(kvm_avic_unaccelerated_access,
1421             TP_PROTO(u32 vcpu, u32 offset, bool ft, bool rw, u32 vec),
1422             TP_ARGS(vcpu, offset, ft, rw, vec),
1423
1424         TP_STRUCT__entry(
1425                 __field(u32, vcpu)
1426                 __field(u32, offset)
1427                 __field(bool, ft)
1428                 __field(bool, rw)
1429                 __field(u32, vec)
1430         ),
1431
1432         TP_fast_assign(
1433                 __entry->vcpu = vcpu;
1434                 __entry->offset = offset;
1435                 __entry->ft = ft;
1436                 __entry->rw = rw;
1437                 __entry->vec = vec;
1438         ),
1439
1440         TP_printk("vcpu=%u, offset=%#x(%s), %s, %s, vec=%#x",
1441                   __entry->vcpu,
1442                   __entry->offset,
1443                   __print_symbolic(__entry->offset, kvm_trace_symbol_apic),
1444                   __entry->ft ? "trap" : "fault",
1445                   __entry->rw ? "write" : "read",
1446                   __entry->vec)
1447 );
1448
1449 TRACE_EVENT(kvm_avic_ga_log,
1450             TP_PROTO(u32 vmid, u32 vcpuid),
1451             TP_ARGS(vmid, vcpuid),
1452
1453         TP_STRUCT__entry(
1454                 __field(u32, vmid)
1455                 __field(u32, vcpuid)
1456         ),
1457
1458         TP_fast_assign(
1459                 __entry->vmid = vmid;
1460                 __entry->vcpuid = vcpuid;
1461         ),
1462
1463         TP_printk("vmid=%u, vcpuid=%u",
1464                   __entry->vmid, __entry->vcpuid)
1465 );
1466
1467 TRACE_EVENT(kvm_avic_kick_vcpu_slowpath,
1468             TP_PROTO(u32 icrh, u32 icrl, u32 index),
1469             TP_ARGS(icrh, icrl, index),
1470
1471         TP_STRUCT__entry(
1472                 __field(u32, icrh)
1473                 __field(u32, icrl)
1474                 __field(u32, index)
1475         ),
1476
1477         TP_fast_assign(
1478                 __entry->icrh = icrh;
1479                 __entry->icrl = icrl;
1480                 __entry->index = index;
1481         ),
1482
1483         TP_printk("icrh:icrl=%#08x:%08x, index=%u",
1484                   __entry->icrh, __entry->icrl, __entry->index)
1485 );
1486
1487 TRACE_EVENT(kvm_hv_timer_state,
1488                 TP_PROTO(unsigned int vcpu_id, unsigned int hv_timer_in_use),
1489                 TP_ARGS(vcpu_id, hv_timer_in_use),
1490                 TP_STRUCT__entry(
1491                         __field(unsigned int, vcpu_id)
1492                         __field(unsigned int, hv_timer_in_use)
1493                         ),
1494                 TP_fast_assign(
1495                         __entry->vcpu_id = vcpu_id;
1496                         __entry->hv_timer_in_use = hv_timer_in_use;
1497                         ),
1498                 TP_printk("vcpu_id %x hv_timer %x",
1499                         __entry->vcpu_id,
1500                         __entry->hv_timer_in_use)
1501 );
1502
1503 /*
1504  * Tracepoint for kvm_hv_flush_tlb.
1505  */
1506 TRACE_EVENT(kvm_hv_flush_tlb,
1507         TP_PROTO(u64 processor_mask, u64 address_space, u64 flags),
1508         TP_ARGS(processor_mask, address_space, flags),
1509
1510         TP_STRUCT__entry(
1511                 __field(u64, processor_mask)
1512                 __field(u64, address_space)
1513                 __field(u64, flags)
1514         ),
1515
1516         TP_fast_assign(
1517                 __entry->processor_mask = processor_mask;
1518                 __entry->address_space = address_space;
1519                 __entry->flags = flags;
1520         ),
1521
1522         TP_printk("processor_mask 0x%llx address_space 0x%llx flags 0x%llx",
1523                   __entry->processor_mask, __entry->address_space,
1524                   __entry->flags)
1525 );
1526
1527 /*
1528  * Tracepoint for kvm_hv_flush_tlb_ex.
1529  */
1530 TRACE_EVENT(kvm_hv_flush_tlb_ex,
1531         TP_PROTO(u64 valid_bank_mask, u64 format, u64 address_space, u64 flags),
1532         TP_ARGS(valid_bank_mask, format, address_space, flags),
1533
1534         TP_STRUCT__entry(
1535                 __field(u64, valid_bank_mask)
1536                 __field(u64, format)
1537                 __field(u64, address_space)
1538                 __field(u64, flags)
1539         ),
1540
1541         TP_fast_assign(
1542                 __entry->valid_bank_mask = valid_bank_mask;
1543                 __entry->format = format;
1544                 __entry->address_space = address_space;
1545                 __entry->flags = flags;
1546         ),
1547
1548         TP_printk("valid_bank_mask 0x%llx format 0x%llx "
1549                   "address_space 0x%llx flags 0x%llx",
1550                   __entry->valid_bank_mask, __entry->format,
1551                   __entry->address_space, __entry->flags)
1552 );
1553
1554 /*
1555  * Tracepoints for kvm_hv_send_ipi.
1556  */
1557 TRACE_EVENT(kvm_hv_send_ipi,
1558         TP_PROTO(u32 vector, u64 processor_mask),
1559         TP_ARGS(vector, processor_mask),
1560
1561         TP_STRUCT__entry(
1562                 __field(u32, vector)
1563                 __field(u64, processor_mask)
1564         ),
1565
1566         TP_fast_assign(
1567                 __entry->vector = vector;
1568                 __entry->processor_mask = processor_mask;
1569         ),
1570
1571         TP_printk("vector %x processor_mask 0x%llx",
1572                   __entry->vector, __entry->processor_mask)
1573 );
1574
1575 TRACE_EVENT(kvm_hv_send_ipi_ex,
1576         TP_PROTO(u32 vector, u64 format, u64 valid_bank_mask),
1577         TP_ARGS(vector, format, valid_bank_mask),
1578
1579         TP_STRUCT__entry(
1580                 __field(u32, vector)
1581                 __field(u64, format)
1582                 __field(u64, valid_bank_mask)
1583         ),
1584
1585         TP_fast_assign(
1586                 __entry->vector = vector;
1587                 __entry->format = format;
1588                 __entry->valid_bank_mask = valid_bank_mask;
1589         ),
1590
1591         TP_printk("vector %x format %llx valid_bank_mask 0x%llx",
1592                   __entry->vector, __entry->format,
1593                   __entry->valid_bank_mask)
1594 );
1595
1596 TRACE_EVENT(kvm_pv_tlb_flush,
1597         TP_PROTO(unsigned int vcpu_id, bool need_flush_tlb),
1598         TP_ARGS(vcpu_id, need_flush_tlb),
1599
1600         TP_STRUCT__entry(
1601                 __field(        unsigned int,   vcpu_id         )
1602                 __field(        bool,   need_flush_tlb          )
1603         ),
1604
1605         TP_fast_assign(
1606                 __entry->vcpu_id        = vcpu_id;
1607                 __entry->need_flush_tlb = need_flush_tlb;
1608         ),
1609
1610         TP_printk("vcpu %u need_flush_tlb %s", __entry->vcpu_id,
1611                 __entry->need_flush_tlb ? "true" : "false")
1612 );
1613
1614 /*
1615  * Tracepoint for failed nested VMX VM-Enter.
1616  */
1617 TRACE_EVENT(kvm_nested_vmenter_failed,
1618         TP_PROTO(const char *msg, u32 err),
1619         TP_ARGS(msg, err),
1620
1621         TP_STRUCT__entry(
1622                 __string(msg, msg)
1623                 __field(u32, err)
1624         ),
1625
1626         TP_fast_assign(
1627                 __assign_str(msg, msg);
1628                 __entry->err = err;
1629         ),
1630
1631         TP_printk("%s%s", __get_str(msg), !__entry->err ? "" :
1632                 __print_symbolic(__entry->err, VMX_VMENTER_INSTRUCTION_ERRORS))
1633 );
1634
1635 /*
1636  * Tracepoint for syndbg_set_msr.
1637  */
1638 TRACE_EVENT(kvm_hv_syndbg_set_msr,
1639         TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
1640         TP_ARGS(vcpu_id, vp_index, msr, data),
1641
1642         TP_STRUCT__entry(
1643                 __field(int, vcpu_id)
1644                 __field(u32, vp_index)
1645                 __field(u32, msr)
1646                 __field(u64, data)
1647         ),
1648
1649         TP_fast_assign(
1650                 __entry->vcpu_id = vcpu_id;
1651                 __entry->vp_index = vp_index;
1652                 __entry->msr = msr;
1653                 __entry->data = data;
1654         ),
1655
1656         TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
1657                   __entry->vcpu_id, __entry->vp_index, __entry->msr,
1658                   __entry->data)
1659 );
1660
1661 /*
1662  * Tracepoint for syndbg_get_msr.
1663  */
1664 TRACE_EVENT(kvm_hv_syndbg_get_msr,
1665         TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data),
1666         TP_ARGS(vcpu_id, vp_index, msr, data),
1667
1668         TP_STRUCT__entry(
1669                 __field(int, vcpu_id)
1670                 __field(u32, vp_index)
1671                 __field(u32, msr)
1672                 __field(u64, data)
1673         ),
1674
1675         TP_fast_assign(
1676                 __entry->vcpu_id = vcpu_id;
1677                 __entry->vp_index = vp_index;
1678                 __entry->msr = msr;
1679                 __entry->data = data;
1680         ),
1681
1682         TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx",
1683                   __entry->vcpu_id, __entry->vp_index, __entry->msr,
1684                   __entry->data)
1685 );
1686
1687 /*
1688  * Tracepoint for the start of VMGEXIT processing
1689  */
1690 TRACE_EVENT(kvm_vmgexit_enter,
1691         TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb),
1692         TP_ARGS(vcpu_id, ghcb),
1693
1694         TP_STRUCT__entry(
1695                 __field(unsigned int, vcpu_id)
1696                 __field(u64, exit_reason)
1697                 __field(u64, info1)
1698                 __field(u64, info2)
1699         ),
1700
1701         TP_fast_assign(
1702                 __entry->vcpu_id     = vcpu_id;
1703                 __entry->exit_reason = ghcb->save.sw_exit_code;
1704                 __entry->info1       = ghcb->save.sw_exit_info_1;
1705                 __entry->info2       = ghcb->save.sw_exit_info_2;
1706         ),
1707
1708         TP_printk("vcpu %u, exit_reason %llx, exit_info1 %llx, exit_info2 %llx",
1709                   __entry->vcpu_id, __entry->exit_reason,
1710                   __entry->info1, __entry->info2)
1711 );
1712
1713 /*
1714  * Tracepoint for the end of VMGEXIT processing
1715  */
1716 TRACE_EVENT(kvm_vmgexit_exit,
1717         TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb),
1718         TP_ARGS(vcpu_id, ghcb),
1719
1720         TP_STRUCT__entry(
1721                 __field(unsigned int, vcpu_id)
1722                 __field(u64, exit_reason)
1723                 __field(u64, info1)
1724                 __field(u64, info2)
1725         ),
1726
1727         TP_fast_assign(
1728                 __entry->vcpu_id     = vcpu_id;
1729                 __entry->exit_reason = ghcb->save.sw_exit_code;
1730                 __entry->info1       = ghcb->save.sw_exit_info_1;
1731                 __entry->info2       = ghcb->save.sw_exit_info_2;
1732         ),
1733
1734         TP_printk("vcpu %u, exit_reason %llx, exit_info1 %llx, exit_info2 %llx",
1735                   __entry->vcpu_id, __entry->exit_reason,
1736                   __entry->info1, __entry->info2)
1737 );
1738
1739 /*
1740  * Tracepoint for the start of VMGEXIT MSR procotol processing
1741  */
1742 TRACE_EVENT(kvm_vmgexit_msr_protocol_enter,
1743         TP_PROTO(unsigned int vcpu_id, u64 ghcb_gpa),
1744         TP_ARGS(vcpu_id, ghcb_gpa),
1745
1746         TP_STRUCT__entry(
1747                 __field(unsigned int, vcpu_id)
1748                 __field(u64, ghcb_gpa)
1749         ),
1750
1751         TP_fast_assign(
1752                 __entry->vcpu_id  = vcpu_id;
1753                 __entry->ghcb_gpa = ghcb_gpa;
1754         ),
1755
1756         TP_printk("vcpu %u, ghcb_gpa %016llx",
1757                   __entry->vcpu_id, __entry->ghcb_gpa)
1758 );
1759
1760 /*
1761  * Tracepoint for the end of VMGEXIT MSR procotol processing
1762  */
1763 TRACE_EVENT(kvm_vmgexit_msr_protocol_exit,
1764         TP_PROTO(unsigned int vcpu_id, u64 ghcb_gpa, int result),
1765         TP_ARGS(vcpu_id, ghcb_gpa, result),
1766
1767         TP_STRUCT__entry(
1768                 __field(unsigned int, vcpu_id)
1769                 __field(u64, ghcb_gpa)
1770                 __field(int, result)
1771         ),
1772
1773         TP_fast_assign(
1774                 __entry->vcpu_id  = vcpu_id;
1775                 __entry->ghcb_gpa = ghcb_gpa;
1776                 __entry->result   = result;
1777         ),
1778
1779         TP_printk("vcpu %u, ghcb_gpa %016llx, result %d",
1780                   __entry->vcpu_id, __entry->ghcb_gpa, __entry->result)
1781 );
1782
1783 #endif /* _TRACE_KVM_H */
1784
1785 #undef TRACE_INCLUDE_PATH
1786 #define TRACE_INCLUDE_PATH ../../arch/x86/kvm
1787 #undef TRACE_INCLUDE_FILE
1788 #define TRACE_INCLUDE_FILE trace
1789
1790 /* This part must be outside protection */
1791 #include <trace/define_trace.h>