KVM: s390: implement GISA IPM related primitives

"Linux Kernel Mailing List" <[email protected]> Sat, 10 Feb 2018 22:00:22 +0000 (UTC)
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/d77e64141e322a3202de71a4afa7956c98d2a302
Commit:     d77e64141e322a3202de71a4afa7956c98d2a302
Parent:     f3ec471a9832f8365836d70db4d52db9cc4dd6b1
Refname:    refs/heads/master
Author:     Michael Mueller <[email protected]>
AuthorDate: Mon Jun 12 12:37:57 2017 +0200
Committer:  Christian Borntraeger <[email protected]>
CommitDate: Fri Jan 26 11:11:24 2018 +0100

    KVM: s390: implement GISA IPM related primitives
    
    The patch implements routines to access the GISA to test and modify
    its Interruption Pending Mask (IPM) from the host side.
    
    Signed-off-by: Michael Mueller <[email protected]>
    Reviewed-by: Pierre Morel <[email protected]>
    Reviewed-by: Halil Pasic <[email protected]>
    Reviewed-by: Christian Borntraeger <[email protected]>
    Reviewed-by: David Hildenbrand <[email protected]>
    Reviewed-by: Cornelia Huck <[email protected]>
    Signed-off-by: Christian Borntraeger <[email protected]>
---
 arch/s390/kvm/interrupt.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index b731d4fede83..8985ce51f687 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -203,6 +203,34 @@ static inline u8 int_word_to_isc(u32 int_word)
 	return (int_word & 0x38000000) >> 27;
 }
 
+/*
+ * To use atomic bitmap functions, we have to provide a bitmap address
+ * that is u64 aligned. However, the ipm might be u32 aligned.
+ * Therefore, we logically start the bitmap at the very beginning of the
+ * struct and fixup the bit number.
+ */
+#define IPM_BIT_OFFSET (offsetof(struct kvm_s390_gisa, ipm) * BITS_PER_BYTE)
+
+static inline void kvm_s390_gisa_set_ipm_gisc(struct kvm_s390_gisa *gisa, u32 gisc)
+{
+	set_bit_inv(IPM_BIT_OFFSET + gisc, (unsigned long *) gisa);
+}
+
+static inline u8 kvm_s390_gisa_get_ipm(struct kvm_s390_gisa *gisa)
+{
+	return READ_ONCE(gisa->ipm);
+}
+
+static inline void kvm_s390_gisa_clear_ipm_gisc(struct kvm_s390_gisa *gisa, u32 gisc)
+{
+	clear_bit_inv(IPM_BIT_OFFSET + gisc, (unsigned long *) gisa);
+}
+
+static inline int kvm_s390_gisa_tac_ipm_gisc(struct kvm_s390_gisa *gisa, u32 gisc)
+{
+	return test_and_clear_bit_inv(IPM_BIT_OFFSET + gisc, (unsigned long *) gisa);
+}
+
 static inline unsigned long pending_irqs(struct kvm_vcpu *vcpu)
 {
 	return vcpu->kvm->arch.float_int.pending_irqs |
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html