|
@@ -2299,11 +2299,26 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
|
error_setg(errp, "KVM: host CPU model could not be identified");
|
|
error_setg(errp, "KVM: host CPU model could not be identified");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ /* for now, we can only provide the AP feature with HW support */
|
|
|
|
+ if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
|
|
|
|
+ KVM_S390_VM_CRYPTO_ENABLE_APIE)) {
|
|
|
|
+ set_bit(S390_FEAT_AP, model->features);
|
|
|
|
+ }
|
|
/* strip of features that are not part of the maximum model */
|
|
/* strip of features that are not part of the maximum model */
|
|
bitmap_and(model->features, model->features, model->def->full_feat,
|
|
bitmap_and(model->features, model->features, model->def->full_feat,
|
|
S390_FEAT_MAX);
|
|
S390_FEAT_MAX);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void kvm_s390_configure_apie(bool interpret)
|
|
|
|
+{
|
|
|
|
+ uint64_t attr = interpret ? KVM_S390_VM_CRYPTO_ENABLE_APIE :
|
|
|
|
+ KVM_S390_VM_CRYPTO_DISABLE_APIE;
|
|
|
|
+
|
|
|
|
+ if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
|
|
|
|
+ kvm_s390_set_attr(attr);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
|
void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
|
{
|
|
{
|
|
struct kvm_s390_vm_cpu_processor prop = {
|
|
struct kvm_s390_vm_cpu_processor prop = {
|
|
@@ -2353,6 +2368,10 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
|
if (test_bit(S390_FEAT_CMM, model->features)) {
|
|
if (test_bit(S390_FEAT_CMM, model->features)) {
|
|
kvm_s390_enable_cmma();
|
|
kvm_s390_enable_cmma();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (test_bit(S390_FEAT_AP, model->features)) {
|
|
|
|
+ kvm_s390_configure_apie(true);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void kvm_s390_restart_interrupt(S390CPU *cpu)
|
|
void kvm_s390_restart_interrupt(S390CPU *cpu)
|