@@ -3796,6 +3796,13 @@ static bool kvm_has_pckmo_ecc(struct kvm *kvm)
37963796
37973797}
37983798
3799+ static bool kvm_has_pckmo_hmac (struct kvm * kvm )
3800+ {
3801+ /* At least one HMAC subfunction must be present */
3802+ return kvm_has_pckmo_subfunc (kvm , 118 ) ||
3803+ kvm_has_pckmo_subfunc (kvm , 122 );
3804+ }
3805+
37993806static void kvm_s390_vcpu_crypto_setup (struct kvm_vcpu * vcpu )
38003807{
38013808 /*
@@ -3808,17 +3815,19 @@ static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)
38083815 vcpu -> arch .sie_block -> crycbd = vcpu -> kvm -> arch .crypto .crycbd ;
38093816 vcpu -> arch .sie_block -> ecb3 &= ~(ECB3_AES | ECB3_DEA );
38103817 vcpu -> arch .sie_block -> eca &= ~ECA_APIE ;
3811- vcpu -> arch .sie_block -> ecd &= ~ECD_ECC ;
3818+ vcpu -> arch .sie_block -> ecd &= ~( ECD_ECC | ECD_HMAC ) ;
38123819
38133820 if (vcpu -> kvm -> arch .crypto .apie )
38143821 vcpu -> arch .sie_block -> eca |= ECA_APIE ;
38153822
38163823 /* Set up protected key support */
38173824 if (vcpu -> kvm -> arch .crypto .aes_kw ) {
38183825 vcpu -> arch .sie_block -> ecb3 |= ECB3_AES ;
3819- /* ecc is also wrapped with AES key */
3826+ /* ecc/hmac is also wrapped with AES key */
38203827 if (kvm_has_pckmo_ecc (vcpu -> kvm ))
38213828 vcpu -> arch .sie_block -> ecd |= ECD_ECC ;
3829+ if (kvm_has_pckmo_hmac (vcpu -> kvm ))
3830+ vcpu -> arch .sie_block -> ecd |= ECD_HMAC ;
38223831 }
38233832
38243833 if (vcpu -> kvm -> arch .crypto .dea_kw )
0 commit comments