Merge tag 'kvm-s390-next-5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / s390 / include / asm / kvm_host.h
index c2b8c8c..c47e22b 100644 (file)
@@ -591,7 +591,6 @@ struct kvm_s390_float_interrupt {
        struct kvm_s390_mchk_info mchk;
        struct kvm_s390_ext_info srv_signal;
        int next_rr_cpu;
-       unsigned long idle_mask[BITS_TO_LONGS(KVM_MAX_VCPUS)];
        struct mutex ais_lock;
        u8 simm;
        u8 nimm;
@@ -712,6 +711,7 @@ struct s390_io_adapter {
 struct kvm_s390_cpu_model {
        /* facility mask supported by kvm & hosting machine */
        __u64 fac_mask[S390_ARCH_FAC_LIST_SIZE_U64];
+       struct kvm_s390_vm_cpu_subfunc subfuncs;
        /* facility list requested by guest (in dma page) */
        __u64 *fac_list;
        u64 cpuid;
@@ -782,9 +782,21 @@ struct kvm_s390_gisa {
                        u8  reserved03[11];
                        u32 airq_count;
                } g1;
+               struct {
+                       u64 word[4];
+               } u64;
        };
 };
 
+struct kvm_s390_gib {
+       u32 alert_list_origin;
+       u32 reserved01;
+       u8:5;
+       u8  nisc:3;
+       u8  reserved03[3];
+       u32 reserved04[5];
+};
+
 /*
  * sie_page2 has to be allocated as DMA because fac_list, crycb and
  * gisa need 31bit addresses in the sie control block.
@@ -793,7 +805,8 @@ struct sie_page2 {
        __u64 fac_list[S390_ARCH_FAC_LIST_SIZE_U64];    /* 0x0000 */
        struct kvm_s390_crypto_cb crycb;                /* 0x0800 */
        struct kvm_s390_gisa gisa;                      /* 0x0900 */
-       u8 reserved920[0x1000 - 0x920];                 /* 0x0920 */
+       struct kvm *kvm;                                /* 0x0920 */
+       u8 reserved928[0x1000 - 0x928];                 /* 0x0928 */
 };
 
 struct kvm_s390_vsie {
@@ -804,6 +817,20 @@ struct kvm_s390_vsie {
        struct page *pages[KVM_MAX_VCPUS];
 };
 
+struct kvm_s390_gisa_iam {
+       u8 mask;
+       spinlock_t ref_lock;
+       u32 ref_count[MAX_ISC + 1];
+};
+
+struct kvm_s390_gisa_interrupt {
+       struct kvm_s390_gisa *origin;
+       struct kvm_s390_gisa_iam alert;
+       struct hrtimer timer;
+       u64 expires;
+       DECLARE_BITMAP(kicked_mask, KVM_MAX_VCPUS);
+};
+
 struct kvm_arch{
        void *sca;
        int use_esca;
@@ -837,7 +864,8 @@ struct kvm_arch{
        atomic64_t cmma_dirty_pages;
        /* subset of available cpu features enabled by user space */
        DECLARE_BITMAP(cpu_feat, KVM_S390_VM_CPU_FEAT_NR_BITS);
-       struct kvm_s390_gisa *gisa;
+       DECLARE_BITMAP(idle_mask, KVM_MAX_VCPUS);
+       struct kvm_s390_gisa_interrupt gisa_int;
 };
 
 #define KVM_HVA_ERR_BAD                (-1UL)
@@ -871,6 +899,9 @@ void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
 extern int sie64a(struct kvm_s390_sie_block *, u64 *);
 extern char sie_exit;
 
+extern int kvm_s390_gisc_register(struct kvm *kvm, u32 gisc);
+extern int kvm_s390_gisc_unregister(struct kvm *kvm, u32 gisc);
+
 static inline void kvm_arch_hardware_disable(void) {}
 static inline void kvm_arch_check_processor_compat(void *rtn) {}
 static inline void kvm_arch_sync_events(struct kvm *kvm) {}