KVM: MIPS: Add callback to check extension
authorJames Hogan <james.hogan@imgtec.com>
Tue, 14 Mar 2017 10:15:22 +0000 (10:15 +0000)
committerJames Hogan <james.hogan@imgtec.com>
Tue, 28 Mar 2017 13:53:48 +0000 (14:53 +0100)
Add an implementation callback for checking presence of KVM extensions.
This allows implementation specific extensions to be provided without
ifdefs in mips.c.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
arch/mips/include/asm/kvm_host.h
arch/mips/kvm/mips.c
arch/mips/kvm/trap_emul.c

index f0227c0d27801c3c1174da40977dc6dfbfb5ac28..3a52a6f0573b6f4c7af3cbfe5813701431672449 100644 (file)
@@ -542,6 +542,7 @@ struct kvm_mips_callbacks {
        int (*handle_msa_fpe)(struct kvm_vcpu *vcpu);
        int (*handle_fpe)(struct kvm_vcpu *vcpu);
        int (*handle_msa_disabled)(struct kvm_vcpu *vcpu);
+       int (*check_extension)(struct kvm *kvm, long ext);
        int (*vcpu_init)(struct kvm_vcpu *vcpu);
        void (*vcpu_uninit)(struct kvm_vcpu *vcpu);
        int (*vcpu_setup)(struct kvm_vcpu *vcpu);
index 36561df8a7a792985b2e6c2be17ccc7d1db59574..78d58c2528a9b2029aa4df5dddc29e988b80d678 100644 (file)
@@ -1043,7 +1043,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
        case KVM_CAP_READONLY_MEM:
        case KVM_CAP_SYNC_MMU:
        case KVM_CAP_IMMEDIATE_EXIT:
-       case KVM_CAP_MIPS_TE:
                r = 1;
                break;
        case KVM_CAP_COALESCED_MMIO:
@@ -1075,7 +1074,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
                r = cpu_has_msa && !(boot_cpu_data.msa_id & MSA_IR_WRPF);
                break;
        default:
-               r = 0;
+               r = kvm_mips_callbacks->check_extension(kvm, ext);
                break;
        }
        return r;
index 0e3d260aafcb5e3422c9fe59c644c6db7cf89019..db3c48634eda1cd849a76aa6fb3fa6c2c33e5147 100644 (file)
@@ -488,6 +488,22 @@ static int kvm_trap_emul_handle_msa_disabled(struct kvm_vcpu *vcpu)
        return ret;
 }
 
+static int kvm_trap_emul_check_extension(struct kvm *kvm, long ext)
+{
+       int r;
+
+       switch (ext) {
+       case KVM_CAP_MIPS_TE:
+               r = 1;
+               break;
+       default:
+               r = 0;
+               break;
+       }
+
+       return r;
+}
+
 static int kvm_trap_emul_vcpu_init(struct kvm_vcpu *vcpu)
 {
        struct mm_struct *kern_mm = &vcpu->arch.guest_kernel_mm;
@@ -1238,6 +1254,7 @@ static struct kvm_mips_callbacks kvm_trap_emul_callbacks = {
        .handle_fpe = kvm_trap_emul_handle_fpe,
        .handle_msa_disabled = kvm_trap_emul_handle_msa_disabled,
 
+       .check_extension = kvm_trap_emul_check_extension,
        .vcpu_init = kvm_trap_emul_vcpu_init,
        .vcpu_uninit = kvm_trap_emul_vcpu_uninit,
        .vcpu_setup = kvm_trap_emul_vcpu_setup,