KVM: s390: Enable guest EDAT2 support
authorGuenther Hutzl <hutzl@linux.vnet.ibm.com>
Wed, 18 Feb 2015 10:13:03 +0000 (11:13 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 8 May 2015 13:51:14 +0000 (15:51 +0200)
1. Enable EDAT2 in the list of KVM facilities

2. Handle 2G frames in pfmf instruction
If we support EDAT2, we may enable handling of 2G frames if not in 24
bit mode.

3. Enable EDAT2 in sie_block
If the EDAT2 facility is available we enable GED2 mode control in the
sie_block.

Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Guenther Hutzl <hutzl@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/priv.c

index d01fc588b5c378fddc46eba49e28b4de4be1f1a9..1011ac1434f5c39dbbb81d1342b538adff93b90d 100644 (file)
@@ -80,6 +80,7 @@ struct sca_block {
 #define CPUSTAT_MCDS       0x00000100
 #define CPUSTAT_SM         0x00000080
 #define CPUSTAT_IBS        0x00000040
+#define CPUSTAT_GED2       0x00000010
 #define CPUSTAT_G          0x00000008
 #define CPUSTAT_GED        0x00000004
 #define CPUSTAT_J          0x00000002
index 2da36c432aea7e02738695cc59cc2cbf887efb0c..142d9b40528db59d7fa35dff6754c2d2ddd0ca4a 100644 (file)
@@ -110,7 +110,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
 /* upper facilities limit for kvm */
 unsigned long kvm_s390_fac_list_mask[] = {
        0xffe6fffbfcfdfc40UL,
-       0x005c800000000000UL,
+       0x005e800000000000UL,
 };
 
 unsigned long kvm_s390_fac_list_mask_size(void)
@@ -1313,7 +1313,9 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
                                                    CPUSTAT_SM |
                                                    CPUSTAT_STOPPED);
 
-       if (test_kvm_facility(vcpu->kvm, 8))
+       if (test_kvm_facility(vcpu->kvm, 78))
+               atomic_set_mask(CPUSTAT_GED2, &vcpu->arch.sie_block->cpuflags);
+       else if (test_kvm_facility(vcpu->kvm, 8))
                atomic_set_mask(CPUSTAT_GED, &vcpu->arch.sie_block->cpuflags);
 
        kvm_s390_vcpu_setup_model(vcpu);
index d22d8ee1ff9d9c6404d653f5c4f8a04b8ddc70da..ad42422457713721427a5f0e20f9887b8ed5e86e 100644 (file)
@@ -698,10 +698,14 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
        case 0x00001000:
                end = (start + (1UL << 20)) & ~((1UL << 20) - 1);
                break;
-       /* We dont support EDAT2
        case 0x00002000:
+               /* only support 2G frame size if EDAT2 is available and we are
+                  not in 24-bit addressing mode */
+               if (!test_kvm_facility(vcpu->kvm, 78) ||
+                   psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_AMODE_24BIT)
+                       return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
                end = (start + (1UL << 31)) & ~((1UL << 31) - 1);
-               break;*/
+               break;
        default:
                return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
        }