diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 03ba402c476a..63afca1c295f 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -832,6 +832,9 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
832 | case KVM_CAP_NR_MEMSLOTS: | 832 | case KVM_CAP_NR_MEMSLOTS: |
833 | r = KVM_MEMORY_SLOTS; | 833 | r = KVM_MEMORY_SLOTS; |
834 | break; | 834 | break; |
835 | case KVM_CAP_PV_MMU: | ||
836 | r = !tdp_enabled; | ||
837 | break; | ||
835 | default: | 838 | default: |
836 | r = 0; | 839 | r = 0; |
837 | break; | 840 | break; |
@@ -2452,9 +2455,19 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu) | |||
2452 | } | 2455 | } |
2453 | EXPORT_SYMBOL_GPL(kvm_emulate_halt); | 2456 | EXPORT_SYMBOL_GPL(kvm_emulate_halt); |
2454 | 2457 | ||
2458 | static inline gpa_t hc_gpa(struct kvm_vcpu *vcpu, unsigned long a0, | ||
2459 | unsigned long a1) | ||
2460 | { | ||
2461 | if (is_long_mode(vcpu)) | ||
2462 | return a0; | ||
2463 | else | ||
2464 | return a0 | ((gpa_t)a1 << 32); | ||
2465 | } | ||
2466 | |||
2455 | int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) | 2467 | int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) |
2456 | { | 2468 | { |
2457 | unsigned long nr, a0, a1, a2, a3, ret; | 2469 | unsigned long nr, a0, a1, a2, a3, ret; |
2470 | int r = 1; | ||
2458 | 2471 | ||
2459 | kvm_x86_ops->cache_regs(vcpu); | 2472 | kvm_x86_ops->cache_regs(vcpu); |
2460 | 2473 | ||
@@ -2476,6 +2489,9 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) | |||
2476 | case KVM_HC_VAPIC_POLL_IRQ: | 2489 | case KVM_HC_VAPIC_POLL_IRQ: |
2477 | ret = 0; | 2490 | ret = 0; |
2478 | break; | 2491 | break; |
2492 | case KVM_HC_MMU_OP: | ||
2493 | r = kvm_pv_mmu_op(vcpu, a0, hc_gpa(vcpu, a1, a2), &ret); | ||
2494 | break; | ||
2479 | default: | 2495 | default: |
2480 | ret = -KVM_ENOSYS; | 2496 | ret = -KVM_ENOSYS; |
2481 | break; | 2497 | break; |
@@ -2483,7 +2499,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) | |||
2483 | vcpu->arch.regs[VCPU_REGS_RAX] = ret; | 2499 | vcpu->arch.regs[VCPU_REGS_RAX] = ret; |
2484 | kvm_x86_ops->decache_regs(vcpu); | 2500 | kvm_x86_ops->decache_regs(vcpu); |
2485 | ++vcpu->stat.hypercalls; | 2501 | ++vcpu->stat.hypercalls; |
2486 | return 0; | 2502 | return r; |
2487 | } | 2503 | } |
2488 | EXPORT_SYMBOL_GPL(kvm_emulate_hypercall); | 2504 | EXPORT_SYMBOL_GPL(kvm_emulate_hypercall); |
2489 | 2505 | ||