aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/mmu.c1
-rw-r--r--arch/x86/kvm/vmx.c1
-rw-r--r--include/linux/kvm.h4
-rw-r--r--virt/kvm/kvm_main.c1
4 files changed, 7 insertions, 0 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index a9024797b21f..4c3e5b2314cb 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -2800,6 +2800,7 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u32 error_code)
2800 case EMULATE_FAIL: 2800 case EMULATE_FAIL:
2801 vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR; 2801 vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
2802 vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION; 2802 vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
2803 vcpu->run->internal.ndata = 0;
2803 return 0; 2804 return 0;
2804 default: 2805 default:
2805 BUG(); 2806 BUG();
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index c9cc9596e1a6..c0e66dd58a47 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -3352,6 +3352,7 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu)
3352 kvm_report_emulation_failure(vcpu, "emulation failure"); 3352 kvm_report_emulation_failure(vcpu, "emulation failure");
3353 vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR; 3353 vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
3354 vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION; 3354 vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
3355 vcpu->run->internal.ndata = 0;
3355 ret = 0; 3356 ret = 0;
3356 goto out; 3357 goto out;
3357 } 3358 }
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index ca62b8e056f9..172639e94392 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -251,6 +251,9 @@ struct kvm_run {
251 } dcr; 251 } dcr;
252 struct { 252 struct {
253 __u32 suberror; 253 __u32 suberror;
254 /* Available with KVM_CAP_INTERNAL_ERROR_DATA: */
255 __u32 ndata;
256 __u64 data[16];
254 } internal; 257 } internal;
255 /* Fix the size of the union. */ 258 /* Fix the size of the union. */
256 char padding[256]; 259 char padding[256];
@@ -484,6 +487,7 @@ struct kvm_ioeventfd {
484#define KVM_CAP_XEN_HVM 38 487#define KVM_CAP_XEN_HVM 38
485#endif 488#endif
486#define KVM_CAP_ADJUST_CLOCK 39 489#define KVM_CAP_ADJUST_CLOCK 39
490#define KVM_CAP_INTERNAL_ERROR_DATA 40
487 491
488#ifdef KVM_CAP_IRQ_ROUTING 492#ifdef KVM_CAP_IRQ_ROUTING
489 493
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index bd44fb48ac43..f92ba138007a 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1653,6 +1653,7 @@ static long kvm_dev_ioctl_check_extension_generic(long arg)
1653#ifdef CONFIG_KVM_APIC_ARCHITECTURE 1653#ifdef CONFIG_KVM_APIC_ARCHITECTURE
1654 case KVM_CAP_SET_BOOT_CPU_ID: 1654 case KVM_CAP_SET_BOOT_CPU_ID:
1655#endif 1655#endif
1656 case KVM_CAP_INTERNAL_ERROR_DATA:
1656 return 1; 1657 return 1;
1657#ifdef CONFIG_HAVE_KVM_IRQCHIP 1658#ifdef CONFIG_HAVE_KVM_IRQCHIP
1658 case KVM_CAP_IRQ_ROUTING: 1659 case KVM_CAP_IRQ_ROUTING: