diff options
-rw-r--r-- | arch/x86/kvm/svm.c | 10 | ||||
-rw-r--r-- | arch/x86/kvm/trace.h | 22 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 1 |
3 files changed, 32 insertions, 1 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index ba18fb7d3657..8b9f6fbba48c 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -1987,6 +1987,14 @@ static int invlpga_interception(struct vcpu_svm *svm) | |||
1987 | return 1; | 1987 | return 1; |
1988 | } | 1988 | } |
1989 | 1989 | ||
1990 | static int skinit_interception(struct vcpu_svm *svm) | ||
1991 | { | ||
1992 | trace_kvm_skinit(svm->vmcb->save.rip, svm->vcpu.arch.regs[VCPU_REGS_RAX]); | ||
1993 | |||
1994 | kvm_queue_exception(&svm->vcpu, UD_VECTOR); | ||
1995 | return 1; | ||
1996 | } | ||
1997 | |||
1990 | static int invalid_op_interception(struct vcpu_svm *svm) | 1998 | static int invalid_op_interception(struct vcpu_svm *svm) |
1991 | { | 1999 | { |
1992 | kvm_queue_exception(&svm->vcpu, UD_VECTOR); | 2000 | kvm_queue_exception(&svm->vcpu, UD_VECTOR); |
@@ -2350,7 +2358,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm) = { | |||
2350 | [SVM_EXIT_VMSAVE] = vmsave_interception, | 2358 | [SVM_EXIT_VMSAVE] = vmsave_interception, |
2351 | [SVM_EXIT_STGI] = stgi_interception, | 2359 | [SVM_EXIT_STGI] = stgi_interception, |
2352 | [SVM_EXIT_CLGI] = clgi_interception, | 2360 | [SVM_EXIT_CLGI] = clgi_interception, |
2353 | [SVM_EXIT_SKINIT] = invalid_op_interception, | 2361 | [SVM_EXIT_SKINIT] = skinit_interception, |
2354 | [SVM_EXIT_WBINVD] = emulate_on_interception, | 2362 | [SVM_EXIT_WBINVD] = emulate_on_interception, |
2355 | [SVM_EXIT_MONITOR] = invalid_op_interception, | 2363 | [SVM_EXIT_MONITOR] = invalid_op_interception, |
2356 | [SVM_EXIT_MWAIT] = invalid_op_interception, | 2364 | [SVM_EXIT_MWAIT] = invalid_op_interception, |
diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h index 7e1f08e959bc..816e0449db0b 100644 --- a/arch/x86/kvm/trace.h +++ b/arch/x86/kvm/trace.h | |||
@@ -492,6 +492,28 @@ TRACE_EVENT(kvm_invlpga, | |||
492 | TP_printk("rip: 0x%016llx asid: %d address: 0x%016llx\n", | 492 | TP_printk("rip: 0x%016llx asid: %d address: 0x%016llx\n", |
493 | __entry->rip, __entry->asid, __entry->address) | 493 | __entry->rip, __entry->asid, __entry->address) |
494 | ); | 494 | ); |
495 | |||
496 | /* | ||
497 | * Tracepoint for nested #vmexit because of interrupt pending | ||
498 | */ | ||
499 | TRACE_EVENT(kvm_skinit, | ||
500 | TP_PROTO(__u64 rip, __u32 slb), | ||
501 | TP_ARGS(rip, slb), | ||
502 | |||
503 | TP_STRUCT__entry( | ||
504 | __field( __u64, rip ) | ||
505 | __field( __u32, slb ) | ||
506 | ), | ||
507 | |||
508 | TP_fast_assign( | ||
509 | __entry->rip = rip; | ||
510 | __entry->slb = slb; | ||
511 | ), | ||
512 | |||
513 | TP_printk("rip: 0x%016llx slb: 0x%08x\n", | ||
514 | __entry->rip, __entry->slb) | ||
515 | ); | ||
516 | |||
495 | #endif /* _TRACE_KVM_H */ | 517 | #endif /* _TRACE_KVM_H */ |
496 | 518 | ||
497 | /* This part must be outside protection */ | 519 | /* This part must be outside protection */ |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 86596fc7941c..098e7f886306 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -4989,3 +4989,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_vmexit); | |||
4989 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_vmexit_inject); | 4989 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_vmexit_inject); |
4990 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_intr_vmexit); | 4990 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_intr_vmexit); |
4991 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_invlpga); | 4991 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_invlpga); |
4992 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_skinit); | ||