Blob Blame History Raw
From: Farhan Ali <alifm@linux.ibm.com>
Subject: KVM: s390: interface to clear CRYCB masks
Patch-mainline: v4.20-rc1
Git-commit: 42104598ef2e8c3ce532ebec891c9edec161e508
References: FATE#326370, LTC#169186, bsc#1113483

Summary:     kernel: AP Crypto Passthrough 
Description: This adds support for AP crypto passthrough for 
             kvm guests.

Upstream-Description:

             KVM: s390: interface to clear CRYCB masks

             Introduces a new KVM function to clear the APCB0 and APCB1 in the guest's
             CRYCB. This effectively clears all bits of the APM, AQM and ADM masks
             configured for the guest. The VCPUs are taken out of SIE to ensure the
             VCPUs do not get out of sync.

             Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
             Acked-by: Halil Pasic <pasic@linux.ibm.com>
             Tested-by: Michael Mueller <mimu@linux.ibm.com>
             Tested-by: Farhan Ali <alifm@linux.ibm.com>
             Tested-by: Pierre Morel <pmorel@linux.ibm.com>
             Reviewed-by: Cornelia Huck <cohuck@redhat.com>
             Message-Id: <20180925231641.4954-11-akrowiak@linux.vnet.ibm.com>
             Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>

Signed-off-by: Farhan Ali <alifm@linux.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 arch/s390/include/asm/kvm_host.h |    2 ++
 arch/s390/kvm/kvm-s390.c         |   15 +++++++++++++++
 2 files changed, 17 insertions(+)

--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -793,6 +810,8 @@ void kvm_arch_async_page_not_present(str
 void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
 				 struct kvm_async_pf *work);
 
+void kvm_arch_crypto_clear_masks(struct kvm *kvm);
+
 extern int sie64a(struct kvm_s390_sie_block *, u64 *);
 extern char sie_exit;
 
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1941,6 +1941,21 @@ static void kvm_s390_set_crycb_format(st
 		kvm->arch.crypto.crycbd |= CRYCB_FORMAT1;
 }
 
+void kvm_arch_crypto_clear_masks(struct kvm *kvm)
+{
+	mutex_lock(&kvm->lock);
+	kvm_s390_vcpu_block_all(kvm);
+
+	memset(&kvm->arch.crypto.crycb->apcb0, 0,
+	       sizeof(kvm->arch.crypto.crycb->apcb0));
+	memset(&kvm->arch.crypto.crycb->apcb1, 0,
+	       sizeof(kvm->arch.crypto.crycb->apcb1));
+
+	kvm_s390_vcpu_unblock_all(kvm);
+	mutex_unlock(&kvm->lock);
+}
+EXPORT_SYMBOL_GPL(kvm_arch_crypto_clear_masks);
+
 static u64 kvm_s390_get_initial_cpuid(void)
 {
 	struct cpuid cpuid;