@@ -522,7 +522,7 @@ static int kvm_s390_set_processor(struct kvm *kvm, struct kvm_device_attr *attr)
522
522
memcpy (& kvm -> arch .model .cpu_id , & proc -> cpuid ,
523
523
sizeof (struct cpuid ));
524
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
526
S390_ARCH_FAC_LIST_SIZE_BYTE );
527
527
} else
528
528
ret = - EFAULT ;
@@ -556,7 +556,7 @@ static int kvm_s390_get_processor(struct kvm *kvm, struct kvm_device_attr *attr)
556
556
}
557
557
memcpy (& proc -> cpuid , & kvm -> arch .model .cpu_id , sizeof (struct cpuid ));
558
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
560
if (copy_to_user ((void __user * )attr -> addr , proc , sizeof (* proc )))
561
561
ret = - EFAULT ;
562
562
kfree (proc );
@@ -576,10 +576,10 @@ static int kvm_s390_get_machine(struct kvm *kvm, struct kvm_device_attr *attr)
576
576
}
577
577
get_cpu_id ((struct cpuid * ) & mach -> cpuid );
578
578
mach -> ibc = sclp_get_ibc ();
579
- memcpy (& mach -> fac_mask , kvm_s390_fac_list_mask ,
580
- kvm_s390_fac_list_mask_size () * sizeof ( u64 ) );
579
+ memcpy (& mach -> fac_mask , kvm -> arch . model . fac -> mask ,
580
+ S390_ARCH_FAC_LIST_SIZE_BYTE );
581
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
583
if (copy_to_user ((void __user * )attr -> addr , mach , sizeof (* mach )))
584
584
ret = - EFAULT ;
585
585
kfree (mach );
@@ -778,15 +778,18 @@ long kvm_arch_vm_ioctl(struct file *filp,
778
778
static int kvm_s390_query_ap_config (u8 * config )
779
779
{
780
780
u32 fcn_code = 0x04000000UL ;
781
- u32 cc ;
781
+ u32 cc = 0 ;
782
782
783
+ memset (config , 0 , 128 );
783
784
asm volatile (
784
785
"lgr 0,%1\n"
785
786
"lgr 2,%2\n"
786
787
".long 0xb2af0000\n" /* PQAP(QCI) */
787
- "ipm %0\n"
788
+ "0: ipm %0\n"
788
789
"srl %0,28\n"
789
- : "=r" (cc )
790
+ "1:\n"
791
+ EX_TABLE (0b , 1b )
792
+ : "+ r " (cc)
790
793
: " r " (fcn_code), " r " (config)
791
794
: " cc ", " 0 ", " 2 ", " memory "
792
795
);
@@ -839,9 +842,13 @@ static int kvm_s390_crypto_init(struct kvm *kvm)
839
842
840
843
kvm_s390_set_crycb_format (kvm );
841
844
842
- /* Disable AES/DEA protected key functions by default */
843
- kvm -> arch .crypto .aes_kw = 0 ;
844
- kvm -> arch .crypto .dea_kw = 0 ;
845
+ /* Enable AES/DEA protected key functions by default */
846
+ kvm -> arch .crypto .aes_kw = 1 ;
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
853
return 0 ;
847
854
}
@@ -886,40 +893,29 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
886
893
/*
887
894
* The architectural maximum amount of facilities is 16 kbit. To store
888
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
890
- * facilities set (arch.model.fac->kvm ). Its address size has to be
896
+ * page to hold the guest facility list (arch.model.fac->list ) and the
897
+ * facility mask (arch.model.fac->mask ). Its address size has to be
891
898
* 31 bits and word aligned.
892
899
*/
893
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
902
if (!kvm -> arch .model .fac )
896
903
goto out_nofac ;
897
904
898
- memcpy (kvm -> arch .model .fac -> kvm , S390_lowcore .stfle_fac_list ,
899
- S390_ARCH_FAC_LIST_SIZE_U64 );
900
-
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
- */
905
+ /* Populate the facility mask initially. */
906
+ memcpy (kvm -> arch .model .fac -> mask , S390_lowcore .stfle_fac_list ,
907
+ S390_ARCH_FAC_LIST_SIZE_BYTE );
916
908
for (i = 0 ; i < S390_ARCH_FAC_LIST_SIZE_U64 ; i ++ ) {
917
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
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
919
kvm_s390_get_cpu_id (& kvm -> arch .model .cpu_id );
924
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
1162
mutex_lock (& vcpu -> kvm -> lock );
1167
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
1164
vcpu -> arch .sie_block -> ibc = vcpu -> kvm -> arch .model .ibc ;
1171
1165
mutex_unlock (& vcpu -> kvm -> lock );
1172
1166
@@ -1212,7 +1206,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
1212
1206
vcpu -> arch .sie_block -> scaol = (__u32 )(__u64 )kvm -> arch .sca ;
1213
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
1211
spin_lock_init (& vcpu -> arch .local_int .lock );
1218
1212
vcpu -> arch .local_int .float_int = & kvm -> arch .float_int ;
0 commit comments