linux/arch/x86/kvm/trace.h
<<
>>
Prefs
   1#if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
   2#define _TRACE_KVM_H
   3
   4#include <linux/tracepoint.h>
   5
   6#undef TRACE_SYSTEM
   7#define TRACE_SYSTEM kvm
   8#define TRACE_INCLUDE_PATH arch/x86/kvm
   9#define TRACE_INCLUDE_FILE trace
  10
  11/*
  12 * Tracepoint for guest mode entry.
  13 */
  14TRACE_EVENT(kvm_entry,
  15        TP_PROTO(unsigned int vcpu_id),
  16        TP_ARGS(vcpu_id),
  17
  18        TP_STRUCT__entry(
  19                __field(        unsigned int,   vcpu_id         )
  20        ),
  21
  22        TP_fast_assign(
  23                __entry->vcpu_id        = vcpu_id;
  24        ),
  25
  26        TP_printk("vcpu %u", __entry->vcpu_id)
  27);
  28
  29/*
  30 * Tracepoint for hypercall.
  31 */
  32TRACE_EVENT(kvm_hypercall,
  33        TP_PROTO(unsigned long nr, unsigned long a0, unsigned long a1,
  34                 unsigned long a2, unsigned long a3),
  35        TP_ARGS(nr, a0, a1, a2, a3),
  36
  37        TP_STRUCT__entry(
  38                __field(        unsigned long,  nr              )
  39                __field(        unsigned long,  a0              )
  40                __field(        unsigned long,  a1              )
  41                __field(        unsigned long,  a2              )
  42                __field(        unsigned long,  a3              )
  43        ),
  44
  45        TP_fast_assign(
  46                __entry->nr             = nr;
  47                __entry->a0             = a0;
  48                __entry->a1             = a1;
  49                __entry->a2             = a2;
  50                __entry->a3             = a3;
  51        ),
  52
  53        TP_printk("nr 0x%lx a0 0x%lx a1 0x%lx a2 0x%lx a3 0x%lx",
  54                 __entry->nr, __entry->a0, __entry->a1,  __entry->a2,
  55                 __entry->a3)
  56);
  57
  58/*
  59 * Tracepoint for PIO.
  60 */
  61TRACE_EVENT(kvm_pio,
  62        TP_PROTO(unsigned int rw, unsigned int port, unsigned int size,
  63                 unsigned int count),
  64        TP_ARGS(rw, port, size, count),
  65
  66        TP_STRUCT__entry(
  67                __field(        unsigned int,   rw              )
  68                __field(        unsigned int,   port            )
  69                __field(        unsigned int,   size            )
  70                __field(        unsigned int,   count           )
  71        ),
  72
  73        TP_fast_assign(
  74                __entry->rw             = rw;
  75                __entry->port           = port;
  76                __entry->size           = size;
  77                __entry->count          = count;
  78        ),
  79
  80        TP_printk("pio_%s at 0x%x size %d count %d",
  81                  __entry->rw ? "write" : "read",
  82                  __entry->port, __entry->size, __entry->count)
  83);
  84
  85/*
  86 * Tracepoint for cpuid.
  87 */
  88TRACE_EVENT(kvm_cpuid,
  89        TP_PROTO(unsigned int function, unsigned long rax, unsigned long rbx,
  90                 unsigned long rcx, unsigned long rdx),
  91        TP_ARGS(function, rax, rbx, rcx, rdx),
  92
  93        TP_STRUCT__entry(
  94                __field(        unsigned int,   function        )
  95                __field(        unsigned long,  rax             )
  96                __field(        unsigned long,  rbx             )
  97                __field(        unsigned long,  rcx             )
  98                __field(        unsigned long,  rdx             )
  99        ),
 100
 101        TP_fast_assign(
 102                __entry->function       = function;
 103                __entry->rax            = rax;
 104                __entry->rbx            = rbx;
 105                __entry->rcx            = rcx;
 106                __entry->rdx            = rdx;
 107        ),
 108
 109        TP_printk("func %x rax %lx rbx %lx rcx %lx rdx %lx",
 110                  __entry->function, __entry->rax,
 111                  __entry->rbx, __entry->rcx, __entry->rdx)
 112);
 113
 114#define AREG(x) { APIC_##x, "APIC_" #x }
 115
 116#define kvm_trace_symbol_apic                                               \
 117        AREG(ID), AREG(LVR), AREG(TASKPRI), AREG(ARBPRI), AREG(PROCPRI),    \
 118        AREG(EOI), AREG(RRR), AREG(LDR), AREG(DFR), AREG(SPIV), AREG(ISR),  \
 119        AREG(TMR), AREG(IRR), AREG(ESR), AREG(ICR), AREG(ICR2), AREG(LVTT), \
 120        AREG(LVTTHMR), AREG(LVTPC), AREG(LVT0), AREG(LVT1), AREG(LVTERR),   \
 121        AREG(TMICT), AREG(TMCCT), AREG(TDCR), AREG(SELF_IPI), AREG(EFEAT),  \
 122        AREG(ECTRL)
 123/*
 124 * Tracepoint for apic access.
 125 */
 126TRACE_EVENT(kvm_apic,
 127        TP_PROTO(unsigned int rw, unsigned int reg, unsigned int val),
 128        TP_ARGS(rw, reg, val),
 129
 130        TP_STRUCT__entry(
 131                __field(        unsigned int,   rw              )
 132                __field(        unsigned int,   reg             )
 133                __field(        unsigned int,   val             )
 134        ),
 135
 136        TP_fast_assign(
 137                __entry->rw             = rw;
 138                __entry->reg            = reg;
 139                __entry->val            = val;
 140        ),
 141
 142        TP_printk("apic_%s %s = 0x%x",
 143                  __entry->rw ? "write" : "read",
 144                  __print_symbolic(__entry->reg, kvm_trace_symbol_apic),
 145                  __entry->val)
 146);
 147
 148#define trace_kvm_apic_read(reg, val)           trace_kvm_apic(0, reg, val)
 149#define trace_kvm_apic_write(reg, val)          trace_kvm_apic(1, reg, val)
 150
 151/*
 152 * Tracepoint for kvm guest exit:
 153 */
 154TRACE_EVENT(kvm_exit,
 155        TP_PROTO(unsigned int exit_reason, unsigned long guest_rip),
 156        TP_ARGS(exit_reason, guest_rip),
 157
 158        TP_STRUCT__entry(
 159                __field(        unsigned int,   exit_reason     )
 160                __field(        unsigned long,  guest_rip       )
 161        ),
 162
 163        TP_fast_assign(
 164                __entry->exit_reason    = exit_reason;
 165                __entry->guest_rip      = guest_rip;
 166        ),
 167
 168        TP_printk("reason %s rip 0x%lx",
 169                 ftrace_print_symbols_seq(p, __entry->exit_reason,
 170                                          kvm_x86_ops->exit_reasons_str),
 171                 __entry->guest_rip)
 172);
 173
 174/*
 175 * Tracepoint for kvm interrupt injection:
 176 */
 177TRACE_EVENT(kvm_inj_virq,
 178        TP_PROTO(unsigned int irq),
 179        TP_ARGS(irq),
 180
 181        TP_STRUCT__entry(
 182                __field(        unsigned int,   irq             )
 183        ),
 184
 185        TP_fast_assign(
 186                __entry->irq            = irq;
 187        ),
 188
 189        TP_printk("irq %u", __entry->irq)
 190);
 191
 192/*
 193 * Tracepoint for page fault.
 194 */
 195TRACE_EVENT(kvm_page_fault,
 196        TP_PROTO(unsigned long fault_address, unsigned int error_code),
 197        TP_ARGS(fault_address, error_code),
 198
 199        TP_STRUCT__entry(
 200                __field(        unsigned long,  fault_address   )
 201                __field(        unsigned int,   error_code      )
 202        ),
 203
 204        TP_fast_assign(
 205                __entry->fault_address  = fault_address;
 206                __entry->error_code     = error_code;
 207        ),
 208
 209        TP_printk("address %lx error_code %x",
 210                  __entry->fault_address, __entry->error_code)
 211);
 212
 213/*
 214 * Tracepoint for guest MSR access.
 215 */
 216TRACE_EVENT(kvm_msr,
 217        TP_PROTO(unsigned int rw, unsigned int ecx, unsigned long data),
 218        TP_ARGS(rw, ecx, data),
 219
 220        TP_STRUCT__entry(
 221                __field(        unsigned int,   rw              )
 222                __field(        unsigned int,   ecx             )
 223                __field(        unsigned long,  data            )
 224        ),
 225
 226        TP_fast_assign(
 227                __entry->rw             = rw;
 228                __entry->ecx            = ecx;
 229                __entry->data           = data;
 230        ),
 231
 232        TP_printk("msr_%s %x = 0x%lx",
 233                  __entry->rw ? "write" : "read",
 234                  __entry->ecx, __entry->data)
 235);
 236
 237#define trace_kvm_msr_read(ecx, data)           trace_kvm_msr(0, ecx, data)
 238#define trace_kvm_msr_write(ecx, data)          trace_kvm_msr(1, ecx, data)
 239
 240/*
 241 * Tracepoint for guest CR access.
 242 */
 243TRACE_EVENT(kvm_cr,
 244        TP_PROTO(unsigned int rw, unsigned int cr, unsigned long val),
 245        TP_ARGS(rw, cr, val),
 246
 247        TP_STRUCT__entry(
 248                __field(        unsigned int,   rw              )
 249                __field(        unsigned int,   cr              )
 250                __field(        unsigned long,  val             )
 251        ),
 252
 253        TP_fast_assign(
 254                __entry->rw             = rw;
 255                __entry->cr             = cr;
 256                __entry->val            = val;
 257        ),
 258
 259        TP_printk("cr_%s %x = 0x%lx",
 260                  __entry->rw ? "write" : "read",
 261                  __entry->cr, __entry->val)
 262);
 263
 264#define trace_kvm_cr_read(cr, val)              trace_kvm_cr(0, cr, val)
 265#define trace_kvm_cr_write(cr, val)             trace_kvm_cr(1, cr, val)
 266
 267TRACE_EVENT(kvm_pic_set_irq,
 268            TP_PROTO(__u8 chip, __u8 pin, __u8 elcr, __u8 imr, bool coalesced),
 269            TP_ARGS(chip, pin, elcr, imr, coalesced),
 270
 271        TP_STRUCT__entry(
 272                __field(        __u8,           chip            )
 273                __field(        __u8,           pin             )
 274                __field(        __u8,           elcr            )
 275                __field(        __u8,           imr             )
 276                __field(        bool,           coalesced       )
 277        ),
 278
 279        TP_fast_assign(
 280                __entry->chip           = chip;
 281                __entry->pin            = pin;
 282                __entry->elcr           = elcr;
 283                __entry->imr            = imr;
 284                __entry->coalesced      = coalesced;
 285        ),
 286
 287        TP_printk("chip %u pin %u (%s%s)%s",
 288                  __entry->chip, __entry->pin,
 289                  (__entry->elcr & (1 << __entry->pin)) ? "level":"edge",
 290                  (__entry->imr & (1 << __entry->pin)) ? "|masked":"",
 291                  __entry->coalesced ? " (coalesced)" : "")
 292);
 293
 294#define kvm_apic_dst_shorthand          \
 295        {0x0, "dst"},                   \
 296        {0x1, "self"},                  \
 297        {0x2, "all"},                   \
 298        {0x3, "all-but-self"}
 299
 300TRACE_EVENT(kvm_apic_ipi,
 301            TP_PROTO(__u32 icr_low, __u32 dest_id),
 302            TP_ARGS(icr_low, dest_id),
 303
 304        TP_STRUCT__entry(
 305                __field(        __u32,          icr_low         )
 306                __field(        __u32,          dest_id         )
 307        ),
 308
 309        TP_fast_assign(
 310                __entry->icr_low        = icr_low;
 311                __entry->dest_id        = dest_id;
 312        ),
 313
 314        TP_printk("dst %x vec %u (%s|%s|%s|%s|%s)",
 315                  __entry->dest_id, (u8)__entry->icr_low,
 316                  __print_symbolic((__entry->icr_low >> 8 & 0x7),
 317                                   kvm_deliver_mode),
 318                  (__entry->icr_low & (1<<11)) ? "logical" : "physical",
 319                  (__entry->icr_low & (1<<14)) ? "assert" : "de-assert",
 320                  (__entry->icr_low & (1<<15)) ? "level" : "edge",
 321                  __print_symbolic((__entry->icr_low >> 18 & 0x3),
 322                                   kvm_apic_dst_shorthand))
 323);
 324
 325TRACE_EVENT(kvm_apic_accept_irq,
 326            TP_PROTO(__u32 apicid, __u16 dm, __u8 tm, __u8 vec, bool coalesced),
 327            TP_ARGS(apicid, dm, tm, vec, coalesced),
 328
 329        TP_STRUCT__entry(
 330                __field(        __u32,          apicid          )
 331                __field(        __u16,          dm              )
 332                __field(        __u8,           tm              )
 333                __field(        __u8,           vec             )
 334                __field(        bool,           coalesced       )
 335        ),
 336
 337        TP_fast_assign(
 338                __entry->apicid         = apicid;
 339                __entry->dm             = dm;
 340                __entry->tm             = tm;
 341                __entry->vec            = vec;
 342                __entry->coalesced      = coalesced;
 343        ),
 344
 345        TP_printk("apicid %x vec %u (%s|%s)%s",
 346                  __entry->apicid, __entry->vec,
 347                  __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
 348                  __entry->tm ? "level" : "edge",
 349                  __entry->coalesced ? " (coalesced)" : "")
 350);
 351
 352#endif /* _TRACE_KVM_H */
 353
 354/* This part must be outside protection */
 355#include <trace/define_trace.h>
 356