KVM: s390: device attrs to enable/disable AP interpretation
Introduces two new VM crypto device attributes (KVM_S390_VM_CRYPTO) to enable or disable AP instruction interpretation from userspace via the KVM_SET_DEVICE_ATTR ioctl: * The KVM_S390_VM_CRYPTO_ENABLE_APIE attribute enables hardware interpretation of AP instructions executed on the guest. * The KVM_S390_VM_CRYPTO_DISABLE_APIE attribute disables hardware interpretation of AP instructions executed on the guest. In this case the instructions will be intercepted and pass through to the guest. Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Message-Id: <20180925231641.4954-25-akrowiak@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
parent
9ee71f20cb
commit
37940fb0b6
|
@ -160,6 +160,8 @@ struct kvm_s390_vm_cpu_subfunc {
|
||||||
#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1
|
#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1
|
||||||
#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW 2
|
#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW 2
|
||||||
#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW 3
|
#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW 3
|
||||||
|
#define KVM_S390_VM_CRYPTO_ENABLE_APIE 4
|
||||||
|
#define KVM_S390_VM_CRYPTO_DISABLE_APIE 5
|
||||||
|
|
||||||
/* kvm attributes for migration mode */
|
/* kvm attributes for migration mode */
|
||||||
#define KVM_S390_VM_MIGRATION_STOP 0
|
#define KVM_S390_VM_MIGRATION_STOP 0
|
||||||
|
|
|
@ -856,12 +856,11 @@ void kvm_s390_vcpu_crypto_reset_all(struct kvm *kvm)
|
||||||
|
|
||||||
static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct kvm_device_attr *attr)
|
static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||||
{
|
{
|
||||||
if (!test_kvm_facility(kvm, 76))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
mutex_lock(&kvm->lock);
|
mutex_lock(&kvm->lock);
|
||||||
switch (attr->attr) {
|
switch (attr->attr) {
|
||||||
case KVM_S390_VM_CRYPTO_ENABLE_AES_KW:
|
case KVM_S390_VM_CRYPTO_ENABLE_AES_KW:
|
||||||
|
if (!test_kvm_facility(kvm, 76))
|
||||||
|
return -EINVAL;
|
||||||
get_random_bytes(
|
get_random_bytes(
|
||||||
kvm->arch.crypto.crycb->aes_wrapping_key_mask,
|
kvm->arch.crypto.crycb->aes_wrapping_key_mask,
|
||||||
sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
|
sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
|
||||||
|
@ -869,6 +868,8 @@ static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||||
VM_EVENT(kvm, 3, "%s", "ENABLE: AES keywrapping support");
|
VM_EVENT(kvm, 3, "%s", "ENABLE: AES keywrapping support");
|
||||||
break;
|
break;
|
||||||
case KVM_S390_VM_CRYPTO_ENABLE_DEA_KW:
|
case KVM_S390_VM_CRYPTO_ENABLE_DEA_KW:
|
||||||
|
if (!test_kvm_facility(kvm, 76))
|
||||||
|
return -EINVAL;
|
||||||
get_random_bytes(
|
get_random_bytes(
|
||||||
kvm->arch.crypto.crycb->dea_wrapping_key_mask,
|
kvm->arch.crypto.crycb->dea_wrapping_key_mask,
|
||||||
sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
|
sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
|
||||||
|
@ -876,17 +877,35 @@ static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||||
VM_EVENT(kvm, 3, "%s", "ENABLE: DEA keywrapping support");
|
VM_EVENT(kvm, 3, "%s", "ENABLE: DEA keywrapping support");
|
||||||
break;
|
break;
|
||||||
case KVM_S390_VM_CRYPTO_DISABLE_AES_KW:
|
case KVM_S390_VM_CRYPTO_DISABLE_AES_KW:
|
||||||
|
if (!test_kvm_facility(kvm, 76))
|
||||||
|
return -EINVAL;
|
||||||
kvm->arch.crypto.aes_kw = 0;
|
kvm->arch.crypto.aes_kw = 0;
|
||||||
memset(kvm->arch.crypto.crycb->aes_wrapping_key_mask, 0,
|
memset(kvm->arch.crypto.crycb->aes_wrapping_key_mask, 0,
|
||||||
sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
|
sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
|
||||||
VM_EVENT(kvm, 3, "%s", "DISABLE: AES keywrapping support");
|
VM_EVENT(kvm, 3, "%s", "DISABLE: AES keywrapping support");
|
||||||
break;
|
break;
|
||||||
case KVM_S390_VM_CRYPTO_DISABLE_DEA_KW:
|
case KVM_S390_VM_CRYPTO_DISABLE_DEA_KW:
|
||||||
|
if (!test_kvm_facility(kvm, 76))
|
||||||
|
return -EINVAL;
|
||||||
kvm->arch.crypto.dea_kw = 0;
|
kvm->arch.crypto.dea_kw = 0;
|
||||||
memset(kvm->arch.crypto.crycb->dea_wrapping_key_mask, 0,
|
memset(kvm->arch.crypto.crycb->dea_wrapping_key_mask, 0,
|
||||||
sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
|
sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
|
||||||
VM_EVENT(kvm, 3, "%s", "DISABLE: DEA keywrapping support");
|
VM_EVENT(kvm, 3, "%s", "DISABLE: DEA keywrapping support");
|
||||||
break;
|
break;
|
||||||
|
case KVM_S390_VM_CRYPTO_ENABLE_APIE:
|
||||||
|
if (!ap_instructions_available()) {
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
kvm->arch.crypto.apie = 1;
|
||||||
|
break;
|
||||||
|
case KVM_S390_VM_CRYPTO_DISABLE_APIE:
|
||||||
|
if (!ap_instructions_available()) {
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
kvm->arch.crypto.apie = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
mutex_unlock(&kvm->lock);
|
mutex_unlock(&kvm->lock);
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
@ -1495,6 +1514,10 @@ static int kvm_s390_vm_has_attr(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||||
case KVM_S390_VM_CRYPTO_DISABLE_DEA_KW:
|
case KVM_S390_VM_CRYPTO_DISABLE_DEA_KW:
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
|
case KVM_S390_VM_CRYPTO_ENABLE_APIE:
|
||||||
|
case KVM_S390_VM_CRYPTO_DISABLE_APIE:
|
||||||
|
ret = ap_instructions_available() ? 0 : -ENXIO;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -ENXIO;
|
ret = -ENXIO;
|
||||||
break;
|
break;
|
||||||
|
@ -2601,6 +2624,7 @@ static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
vcpu->arch.sie_block->crycbd = vcpu->kvm->arch.crypto.crycbd;
|
vcpu->arch.sie_block->crycbd = vcpu->kvm->arch.crypto.crycbd;
|
||||||
vcpu->arch.sie_block->ecb3 &= ~(ECB3_AES | ECB3_DEA);
|
vcpu->arch.sie_block->ecb3 &= ~(ECB3_AES | ECB3_DEA);
|
||||||
|
vcpu->arch.sie_block->eca &= ~ECA_APIE;
|
||||||
|
|
||||||
if (vcpu->kvm->arch.crypto.apie)
|
if (vcpu->kvm->arch.crypto.apie)
|
||||||
vcpu->arch.sie_block->eca |= ECA_APIE;
|
vcpu->arch.sie_block->eca |= ECA_APIE;
|
||||||
|
|
Loading…
Reference in New Issue