@@ -3799,6 +3799,13 @@ static bool kvm_has_pckmo_ecc(struct kvm *kvm)
37993799
38003800}
38013801
3802+ static bool kvm_has_pckmo_hmac (struct kvm * kvm )
3803+ {
3804+ /* At least one HMAC subfunction must be present */
3805+ return kvm_has_pckmo_subfunc (kvm , 118 ) ||
3806+ kvm_has_pckmo_subfunc (kvm , 122 );
3807+ }
3808+
38023809static void kvm_s390_vcpu_crypto_setup (struct kvm_vcpu * vcpu )
38033810{
38043811 /*
@@ -3811,17 +3818,19 @@ static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)
38113818 vcpu -> arch .sie_block -> crycbd = vcpu -> kvm -> arch .crypto .crycbd ;
38123819 vcpu -> arch .sie_block -> ecb3 &= ~(ECB3_AES | ECB3_DEA );
38133820 vcpu -> arch .sie_block -> eca &= ~ECA_APIE ;
3814- vcpu -> arch .sie_block -> ecd &= ~ECD_ECC ;
3821+ vcpu -> arch .sie_block -> ecd &= ~( ECD_ECC | ECD_HMAC ) ;
38153822
38163823 if (vcpu -> kvm -> arch .crypto .apie )
38173824 vcpu -> arch .sie_block -> eca |= ECA_APIE ;
38183825
38193826 /* Set up protected key support */
38203827 if (vcpu -> kvm -> arch .crypto .aes_kw ) {
38213828 vcpu -> arch .sie_block -> ecb3 |= ECB3_AES ;
3822- /* ecc is also wrapped with AES key */
3829+ /* ecc/hmac is also wrapped with AES key */
38233830 if (kvm_has_pckmo_ecc (vcpu -> kvm ))
38243831 vcpu -> arch .sie_block -> ecd |= ECD_ECC ;
3832+ if (kvm_has_pckmo_hmac (vcpu -> kvm ))
3833+ vcpu -> arch .sie_block -> ecd |= ECD_HMAC ;
38253834 }
38263835
38273836 if (vcpu -> kvm -> arch .crypto .dea_kw )
0 commit comments