]> Pileus Git - ~andy/linux/blobdiff - arch/powerpc/include/asm/kvm_ppc.h
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[~andy/linux] / arch / powerpc / include / asm / kvm_ppc.h
index b15554a26c20b8fd6bd25896164e91f91e27c5a4..c8317fbf92c470f03842da5cf363efd97aed99b4 100644 (file)
@@ -106,13 +106,6 @@ extern void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
                                        struct kvm_interrupt *irq);
 extern void kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu);
 extern void kvmppc_core_flush_tlb(struct kvm_vcpu *vcpu);
-
-extern int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
-                                  unsigned int op, int *advance);
-extern int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn,
-                                    ulong val);
-extern int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn,
-                                    ulong *val);
 extern int kvmppc_core_check_requests(struct kvm_vcpu *vcpu);
 
 extern int kvmppc_booke_init(void);
@@ -135,17 +128,17 @@ extern long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
                                struct kvm_create_spapr_tce *args);
 extern long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
                             unsigned long ioba, unsigned long tce);
-extern long kvm_vm_ioctl_allocate_rma(struct kvm *kvm,
-                               struct kvm_allocate_rma *rma);
 extern struct kvm_rma_info *kvm_alloc_rma(void);
 extern void kvm_release_rma(struct kvm_rma_info *ri);
 extern struct page *kvm_alloc_hpt(unsigned long nr_pages);
 extern void kvm_release_hpt(struct page *page, unsigned long nr_pages);
 extern int kvmppc_core_init_vm(struct kvm *kvm);
 extern void kvmppc_core_destroy_vm(struct kvm *kvm);
-extern void kvmppc_core_free_memslot(struct kvm_memory_slot *free,
+extern void kvmppc_core_free_memslot(struct kvm *kvm,
+                                    struct kvm_memory_slot *free,
                                     struct kvm_memory_slot *dont);
-extern int kvmppc_core_create_memslot(struct kvm_memory_slot *slot,
+extern int kvmppc_core_create_memslot(struct kvm *kvm,
+                                     struct kvm_memory_slot *slot,
                                      unsigned long npages);
 extern int kvmppc_core_prepare_memory_region(struct kvm *kvm,
                                struct kvm_memory_slot *memslot,
@@ -177,6 +170,72 @@ extern int kvmppc_xics_get_xive(struct kvm *kvm, u32 irq, u32 *server,
 extern int kvmppc_xics_int_on(struct kvm *kvm, u32 irq);
 extern int kvmppc_xics_int_off(struct kvm *kvm, u32 irq);
 
+union kvmppc_one_reg {
+       u32     wval;
+       u64     dval;
+       vector128 vval;
+       u64     vsxval[2];
+       struct {
+               u64     addr;
+               u64     length;
+       }       vpaval;
+};
+
+struct kvmppc_ops {
+       struct module *owner;
+       int (*get_sregs)(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
+       int (*set_sregs)(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
+       int (*get_one_reg)(struct kvm_vcpu *vcpu, u64 id,
+                          union kvmppc_one_reg *val);
+       int (*set_one_reg)(struct kvm_vcpu *vcpu, u64 id,
+                          union kvmppc_one_reg *val);
+       void (*vcpu_load)(struct kvm_vcpu *vcpu, int cpu);
+       void (*vcpu_put)(struct kvm_vcpu *vcpu);
+       void (*set_msr)(struct kvm_vcpu *vcpu, u64 msr);
+       int (*vcpu_run)(struct kvm_run *run, struct kvm_vcpu *vcpu);
+       struct kvm_vcpu *(*vcpu_create)(struct kvm *kvm, unsigned int id);
+       void (*vcpu_free)(struct kvm_vcpu *vcpu);
+       int (*check_requests)(struct kvm_vcpu *vcpu);
+       int (*get_dirty_log)(struct kvm *kvm, struct kvm_dirty_log *log);
+       void (*flush_memslot)(struct kvm *kvm, struct kvm_memory_slot *memslot);
+       int (*prepare_memory_region)(struct kvm *kvm,
+                                    struct kvm_memory_slot *memslot,
+                                    struct kvm_userspace_memory_region *mem);
+       void (*commit_memory_region)(struct kvm *kvm,
+                                    struct kvm_userspace_memory_region *mem,
+                                    const struct kvm_memory_slot *old);
+       int (*unmap_hva)(struct kvm *kvm, unsigned long hva);
+       int (*unmap_hva_range)(struct kvm *kvm, unsigned long start,
+                          unsigned long end);
+       int (*age_hva)(struct kvm *kvm, unsigned long hva);
+       int (*test_age_hva)(struct kvm *kvm, unsigned long hva);
+       void (*set_spte_hva)(struct kvm *kvm, unsigned long hva, pte_t pte);
+       void (*mmu_destroy)(struct kvm_vcpu *vcpu);
+       void (*free_memslot)(struct kvm_memory_slot *free,
+                            struct kvm_memory_slot *dont);
+       int (*create_memslot)(struct kvm_memory_slot *slot,
+                             unsigned long npages);
+       int (*init_vm)(struct kvm *kvm);
+       void (*destroy_vm)(struct kvm *kvm);
+       int (*get_smmu_info)(struct kvm *kvm, struct kvm_ppc_smmu_info *info);
+       int (*emulate_op)(struct kvm_run *run, struct kvm_vcpu *vcpu,
+                         unsigned int inst, int *advance);
+       int (*emulate_mtspr)(struct kvm_vcpu *vcpu, int sprn, ulong spr_val);
+       int (*emulate_mfspr)(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val);
+       void (*fast_vcpu_kick)(struct kvm_vcpu *vcpu);
+       long (*arch_vm_ioctl)(struct file *filp, unsigned int ioctl,
+                             unsigned long arg);
+
+};
+
+extern struct kvmppc_ops *kvmppc_hv_ops;
+extern struct kvmppc_ops *kvmppc_pr_ops;
+
+static inline bool is_kvmppc_hv_enabled(struct kvm *kvm)
+{
+       return kvm->arch.kvm_ops == kvmppc_hv_ops;
+}
+
 /*
  * Cuts out inst bits with ordering according to spec.
  * That means the leftmost bit is zero. All given bits are included.
@@ -210,17 +269,6 @@ static inline u32 kvmppc_set_field(u64 inst, int msb, int lsb, int value)
        return r;
 }
 
-union kvmppc_one_reg {
-       u32     wval;
-       u64     dval;
-       vector128 vval;
-       u64     vsxval[2];
-       struct {
-               u64     addr;
-               u64     length;
-       }       vpaval;
-};
-
 #define one_reg_size(id)       \
        (1ul << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
 
@@ -245,10 +293,10 @@ union kvmppc_one_reg {
        __v;                                    \
 })
 
-void kvmppc_core_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
+int kvmppc_core_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
 int kvmppc_core_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
 
-void kvmppc_get_sregs_ivor(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
+int kvmppc_get_sregs_ivor(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
 int kvmppc_set_sregs_ivor(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
 
 int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg);
@@ -260,7 +308,7 @@ void kvmppc_set_pid(struct kvm_vcpu *vcpu, u32 pid);
 
 struct openpic;
 
-#ifdef CONFIG_KVM_BOOK3S_64_HV
+#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 extern void kvm_cma_reserve(void) __init;
 static inline void kvmppc_set_xics_phys(int cpu, unsigned long addr)
 {
@@ -269,10 +317,10 @@ static inline void kvmppc_set_xics_phys(int cpu, unsigned long addr)
 
 static inline u32 kvmppc_get_xics_latch(void)
 {
-       u32 xirr = get_paca()->kvm_hstate.saved_xirr;
+       u32 xirr;
 
+       xirr = get_paca()->kvm_hstate.saved_xirr;
        get_paca()->kvm_hstate.saved_xirr = 0;
-
        return xirr;
 }
 
@@ -281,7 +329,10 @@ static inline void kvmppc_set_host_ipi(int cpu, u8 host_ipi)
        paca[cpu].kvm_hstate.host_ipi = host_ipi;
 }
 
-extern void kvmppc_fast_vcpu_kick(struct kvm_vcpu *vcpu);
+static inline void kvmppc_fast_vcpu_kick(struct kvm_vcpu *vcpu)
+{
+       vcpu->kvm->arch.kvm_ops->fast_vcpu_kick(vcpu);
+}
 
 #else
 static inline void __init kvm_cma_reserve(void)