diff options
| -rw-r--r-- | arch/s390/include/asm/kvm_host.h | 12 | ||||
| -rw-r--r-- | arch/s390/kvm/kvm-s390.c | 68 | ||||
| -rw-r--r-- | arch/s390/kvm/kvm-s390.h | 3 | ||||
| -rw-r--r-- | arch/s390/kvm/priv.c | 2 |
4 files changed, 40 insertions, 45 deletions
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index d84559e31f32..f407bbf5ee94 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
| @@ -515,15 +515,15 @@ struct s390_io_adapter { | |||
| 515 | #define S390_ARCH_FAC_MASK_SIZE_U64 \ | 515 | #define S390_ARCH_FAC_MASK_SIZE_U64 \ |
| 516 | (S390_ARCH_FAC_MASK_SIZE_BYTE / sizeof(u64)) | 516 | (S390_ARCH_FAC_MASK_SIZE_BYTE / sizeof(u64)) |
| 517 | 517 | ||
| 518 | struct s390_model_fac { | 518 | struct kvm_s390_fac { |
| 519 | /* facilities used in SIE context */ | 519 | /* facility list requested by guest */ |
| 520 | __u64 sie[S390_ARCH_FAC_LIST_SIZE_U64]; | 520 | __u64 list[S390_ARCH_FAC_LIST_SIZE_U64]; |
| 521 | /* subset enabled by kvm */ | 521 | /* facility mask supported by kvm & hosting machine */ |
| 522 | __u64 kvm[S390_ARCH_FAC_LIST_SIZE_U64]; | 522 | __u64 mask[S390_ARCH_FAC_LIST_SIZE_U64]; |
| 523 | }; | 523 | }; |
| 524 | 524 | ||
| 525 | struct kvm_s390_cpu_model { | 525 | struct kvm_s390_cpu_model { |
| 526 | struct s390_model_fac *fac; | 526 | struct kvm_s390_fac *fac; |
| 527 | struct cpuid cpu_id; | 527 | struct cpuid cpu_id; |
| 528 | unsigned short ibc; | 528 | unsigned short ibc; |
| 529 | }; | 529 | }; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 0c3623927563..f6579cfde2df 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
| @@ -522,7 +522,7 @@ static int kvm_s390_set_processor(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 522 | memcpy(&kvm->arch.model.cpu_id, &proc->cpuid, | 522 | memcpy(&kvm->arch.model.cpu_id, &proc->cpuid, |
| 523 | sizeof(struct cpuid)); | 523 | sizeof(struct cpuid)); |
| 524 | kvm->arch.model.ibc = proc->ibc; | 524 | kvm->arch.model.ibc = proc->ibc; |
| 525 | memcpy(kvm->arch.model.fac->kvm, proc->fac_list, | 525 | memcpy(kvm->arch.model.fac->list, proc->fac_list, |
| 526 | S390_ARCH_FAC_LIST_SIZE_BYTE); | 526 | S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 527 | } else | 527 | } else |
| 528 | ret = -EFAULT; | 528 | ret = -EFAULT; |
| @@ -556,7 +556,7 @@ static int kvm_s390_get_processor(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 556 | } | 556 | } |
| 557 | memcpy(&proc->cpuid, &kvm->arch.model.cpu_id, sizeof(struct cpuid)); | 557 | memcpy(&proc->cpuid, &kvm->arch.model.cpu_id, sizeof(struct cpuid)); |
| 558 | proc->ibc = kvm->arch.model.ibc; | 558 | proc->ibc = kvm->arch.model.ibc; |
| 559 | memcpy(&proc->fac_list, kvm->arch.model.fac->kvm, S390_ARCH_FAC_LIST_SIZE_BYTE); | 559 | memcpy(&proc->fac_list, kvm->arch.model.fac->list, S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 560 | if (copy_to_user((void __user *)attr->addr, proc, sizeof(*proc))) | 560 | if (copy_to_user((void __user *)attr->addr, proc, sizeof(*proc))) |
| 561 | ret = -EFAULT; | 561 | ret = -EFAULT; |
| 562 | kfree(proc); | 562 | kfree(proc); |
| @@ -576,10 +576,10 @@ static int kvm_s390_get_machine(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 576 | } | 576 | } |
| 577 | get_cpu_id((struct cpuid *) &mach->cpuid); | 577 | get_cpu_id((struct cpuid *) &mach->cpuid); |
| 578 | mach->ibc = sclp_get_ibc(); | 578 | mach->ibc = sclp_get_ibc(); |
| 579 | memcpy(&mach->fac_mask, kvm_s390_fac_list_mask, | 579 | memcpy(&mach->fac_mask, kvm->arch.model.fac->mask, |
| 580 | kvm_s390_fac_list_mask_size() * sizeof(u64)); | 580 | S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 581 | memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list, | 581 | memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list, |
| 582 | S390_ARCH_FAC_LIST_SIZE_U64); | 582 | S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 583 | if (copy_to_user((void __user *)attr->addr, mach, sizeof(*mach))) | 583 | if (copy_to_user((void __user *)attr->addr, mach, sizeof(*mach))) |
| 584 | ret = -EFAULT; | 584 | ret = -EFAULT; |
| 585 | kfree(mach); | 585 | kfree(mach); |
| @@ -778,15 +778,18 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
| 778 | static int kvm_s390_query_ap_config(u8 *config) | 778 | static int kvm_s390_query_ap_config(u8 *config) |
| 779 | { | 779 | { |
| 780 | u32 fcn_code = 0x04000000UL; | 780 | u32 fcn_code = 0x04000000UL; |
| 781 | u32 cc; | 781 | u32 cc = 0; |
| 782 | 782 | ||
| 783 | memset(config, 0, 128); | ||
| 783 | asm volatile( | 784 | asm volatile( |
| 784 | "lgr 0,%1\n" | 785 | "lgr 0,%1\n" |
| 785 | "lgr 2,%2\n" | 786 | "lgr 2,%2\n" |
| 786 | ".long 0xb2af0000\n" /* PQAP(QCI) */ | 787 | ".long 0xb2af0000\n" /* PQAP(QCI) */ |
| 787 | "ipm %0\n" | 788 | "0: ipm %0\n" |
| 788 | "srl %0,28\n" | 789 | "srl %0,28\n" |
| 789 | : "=r" (cc) | 790 | "1:\n" |
| 791 | EX_TABLE(0b, 1b) | ||
| 792 | : "+r" (cc) | ||
| 790 | : "r" (fcn_code), "r" (config) | 793 | : "r" (fcn_code), "r" (config) |
| 791 | : "cc", "0", "2", "memory" | 794 | : "cc", "0", "2", "memory" |
| 792 | ); | 795 | ); |
| @@ -839,9 +842,13 @@ static int kvm_s390_crypto_init(struct kvm *kvm) | |||
| 839 | 842 | ||
| 840 | kvm_s390_set_crycb_format(kvm); | 843 | kvm_s390_set_crycb_format(kvm); |
| 841 | 844 | ||
| 842 | /* Disable AES/DEA protected key functions by default */ | 845 | /* Enable AES/DEA protected key functions by default */ |
| 843 | kvm->arch.crypto.aes_kw = 0; | 846 | kvm->arch.crypto.aes_kw = 1; |
| 844 | kvm->arch.crypto.dea_kw = 0; | 847 | kvm->arch.crypto.dea_kw = 1; |
| 848 | get_random_bytes(kvm->arch.crypto.crycb->aes_wrapping_key_mask, | ||
| 849 | sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask)); | ||
| 850 | get_random_bytes(kvm->arch.crypto.crycb->dea_wrapping_key_mask, | ||
| 851 | sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask)); | ||
| 845 | 852 | ||
| 846 | return 0; | 853 | return 0; |
| 847 | } | 854 | } |
| @@ -886,40 +893,29 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
| 886 | /* | 893 | /* |
| 887 | * The architectural maximum amount of facilities is 16 kbit. To store | 894 | * The architectural maximum amount of facilities is 16 kbit. To store |
| 888 | * this amount, 2 kbyte of memory is required. Thus we need a full | 895 | * this amount, 2 kbyte of memory is required. Thus we need a full |
| 889 | * page to hold the active copy (arch.model.fac->sie) and the current | 896 | * page to hold the guest facility list (arch.model.fac->list) and the |
| 890 | * facilities set (arch.model.fac->kvm). Its address size has to be | 897 | * facility mask (arch.model.fac->mask). Its address size has to be |
| 891 | * 31 bits and word aligned. | 898 | * 31 bits and word aligned. |
| 892 | */ | 899 | */ |
| 893 | kvm->arch.model.fac = | 900 | kvm->arch.model.fac = |
| 894 | (struct s390_model_fac *) get_zeroed_page(GFP_KERNEL | GFP_DMA); | 901 | (struct kvm_s390_fac *) get_zeroed_page(GFP_KERNEL | GFP_DMA); |
| 895 | if (!kvm->arch.model.fac) | 902 | if (!kvm->arch.model.fac) |
| 896 | goto out_nofac; | 903 | goto out_nofac; |
| 897 | 904 | ||
| 898 | memcpy(kvm->arch.model.fac->kvm, S390_lowcore.stfle_fac_list, | 905 | /* Populate the facility mask initially. */ |
| 899 | S390_ARCH_FAC_LIST_SIZE_U64); | 906 | memcpy(kvm->arch.model.fac->mask, S390_lowcore.stfle_fac_list, |
| 900 | 907 | S390_ARCH_FAC_LIST_SIZE_BYTE); | |
| 901 | /* | ||
| 902 | * If this KVM host runs *not* in a LPAR, relax the facility bits | ||
| 903 | * of the kvm facility mask by all missing facilities. This will allow | ||
| 904 | * to determine the right CPU model by means of the remaining facilities. | ||
| 905 | * Live guest migration must prohibit the migration of KVMs running in | ||
| 906 | * a LPAR to non LPAR hosts. | ||
| 907 | */ | ||
| 908 | if (!MACHINE_IS_LPAR) | ||
| 909 | for (i = 0; i < kvm_s390_fac_list_mask_size(); i++) | ||
| 910 | kvm_s390_fac_list_mask[i] &= kvm->arch.model.fac->kvm[i]; | ||
| 911 | |||
| 912 | /* | ||
| 913 | * Apply the kvm facility mask to limit the kvm supported/tolerated | ||
| 914 | * facility list. | ||
| 915 | */ | ||
| 916 | for (i = 0; i < S390_ARCH_FAC_LIST_SIZE_U64; i++) { | 908 | for (i = 0; i < S390_ARCH_FAC_LIST_SIZE_U64; i++) { |
| 917 | if (i < kvm_s390_fac_list_mask_size()) | 909 | if (i < kvm_s390_fac_list_mask_size()) |
| 918 | kvm->arch.model.fac->kvm[i] &= kvm_s390_fac_list_mask[i]; | 910 | kvm->arch.model.fac->mask[i] &= kvm_s390_fac_list_mask[i]; |
| 919 | else | 911 | else |
| 920 | kvm->arch.model.fac->kvm[i] = 0UL; | 912 | kvm->arch.model.fac->mask[i] = 0UL; |
| 921 | } | 913 | } |
| 922 | 914 | ||
| 915 | /* Populate the facility list initially. */ | ||
| 916 | memcpy(kvm->arch.model.fac->list, kvm->arch.model.fac->mask, | ||
| 917 | S390_ARCH_FAC_LIST_SIZE_BYTE); | ||
| 918 | |||
| 923 | kvm_s390_get_cpu_id(&kvm->arch.model.cpu_id); | 919 | kvm_s390_get_cpu_id(&kvm->arch.model.cpu_id); |
| 924 | kvm->arch.model.ibc = sclp_get_ibc() & 0x0fff; | 920 | kvm->arch.model.ibc = sclp_get_ibc() & 0x0fff; |
| 925 | 921 | ||
| @@ -1165,8 +1161,6 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | |||
| 1165 | 1161 | ||
| 1166 | mutex_lock(&vcpu->kvm->lock); | 1162 | mutex_lock(&vcpu->kvm->lock); |
| 1167 | vcpu->arch.cpu_id = vcpu->kvm->arch.model.cpu_id; | 1163 | vcpu->arch.cpu_id = vcpu->kvm->arch.model.cpu_id; |
| 1168 | memcpy(vcpu->kvm->arch.model.fac->sie, vcpu->kvm->arch.model.fac->kvm, | ||
| 1169 | S390_ARCH_FAC_LIST_SIZE_BYTE); | ||
| 1170 | vcpu->arch.sie_block->ibc = vcpu->kvm->arch.model.ibc; | 1164 | vcpu->arch.sie_block->ibc = vcpu->kvm->arch.model.ibc; |
| 1171 | mutex_unlock(&vcpu->kvm->lock); | 1165 | mutex_unlock(&vcpu->kvm->lock); |
| 1172 | 1166 | ||
| @@ -1212,7 +1206,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | |||
| 1212 | vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca; | 1206 | vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca; |
| 1213 | set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn); | 1207 | set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn); |
| 1214 | } | 1208 | } |
| 1215 | vcpu->arch.sie_block->fac = (int) (long) kvm->arch.model.fac->sie; | 1209 | vcpu->arch.sie_block->fac = (int) (long) kvm->arch.model.fac->list; |
| 1216 | 1210 | ||
| 1217 | spin_lock_init(&vcpu->arch.local_int.lock); | 1211 | spin_lock_init(&vcpu->arch.local_int.lock); |
| 1218 | vcpu->arch.local_int.float_int = &kvm->arch.float_int; | 1212 | vcpu->arch.local_int.float_int = &kvm->arch.float_int; |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 985c2114d7ef..c34109aa552d 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
| @@ -128,7 +128,8 @@ static inline void kvm_s390_set_psw_cc(struct kvm_vcpu *vcpu, unsigned long cc) | |||
| 128 | /* test availability of facility in a kvm intance */ | 128 | /* test availability of facility in a kvm intance */ |
| 129 | static inline int test_kvm_facility(struct kvm *kvm, unsigned long nr) | 129 | static inline int test_kvm_facility(struct kvm *kvm, unsigned long nr) |
| 130 | { | 130 | { |
| 131 | return __test_facility(nr, kvm->arch.model.fac->kvm); | 131 | return __test_facility(nr, kvm->arch.model.fac->mask) && |
| 132 | __test_facility(nr, kvm->arch.model.fac->list); | ||
| 132 | } | 133 | } |
| 133 | 134 | ||
| 134 | /* are cpu states controlled by user space */ | 135 | /* are cpu states controlled by user space */ |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index bdd9b5b17e03..351116939ea2 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
| @@ -348,7 +348,7 @@ static int handle_stfl(struct kvm_vcpu *vcpu) | |||
| 348 | * We need to shift the lower 32 facility bits (bit 0-31) from a u64 | 348 | * We need to shift the lower 32 facility bits (bit 0-31) from a u64 |
| 349 | * into a u32 memory representation. They will remain bits 0-31. | 349 | * into a u32 memory representation. They will remain bits 0-31. |
| 350 | */ | 350 | */ |
| 351 | fac = *vcpu->kvm->arch.model.fac->sie >> 32; | 351 | fac = *vcpu->kvm->arch.model.fac->list >> 32; |
| 352 | rc = write_guest_lc(vcpu, offsetof(struct _lowcore, stfl_fac_list), | 352 | rc = write_guest_lc(vcpu, offsetof(struct _lowcore, stfl_fac_list), |
| 353 | &fac, sizeof(fac)); | 353 | &fac, sizeof(fac)); |
| 354 | if (rc) | 354 | if (rc) |
