| .. | .. |
|---|
| 15 | 15 | * Tracepoint for guest mode entry. |
|---|
| 16 | 16 | */ |
|---|
| 17 | 17 | TRACE_EVENT(kvm_entry, |
|---|
| 18 | | - TP_PROTO(unsigned int vcpu_id), |
|---|
| 19 | | - TP_ARGS(vcpu_id), |
|---|
| 18 | + TP_PROTO(struct kvm_vcpu *vcpu), |
|---|
| 19 | + TP_ARGS(vcpu), |
|---|
| 20 | 20 | |
|---|
| 21 | 21 | TP_STRUCT__entry( |
|---|
| 22 | 22 | __field( unsigned int, vcpu_id ) |
|---|
| 23 | + __field( unsigned long, rip ) |
|---|
| 23 | 24 | ), |
|---|
| 24 | 25 | |
|---|
| 25 | 26 | TP_fast_assign( |
|---|
| 26 | | - __entry->vcpu_id = vcpu_id; |
|---|
| 27 | + __entry->vcpu_id = vcpu->vcpu_id; |
|---|
| 28 | + __entry->rip = kvm_rip_read(vcpu); |
|---|
| 27 | 29 | ), |
|---|
| 28 | 30 | |
|---|
| 29 | | - TP_printk("vcpu %u", __entry->vcpu_id) |
|---|
| 31 | + TP_printk("vcpu %u, rip 0x%lx", __entry->vcpu_id, __entry->rip) |
|---|
| 30 | 32 | ); |
|---|
| 31 | 33 | |
|---|
| 32 | 34 | /* |
|---|
| .. | .. |
|---|
| 151 | 153 | * Tracepoint for cpuid. |
|---|
| 152 | 154 | */ |
|---|
| 153 | 155 | TRACE_EVENT(kvm_cpuid, |
|---|
| 154 | | - TP_PROTO(unsigned int function, unsigned long rax, unsigned long rbx, |
|---|
| 155 | | - unsigned long rcx, unsigned long rdx, bool found), |
|---|
| 156 | | - TP_ARGS(function, rax, rbx, rcx, rdx, found), |
|---|
| 156 | + TP_PROTO(unsigned int function, unsigned int index, unsigned long rax, |
|---|
| 157 | + unsigned long rbx, unsigned long rcx, unsigned long rdx, |
|---|
| 158 | + bool found, bool used_max_basic), |
|---|
| 159 | + TP_ARGS(function, index, rax, rbx, rcx, rdx, found, used_max_basic), |
|---|
| 157 | 160 | |
|---|
| 158 | 161 | TP_STRUCT__entry( |
|---|
| 159 | 162 | __field( unsigned int, function ) |
|---|
| 163 | + __field( unsigned int, index ) |
|---|
| 160 | 164 | __field( unsigned long, rax ) |
|---|
| 161 | 165 | __field( unsigned long, rbx ) |
|---|
| 162 | 166 | __field( unsigned long, rcx ) |
|---|
| 163 | 167 | __field( unsigned long, rdx ) |
|---|
| 164 | 168 | __field( bool, found ) |
|---|
| 169 | + __field( bool, used_max_basic ) |
|---|
| 165 | 170 | ), |
|---|
| 166 | 171 | |
|---|
| 167 | 172 | TP_fast_assign( |
|---|
| 168 | 173 | __entry->function = function; |
|---|
| 174 | + __entry->index = index; |
|---|
| 169 | 175 | __entry->rax = rax; |
|---|
| 170 | 176 | __entry->rbx = rbx; |
|---|
| 171 | 177 | __entry->rcx = rcx; |
|---|
| 172 | 178 | __entry->rdx = rdx; |
|---|
| 173 | 179 | __entry->found = found; |
|---|
| 180 | + __entry->used_max_basic = used_max_basic; |
|---|
| 174 | 181 | ), |
|---|
| 175 | 182 | |
|---|
| 176 | | - TP_printk("func %x rax %lx rbx %lx rcx %lx rdx %lx, cpuid entry %s", |
|---|
| 177 | | - __entry->function, __entry->rax, |
|---|
| 183 | + TP_printk("func %x idx %x rax %lx rbx %lx rcx %lx rdx %lx, cpuid entry %s%s", |
|---|
| 184 | + __entry->function, __entry->index, __entry->rax, |
|---|
| 178 | 185 | __entry->rbx, __entry->rcx, __entry->rdx, |
|---|
| 179 | | - __entry->found ? "found" : "not found") |
|---|
| 186 | + __entry->found ? "found" : "not found", |
|---|
| 187 | + __entry->used_max_basic ? ", used max basic" : "") |
|---|
| 180 | 188 | ); |
|---|
| 181 | 189 | |
|---|
| 182 | 190 | #define AREG(x) { APIC_##x, "APIC_" #x } |
|---|
| .. | .. |
|---|
| 219 | 227 | #define KVM_ISA_VMX 1 |
|---|
| 220 | 228 | #define KVM_ISA_SVM 2 |
|---|
| 221 | 229 | |
|---|
| 230 | +#define kvm_print_exit_reason(exit_reason, isa) \ |
|---|
| 231 | + (isa == KVM_ISA_VMX) ? \ |
|---|
| 232 | + __print_symbolic(exit_reason & 0xffff, VMX_EXIT_REASONS) : \ |
|---|
| 233 | + __print_symbolic(exit_reason, SVM_EXIT_REASONS), \ |
|---|
| 234 | + (isa == KVM_ISA_VMX && exit_reason & ~0xffff) ? " " : "", \ |
|---|
| 235 | + (isa == KVM_ISA_VMX) ? \ |
|---|
| 236 | + __print_flags(exit_reason & ~0xffff, " ", VMX_EXIT_REASON_FLAGS) : "" |
|---|
| 237 | + |
|---|
| 238 | +#define TRACE_EVENT_KVM_EXIT(name) \ |
|---|
| 239 | +TRACE_EVENT(name, \ |
|---|
| 240 | + TP_PROTO(unsigned int exit_reason, struct kvm_vcpu *vcpu, u32 isa), \ |
|---|
| 241 | + TP_ARGS(exit_reason, vcpu, isa), \ |
|---|
| 242 | + \ |
|---|
| 243 | + TP_STRUCT__entry( \ |
|---|
| 244 | + __field( unsigned int, exit_reason ) \ |
|---|
| 245 | + __field( unsigned long, guest_rip ) \ |
|---|
| 246 | + __field( u32, isa ) \ |
|---|
| 247 | + __field( u64, info1 ) \ |
|---|
| 248 | + __field( u64, info2 ) \ |
|---|
| 249 | + __field( u32, intr_info ) \ |
|---|
| 250 | + __field( u32, error_code ) \ |
|---|
| 251 | + __field( unsigned int, vcpu_id ) \ |
|---|
| 252 | + ), \ |
|---|
| 253 | + \ |
|---|
| 254 | + TP_fast_assign( \ |
|---|
| 255 | + __entry->exit_reason = exit_reason; \ |
|---|
| 256 | + __entry->guest_rip = kvm_rip_read(vcpu); \ |
|---|
| 257 | + __entry->isa = isa; \ |
|---|
| 258 | + __entry->vcpu_id = vcpu->vcpu_id; \ |
|---|
| 259 | + kvm_x86_ops.get_exit_info(vcpu, &__entry->info1, \ |
|---|
| 260 | + &__entry->info2, \ |
|---|
| 261 | + &__entry->intr_info, \ |
|---|
| 262 | + &__entry->error_code); \ |
|---|
| 263 | + ), \ |
|---|
| 264 | + \ |
|---|
| 265 | + TP_printk("vcpu %u reason %s%s%s rip 0x%lx info1 0x%016llx " \ |
|---|
| 266 | + "info2 0x%016llx intr_info 0x%08x error_code 0x%08x", \ |
|---|
| 267 | + __entry->vcpu_id, \ |
|---|
| 268 | + kvm_print_exit_reason(__entry->exit_reason, __entry->isa), \ |
|---|
| 269 | + __entry->guest_rip, __entry->info1, __entry->info2, \ |
|---|
| 270 | + __entry->intr_info, __entry->error_code) \ |
|---|
| 271 | +) |
|---|
| 272 | + |
|---|
| 222 | 273 | /* |
|---|
| 223 | 274 | * Tracepoint for kvm guest exit: |
|---|
| 224 | 275 | */ |
|---|
| 225 | | -TRACE_EVENT(kvm_exit, |
|---|
| 226 | | - TP_PROTO(unsigned int exit_reason, struct kvm_vcpu *vcpu, u32 isa), |
|---|
| 227 | | - TP_ARGS(exit_reason, vcpu, isa), |
|---|
| 228 | | - |
|---|
| 229 | | - TP_STRUCT__entry( |
|---|
| 230 | | - __field( unsigned int, exit_reason ) |
|---|
| 231 | | - __field( unsigned long, guest_rip ) |
|---|
| 232 | | - __field( u32, isa ) |
|---|
| 233 | | - __field( u64, info1 ) |
|---|
| 234 | | - __field( u64, info2 ) |
|---|
| 235 | | - ), |
|---|
| 236 | | - |
|---|
| 237 | | - TP_fast_assign( |
|---|
| 238 | | - __entry->exit_reason = exit_reason; |
|---|
| 239 | | - __entry->guest_rip = kvm_rip_read(vcpu); |
|---|
| 240 | | - __entry->isa = isa; |
|---|
| 241 | | - kvm_x86_ops->get_exit_info(vcpu, &__entry->info1, |
|---|
| 242 | | - &__entry->info2); |
|---|
| 243 | | - ), |
|---|
| 244 | | - |
|---|
| 245 | | - TP_printk("reason %s rip 0x%lx info %llx %llx", |
|---|
| 246 | | - (__entry->isa == KVM_ISA_VMX) ? |
|---|
| 247 | | - __print_symbolic(__entry->exit_reason, VMX_EXIT_REASONS) : |
|---|
| 248 | | - __print_symbolic(__entry->exit_reason, SVM_EXIT_REASONS), |
|---|
| 249 | | - __entry->guest_rip, __entry->info1, __entry->info2) |
|---|
| 250 | | -); |
|---|
| 276 | +TRACE_EVENT_KVM_EXIT(kvm_exit); |
|---|
| 251 | 277 | |
|---|
| 252 | 278 | /* |
|---|
| 253 | 279 | * Tracepoint for kvm interrupt injection: |
|---|
| .. | .. |
|---|
| 278 | 304 | * Tracepoint for kvm interrupt injection: |
|---|
| 279 | 305 | */ |
|---|
| 280 | 306 | TRACE_EVENT(kvm_inj_exception, |
|---|
| 281 | | - TP_PROTO(unsigned exception, bool has_error, unsigned error_code), |
|---|
| 282 | | - TP_ARGS(exception, has_error, error_code), |
|---|
| 307 | + TP_PROTO(unsigned exception, bool has_error, unsigned error_code, |
|---|
| 308 | + bool reinjected), |
|---|
| 309 | + TP_ARGS(exception, has_error, error_code, reinjected), |
|---|
| 283 | 310 | |
|---|
| 284 | 311 | TP_STRUCT__entry( |
|---|
| 285 | 312 | __field( u8, exception ) |
|---|
| 286 | 313 | __field( u8, has_error ) |
|---|
| 287 | 314 | __field( u32, error_code ) |
|---|
| 315 | + __field( bool, reinjected ) |
|---|
| 288 | 316 | ), |
|---|
| 289 | 317 | |
|---|
| 290 | 318 | TP_fast_assign( |
|---|
| 291 | 319 | __entry->exception = exception; |
|---|
| 292 | 320 | __entry->has_error = has_error; |
|---|
| 293 | 321 | __entry->error_code = error_code; |
|---|
| 322 | + __entry->reinjected = reinjected; |
|---|
| 294 | 323 | ), |
|---|
| 295 | 324 | |
|---|
| 296 | | - TP_printk("%s (0x%x)", |
|---|
| 325 | + TP_printk("%s (0x%x)%s", |
|---|
| 297 | 326 | __print_symbolic(__entry->exception, kvm_trace_sym_exc), |
|---|
| 298 | 327 | /* FIXME: don't print error_code if not present */ |
|---|
| 299 | | - __entry->has_error ? __entry->error_code : 0) |
|---|
| 328 | + __entry->has_error ? __entry->error_code : 0, |
|---|
| 329 | + __entry->reinjected ? " [reinjected]" : "") |
|---|
| 300 | 330 | ); |
|---|
| 301 | 331 | |
|---|
| 302 | 332 | /* |
|---|
| .. | .. |
|---|
| 529 | 559 | ); |
|---|
| 530 | 560 | |
|---|
| 531 | 561 | TRACE_EVENT(kvm_nested_intercepts, |
|---|
| 532 | | - TP_PROTO(__u16 cr_read, __u16 cr_write, __u32 exceptions, __u64 intercept), |
|---|
| 533 | | - TP_ARGS(cr_read, cr_write, exceptions, intercept), |
|---|
| 562 | + TP_PROTO(__u16 cr_read, __u16 cr_write, __u32 exceptions, |
|---|
| 563 | + __u32 intercept1, __u32 intercept2, __u32 intercept3), |
|---|
| 564 | + TP_ARGS(cr_read, cr_write, exceptions, intercept1, |
|---|
| 565 | + intercept2, intercept3), |
|---|
| 534 | 566 | |
|---|
| 535 | 567 | TP_STRUCT__entry( |
|---|
| 536 | 568 | __field( __u16, cr_read ) |
|---|
| 537 | 569 | __field( __u16, cr_write ) |
|---|
| 538 | 570 | __field( __u32, exceptions ) |
|---|
| 539 | | - __field( __u64, intercept ) |
|---|
| 571 | + __field( __u32, intercept1 ) |
|---|
| 572 | + __field( __u32, intercept2 ) |
|---|
| 573 | + __field( __u32, intercept3 ) |
|---|
| 540 | 574 | ), |
|---|
| 541 | 575 | |
|---|
| 542 | 576 | TP_fast_assign( |
|---|
| 543 | 577 | __entry->cr_read = cr_read; |
|---|
| 544 | 578 | __entry->cr_write = cr_write; |
|---|
| 545 | 579 | __entry->exceptions = exceptions; |
|---|
| 546 | | - __entry->intercept = intercept; |
|---|
| 580 | + __entry->intercept1 = intercept1; |
|---|
| 581 | + __entry->intercept2 = intercept2; |
|---|
| 582 | + __entry->intercept3 = intercept3; |
|---|
| 547 | 583 | ), |
|---|
| 548 | 584 | |
|---|
| 549 | | - TP_printk("cr_read: %04x cr_write: %04x excp: %08x intercept: %016llx", |
|---|
| 550 | | - __entry->cr_read, __entry->cr_write, __entry->exceptions, |
|---|
| 551 | | - __entry->intercept) |
|---|
| 585 | + TP_printk("cr_read: %04x cr_write: %04x excp: %08x " |
|---|
| 586 | + "intercepts: %08x %08x %08x", |
|---|
| 587 | + __entry->cr_read, __entry->cr_write, __entry->exceptions, |
|---|
| 588 | + __entry->intercept1, __entry->intercept2, __entry->intercept3) |
|---|
| 552 | 589 | ); |
|---|
| 553 | 590 | /* |
|---|
| 554 | 591 | * Tracepoint for #VMEXIT while nested |
|---|
| 555 | 592 | */ |
|---|
| 556 | | -TRACE_EVENT(kvm_nested_vmexit, |
|---|
| 557 | | - TP_PROTO(__u64 rip, __u32 exit_code, |
|---|
| 558 | | - __u64 exit_info1, __u64 exit_info2, |
|---|
| 559 | | - __u32 exit_int_info, __u32 exit_int_info_err, __u32 isa), |
|---|
| 560 | | - TP_ARGS(rip, exit_code, exit_info1, exit_info2, |
|---|
| 561 | | - exit_int_info, exit_int_info_err, isa), |
|---|
| 562 | | - |
|---|
| 563 | | - TP_STRUCT__entry( |
|---|
| 564 | | - __field( __u64, rip ) |
|---|
| 565 | | - __field( __u32, exit_code ) |
|---|
| 566 | | - __field( __u64, exit_info1 ) |
|---|
| 567 | | - __field( __u64, exit_info2 ) |
|---|
| 568 | | - __field( __u32, exit_int_info ) |
|---|
| 569 | | - __field( __u32, exit_int_info_err ) |
|---|
| 570 | | - __field( __u32, isa ) |
|---|
| 571 | | - ), |
|---|
| 572 | | - |
|---|
| 573 | | - TP_fast_assign( |
|---|
| 574 | | - __entry->rip = rip; |
|---|
| 575 | | - __entry->exit_code = exit_code; |
|---|
| 576 | | - __entry->exit_info1 = exit_info1; |
|---|
| 577 | | - __entry->exit_info2 = exit_info2; |
|---|
| 578 | | - __entry->exit_int_info = exit_int_info; |
|---|
| 579 | | - __entry->exit_int_info_err = exit_int_info_err; |
|---|
| 580 | | - __entry->isa = isa; |
|---|
| 581 | | - ), |
|---|
| 582 | | - TP_printk("rip: 0x%016llx reason: %s ext_inf1: 0x%016llx " |
|---|
| 583 | | - "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x", |
|---|
| 584 | | - __entry->rip, |
|---|
| 585 | | - (__entry->isa == KVM_ISA_VMX) ? |
|---|
| 586 | | - __print_symbolic(__entry->exit_code, VMX_EXIT_REASONS) : |
|---|
| 587 | | - __print_symbolic(__entry->exit_code, SVM_EXIT_REASONS), |
|---|
| 588 | | - __entry->exit_info1, __entry->exit_info2, |
|---|
| 589 | | - __entry->exit_int_info, __entry->exit_int_info_err) |
|---|
| 590 | | -); |
|---|
| 593 | +TRACE_EVENT_KVM_EXIT(kvm_nested_vmexit); |
|---|
| 591 | 594 | |
|---|
| 592 | 595 | /* |
|---|
| 593 | 596 | * Tracepoint for #VMEXIT reinjected to the guest |
|---|
| .. | .. |
|---|
| 617 | 620 | __entry->isa = isa; |
|---|
| 618 | 621 | ), |
|---|
| 619 | 622 | |
|---|
| 620 | | - TP_printk("reason: %s ext_inf1: 0x%016llx " |
|---|
| 623 | + TP_printk("reason: %s%s%s ext_inf1: 0x%016llx " |
|---|
| 621 | 624 | "ext_inf2: 0x%016llx ext_int: 0x%08x ext_int_err: 0x%08x", |
|---|
| 622 | | - (__entry->isa == KVM_ISA_VMX) ? |
|---|
| 623 | | - __print_symbolic(__entry->exit_code, VMX_EXIT_REASONS) : |
|---|
| 624 | | - __print_symbolic(__entry->exit_code, SVM_EXIT_REASONS), |
|---|
| 625 | | - __entry->exit_info1, __entry->exit_info2, |
|---|
| 626 | | - __entry->exit_int_info, __entry->exit_int_info_err) |
|---|
| 625 | + kvm_print_exit_reason(__entry->exit_code, __entry->isa), |
|---|
| 626 | + __entry->exit_info1, __entry->exit_info2, |
|---|
| 627 | + __entry->exit_int_info, __entry->exit_int_info_err) |
|---|
| 627 | 628 | ); |
|---|
| 628 | 629 | |
|---|
| 629 | 630 | /* |
|---|
| .. | .. |
|---|
| 741 | 742 | ), |
|---|
| 742 | 743 | |
|---|
| 743 | 744 | TP_fast_assign( |
|---|
| 744 | | - __entry->csbase = kvm_x86_ops->get_segment_base(vcpu, VCPU_SREG_CS); |
|---|
| 745 | | - __entry->len = vcpu->arch.emulate_ctxt.fetch.ptr |
|---|
| 746 | | - - vcpu->arch.emulate_ctxt.fetch.data; |
|---|
| 747 | | - __entry->rip = vcpu->arch.emulate_ctxt._eip - __entry->len; |
|---|
| 745 | + __entry->csbase = kvm_x86_ops.get_segment_base(vcpu, VCPU_SREG_CS); |
|---|
| 746 | + __entry->len = vcpu->arch.emulate_ctxt->fetch.ptr |
|---|
| 747 | + - vcpu->arch.emulate_ctxt->fetch.data; |
|---|
| 748 | + __entry->rip = vcpu->arch.emulate_ctxt->_eip - __entry->len; |
|---|
| 748 | 749 | memcpy(__entry->insn, |
|---|
| 749 | | - vcpu->arch.emulate_ctxt.fetch.data, |
|---|
| 750 | + vcpu->arch.emulate_ctxt->fetch.data, |
|---|
| 750 | 751 | 15); |
|---|
| 751 | | - __entry->flags = kei_decode_mode(vcpu->arch.emulate_ctxt.mode); |
|---|
| 752 | + __entry->flags = kei_decode_mode(vcpu->arch.emulate_ctxt->mode); |
|---|
| 752 | 753 | __entry->failed = failed; |
|---|
| 753 | 754 | ), |
|---|
| 754 | 755 | |
|---|
| .. | .. |
|---|
| 812 | 813 | #ifdef CONFIG_X86_64 |
|---|
| 813 | 814 | |
|---|
| 814 | 815 | #define host_clocks \ |
|---|
| 815 | | - {VCLOCK_NONE, "none"}, \ |
|---|
| 816 | | - {VCLOCK_TSC, "tsc"} \ |
|---|
| 816 | + {VDSO_CLOCKMODE_NONE, "none"}, \ |
|---|
| 817 | + {VDSO_CLOCKMODE_TSC, "tsc"} \ |
|---|
| 817 | 818 | |
|---|
| 818 | 819 | TRACE_EVENT(kvm_update_master_clock, |
|---|
| 819 | 820 | TP_PROTO(bool use_master_clock, unsigned int host_clock, bool offset_matched), |
|---|
| .. | .. |
|---|
| 887 | 888 | TP_printk("vcpu %d: PML full", __entry->vcpu_id) |
|---|
| 888 | 889 | ); |
|---|
| 889 | 890 | |
|---|
| 890 | | -TRACE_EVENT(kvm_ple_window, |
|---|
| 891 | | - TP_PROTO(bool grow, unsigned int vcpu_id, int new, int old), |
|---|
| 892 | | - TP_ARGS(grow, vcpu_id, new, old), |
|---|
| 891 | +TRACE_EVENT(kvm_ple_window_update, |
|---|
| 892 | + TP_PROTO(unsigned int vcpu_id, unsigned int new, unsigned int old), |
|---|
| 893 | + TP_ARGS(vcpu_id, new, old), |
|---|
| 893 | 894 | |
|---|
| 894 | 895 | TP_STRUCT__entry( |
|---|
| 895 | | - __field( bool, grow ) |
|---|
| 896 | 896 | __field( unsigned int, vcpu_id ) |
|---|
| 897 | | - __field( int, new ) |
|---|
| 898 | | - __field( int, old ) |
|---|
| 897 | + __field( unsigned int, new ) |
|---|
| 898 | + __field( unsigned int, old ) |
|---|
| 899 | 899 | ), |
|---|
| 900 | 900 | |
|---|
| 901 | 901 | TP_fast_assign( |
|---|
| 902 | | - __entry->grow = grow; |
|---|
| 903 | 902 | __entry->vcpu_id = vcpu_id; |
|---|
| 904 | 903 | __entry->new = new; |
|---|
| 905 | 904 | __entry->old = old; |
|---|
| 906 | 905 | ), |
|---|
| 907 | 906 | |
|---|
| 908 | | - TP_printk("vcpu %u: ple_window %d (%s %d)", |
|---|
| 909 | | - __entry->vcpu_id, |
|---|
| 910 | | - __entry->new, |
|---|
| 911 | | - __entry->grow ? "grow" : "shrink", |
|---|
| 912 | | - __entry->old) |
|---|
| 907 | + TP_printk("vcpu %u old %u new %u (%s)", |
|---|
| 908 | + __entry->vcpu_id, __entry->old, __entry->new, |
|---|
| 909 | + __entry->old < __entry->new ? "growed" : "shrinked") |
|---|
| 913 | 910 | ); |
|---|
| 914 | | - |
|---|
| 915 | | -#define trace_kvm_ple_window_grow(vcpu_id, new, old) \ |
|---|
| 916 | | - trace_kvm_ple_window(true, vcpu_id, new, old) |
|---|
| 917 | | -#define trace_kvm_ple_window_shrink(vcpu_id, new, old) \ |
|---|
| 918 | | - trace_kvm_ple_window(false, vcpu_id, new, old) |
|---|
| 919 | 911 | |
|---|
| 920 | 912 | TRACE_EVENT(kvm_pvclock_update, |
|---|
| 921 | 913 | TP_PROTO(unsigned int vcpu_id, struct pvclock_vcpu_time_info *pvclock), |
|---|
| .. | .. |
|---|
| 1254 | 1246 | * Tracepoint for stimer_expiration. |
|---|
| 1255 | 1247 | */ |
|---|
| 1256 | 1248 | TRACE_EVENT(kvm_hv_stimer_expiration, |
|---|
| 1257 | | - TP_PROTO(int vcpu_id, int timer_index, int msg_send_result), |
|---|
| 1258 | | - TP_ARGS(vcpu_id, timer_index, msg_send_result), |
|---|
| 1249 | + TP_PROTO(int vcpu_id, int timer_index, int direct, int msg_send_result), |
|---|
| 1250 | + TP_ARGS(vcpu_id, timer_index, direct, msg_send_result), |
|---|
| 1259 | 1251 | |
|---|
| 1260 | 1252 | TP_STRUCT__entry( |
|---|
| 1261 | 1253 | __field(int, vcpu_id) |
|---|
| 1262 | 1254 | __field(int, timer_index) |
|---|
| 1255 | + __field(int, direct) |
|---|
| 1263 | 1256 | __field(int, msg_send_result) |
|---|
| 1264 | 1257 | ), |
|---|
| 1265 | 1258 | |
|---|
| 1266 | 1259 | TP_fast_assign( |
|---|
| 1267 | 1260 | __entry->vcpu_id = vcpu_id; |
|---|
| 1268 | 1261 | __entry->timer_index = timer_index; |
|---|
| 1262 | + __entry->direct = direct; |
|---|
| 1269 | 1263 | __entry->msg_send_result = msg_send_result; |
|---|
| 1270 | 1264 | ), |
|---|
| 1271 | 1265 | |
|---|
| 1272 | | - TP_printk("vcpu_id %d timer %d msg send result %d", |
|---|
| 1266 | + TP_printk("vcpu_id %d timer %d direct %d send result %d", |
|---|
| 1273 | 1267 | __entry->vcpu_id, __entry->timer_index, |
|---|
| 1274 | | - __entry->msg_send_result) |
|---|
| 1268 | + __entry->direct, __entry->msg_send_result) |
|---|
| 1275 | 1269 | ); |
|---|
| 1276 | 1270 | |
|---|
| 1277 | 1271 | /* |
|---|
| .. | .. |
|---|
| 1293 | 1287 | |
|---|
| 1294 | 1288 | TP_printk("vcpu_id %d timer %d", |
|---|
| 1295 | 1289 | __entry->vcpu_id, __entry->timer_index) |
|---|
| 1290 | +); |
|---|
| 1291 | + |
|---|
| 1292 | +TRACE_EVENT(kvm_apicv_update_request, |
|---|
| 1293 | + TP_PROTO(bool activate, unsigned long bit), |
|---|
| 1294 | + TP_ARGS(activate, bit), |
|---|
| 1295 | + |
|---|
| 1296 | + TP_STRUCT__entry( |
|---|
| 1297 | + __field(bool, activate) |
|---|
| 1298 | + __field(unsigned long, bit) |
|---|
| 1299 | + ), |
|---|
| 1300 | + |
|---|
| 1301 | + TP_fast_assign( |
|---|
| 1302 | + __entry->activate = activate; |
|---|
| 1303 | + __entry->bit = bit; |
|---|
| 1304 | + ), |
|---|
| 1305 | + |
|---|
| 1306 | + TP_printk("%s bit=%lu", |
|---|
| 1307 | + __entry->activate ? "activate" : "deactivate", |
|---|
| 1308 | + __entry->bit) |
|---|
| 1296 | 1309 | ); |
|---|
| 1297 | 1310 | |
|---|
| 1298 | 1311 | /* |
|---|
| .. | .. |
|---|
| 1318 | 1331 | __entry->index = index; |
|---|
| 1319 | 1332 | ), |
|---|
| 1320 | 1333 | |
|---|
| 1321 | | - TP_printk("vcpu=%u, icrh:icrl=%#010x:%08x, id=%u, index=%u\n", |
|---|
| 1334 | + TP_printk("vcpu=%u, icrh:icrl=%#010x:%08x, id=%u, index=%u", |
|---|
| 1322 | 1335 | __entry->vcpu, __entry->icrh, __entry->icrl, |
|---|
| 1323 | 1336 | __entry->id, __entry->index) |
|---|
| 1324 | 1337 | ); |
|---|
| .. | .. |
|---|
| 1343 | 1356 | __entry->vec = vec; |
|---|
| 1344 | 1357 | ), |
|---|
| 1345 | 1358 | |
|---|
| 1346 | | - TP_printk("vcpu=%u, offset=%#x(%s), %s, %s, vec=%#x\n", |
|---|
| 1359 | + TP_printk("vcpu=%u, offset=%#x(%s), %s, %s, vec=%#x", |
|---|
| 1347 | 1360 | __entry->vcpu, |
|---|
| 1348 | 1361 | __entry->offset, |
|---|
| 1349 | 1362 | __print_symbolic(__entry->offset, kvm_trace_symbol_apic), |
|---|
| 1350 | 1363 | __entry->ft ? "trap" : "fault", |
|---|
| 1351 | 1364 | __entry->rw ? "write" : "read", |
|---|
| 1352 | 1365 | __entry->vec) |
|---|
| 1366 | +); |
|---|
| 1367 | + |
|---|
| 1368 | +TRACE_EVENT(kvm_avic_ga_log, |
|---|
| 1369 | + TP_PROTO(u32 vmid, u32 vcpuid), |
|---|
| 1370 | + TP_ARGS(vmid, vcpuid), |
|---|
| 1371 | + |
|---|
| 1372 | + TP_STRUCT__entry( |
|---|
| 1373 | + __field(u32, vmid) |
|---|
| 1374 | + __field(u32, vcpuid) |
|---|
| 1375 | + ), |
|---|
| 1376 | + |
|---|
| 1377 | + TP_fast_assign( |
|---|
| 1378 | + __entry->vmid = vmid; |
|---|
| 1379 | + __entry->vcpuid = vcpuid; |
|---|
| 1380 | + ), |
|---|
| 1381 | + |
|---|
| 1382 | + TP_printk("vmid=%u, vcpuid=%u", |
|---|
| 1383 | + __entry->vmid, __entry->vcpuid) |
|---|
| 1353 | 1384 | ); |
|---|
| 1354 | 1385 | |
|---|
| 1355 | 1386 | TRACE_EVENT(kvm_hv_timer_state, |
|---|
| .. | .. |
|---|
| 1363 | 1394 | __entry->vcpu_id = vcpu_id; |
|---|
| 1364 | 1395 | __entry->hv_timer_in_use = hv_timer_in_use; |
|---|
| 1365 | 1396 | ), |
|---|
| 1366 | | - TP_printk("vcpu_id %x hv_timer %x\n", |
|---|
| 1397 | + TP_printk("vcpu_id %x hv_timer %x", |
|---|
| 1367 | 1398 | __entry->vcpu_id, |
|---|
| 1368 | 1399 | __entry->hv_timer_in_use) |
|---|
| 1369 | 1400 | ); |
|---|
| .. | .. |
|---|
| 1418 | 1449 | __entry->valid_bank_mask, __entry->format, |
|---|
| 1419 | 1450 | __entry->address_space, __entry->flags) |
|---|
| 1420 | 1451 | ); |
|---|
| 1452 | + |
|---|
| 1453 | +/* |
|---|
| 1454 | + * Tracepoints for kvm_hv_send_ipi. |
|---|
| 1455 | + */ |
|---|
| 1456 | +TRACE_EVENT(kvm_hv_send_ipi, |
|---|
| 1457 | + TP_PROTO(u32 vector, u64 processor_mask), |
|---|
| 1458 | + TP_ARGS(vector, processor_mask), |
|---|
| 1459 | + |
|---|
| 1460 | + TP_STRUCT__entry( |
|---|
| 1461 | + __field(u32, vector) |
|---|
| 1462 | + __field(u64, processor_mask) |
|---|
| 1463 | + ), |
|---|
| 1464 | + |
|---|
| 1465 | + TP_fast_assign( |
|---|
| 1466 | + __entry->vector = vector; |
|---|
| 1467 | + __entry->processor_mask = processor_mask; |
|---|
| 1468 | + ), |
|---|
| 1469 | + |
|---|
| 1470 | + TP_printk("vector %x processor_mask 0x%llx", |
|---|
| 1471 | + __entry->vector, __entry->processor_mask) |
|---|
| 1472 | +); |
|---|
| 1473 | + |
|---|
| 1474 | +TRACE_EVENT(kvm_hv_send_ipi_ex, |
|---|
| 1475 | + TP_PROTO(u32 vector, u64 format, u64 valid_bank_mask), |
|---|
| 1476 | + TP_ARGS(vector, format, valid_bank_mask), |
|---|
| 1477 | + |
|---|
| 1478 | + TP_STRUCT__entry( |
|---|
| 1479 | + __field(u32, vector) |
|---|
| 1480 | + __field(u64, format) |
|---|
| 1481 | + __field(u64, valid_bank_mask) |
|---|
| 1482 | + ), |
|---|
| 1483 | + |
|---|
| 1484 | + TP_fast_assign( |
|---|
| 1485 | + __entry->vector = vector; |
|---|
| 1486 | + __entry->format = format; |
|---|
| 1487 | + __entry->valid_bank_mask = valid_bank_mask; |
|---|
| 1488 | + ), |
|---|
| 1489 | + |
|---|
| 1490 | + TP_printk("vector %x format %llx valid_bank_mask 0x%llx", |
|---|
| 1491 | + __entry->vector, __entry->format, |
|---|
| 1492 | + __entry->valid_bank_mask) |
|---|
| 1493 | +); |
|---|
| 1494 | + |
|---|
| 1495 | +TRACE_EVENT(kvm_pv_tlb_flush, |
|---|
| 1496 | + TP_PROTO(unsigned int vcpu_id, bool need_flush_tlb), |
|---|
| 1497 | + TP_ARGS(vcpu_id, need_flush_tlb), |
|---|
| 1498 | + |
|---|
| 1499 | + TP_STRUCT__entry( |
|---|
| 1500 | + __field( unsigned int, vcpu_id ) |
|---|
| 1501 | + __field( bool, need_flush_tlb ) |
|---|
| 1502 | + ), |
|---|
| 1503 | + |
|---|
| 1504 | + TP_fast_assign( |
|---|
| 1505 | + __entry->vcpu_id = vcpu_id; |
|---|
| 1506 | + __entry->need_flush_tlb = need_flush_tlb; |
|---|
| 1507 | + ), |
|---|
| 1508 | + |
|---|
| 1509 | + TP_printk("vcpu %u need_flush_tlb %s", __entry->vcpu_id, |
|---|
| 1510 | + __entry->need_flush_tlb ? "true" : "false") |
|---|
| 1511 | +); |
|---|
| 1512 | + |
|---|
| 1513 | +/* |
|---|
| 1514 | + * Tracepoint for failed nested VMX VM-Enter. |
|---|
| 1515 | + */ |
|---|
| 1516 | +TRACE_EVENT(kvm_nested_vmenter_failed, |
|---|
| 1517 | + TP_PROTO(const char *msg, u32 err), |
|---|
| 1518 | + TP_ARGS(msg, err), |
|---|
| 1519 | + |
|---|
| 1520 | + TP_STRUCT__entry( |
|---|
| 1521 | + __string(msg, msg) |
|---|
| 1522 | + __field(u32, err) |
|---|
| 1523 | + ), |
|---|
| 1524 | + |
|---|
| 1525 | + TP_fast_assign( |
|---|
| 1526 | + __assign_str(msg, msg); |
|---|
| 1527 | + __entry->err = err; |
|---|
| 1528 | + ), |
|---|
| 1529 | + |
|---|
| 1530 | + TP_printk("%s%s", __get_str(msg), !__entry->err ? "" : |
|---|
| 1531 | + __print_symbolic(__entry->err, VMX_VMENTER_INSTRUCTION_ERRORS)) |
|---|
| 1532 | +); |
|---|
| 1533 | + |
|---|
| 1534 | +/* |
|---|
| 1535 | + * Tracepoint for syndbg_set_msr. |
|---|
| 1536 | + */ |
|---|
| 1537 | +TRACE_EVENT(kvm_hv_syndbg_set_msr, |
|---|
| 1538 | + TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data), |
|---|
| 1539 | + TP_ARGS(vcpu_id, vp_index, msr, data), |
|---|
| 1540 | + |
|---|
| 1541 | + TP_STRUCT__entry( |
|---|
| 1542 | + __field(int, vcpu_id) |
|---|
| 1543 | + __field(u32, vp_index) |
|---|
| 1544 | + __field(u32, msr) |
|---|
| 1545 | + __field(u64, data) |
|---|
| 1546 | + ), |
|---|
| 1547 | + |
|---|
| 1548 | + TP_fast_assign( |
|---|
| 1549 | + __entry->vcpu_id = vcpu_id; |
|---|
| 1550 | + __entry->vp_index = vp_index; |
|---|
| 1551 | + __entry->msr = msr; |
|---|
| 1552 | + __entry->data = data; |
|---|
| 1553 | + ), |
|---|
| 1554 | + |
|---|
| 1555 | + TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx", |
|---|
| 1556 | + __entry->vcpu_id, __entry->vp_index, __entry->msr, |
|---|
| 1557 | + __entry->data) |
|---|
| 1558 | +); |
|---|
| 1559 | + |
|---|
| 1560 | +/* |
|---|
| 1561 | + * Tracepoint for syndbg_get_msr. |
|---|
| 1562 | + */ |
|---|
| 1563 | +TRACE_EVENT(kvm_hv_syndbg_get_msr, |
|---|
| 1564 | + TP_PROTO(int vcpu_id, u32 vp_index, u32 msr, u64 data), |
|---|
| 1565 | + TP_ARGS(vcpu_id, vp_index, msr, data), |
|---|
| 1566 | + |
|---|
| 1567 | + TP_STRUCT__entry( |
|---|
| 1568 | + __field(int, vcpu_id) |
|---|
| 1569 | + __field(u32, vp_index) |
|---|
| 1570 | + __field(u32, msr) |
|---|
| 1571 | + __field(u64, data) |
|---|
| 1572 | + ), |
|---|
| 1573 | + |
|---|
| 1574 | + TP_fast_assign( |
|---|
| 1575 | + __entry->vcpu_id = vcpu_id; |
|---|
| 1576 | + __entry->vp_index = vp_index; |
|---|
| 1577 | + __entry->msr = msr; |
|---|
| 1578 | + __entry->data = data; |
|---|
| 1579 | + ), |
|---|
| 1580 | + |
|---|
| 1581 | + TP_printk("vcpu_id %d vp_index %u msr 0x%x data 0x%llx", |
|---|
| 1582 | + __entry->vcpu_id, __entry->vp_index, __entry->msr, |
|---|
| 1583 | + __entry->data) |
|---|
| 1584 | +); |
|---|
| 1421 | 1585 | #endif /* _TRACE_KVM_H */ |
|---|
| 1422 | 1586 | |
|---|
| 1423 | 1587 | #undef TRACE_INCLUDE_PATH |
|---|
| 1424 | | -#define TRACE_INCLUDE_PATH arch/x86/kvm |
|---|
| 1588 | +#define TRACE_INCLUDE_PATH ../../arch/x86/kvm |
|---|
| 1425 | 1589 | #undef TRACE_INCLUDE_FILE |
|---|
| 1426 | 1590 | #define TRACE_INCLUDE_FILE trace |
|---|
| 1427 | 1591 | |
|---|