]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
KVM: s390: add MSA9 to cpumodel
authorChristian Borntraeger <borntraeger@de.ibm.com>
Tue, 16 Jul 2019 06:54:00 +0000 (08:54 +0200)
committerSultan Alsawaf <sultan.alsawaf@canonical.com>
Wed, 24 Jul 2019 15:45:13 +0000 (09:45 -0600)
BugLink: https://bugs.launchpad.net/bugs/1836153
This enables stfle.155 and adds the subfunctions for KDSA. Bit 155 is
added to the list of facilities that will be enabled when there is no
cpu model involved as MSA9 requires no additional handling from
userspace, e.g. for migration.

Please note that a cpu model enabled user space can and will have the
final decision on the facility bits for a guests.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
(cherry picked from commit 13209ad0395c4de7fa48108b1dac72e341d5c089)
Signed-off-by: Frank Heimes <frank.heimes@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Documentation/virtual/kvm/devices/vm.txt
arch/s390/include/asm/cpacf.h
arch/s390/include/uapi/asm/kvm.h
arch/s390/kvm/kvm-s390.c
arch/s390/tools/gen_facilities.c
tools/arch/s390/include/uapi/asm/kvm.h

index 95ca68d663a4c111eb99b280e6d1d60c85461804..4ffb82b0246838d3022fb094b3996fa8de84e9ec 100644 (file)
@@ -141,7 +141,8 @@ struct kvm_s390_vm_cpu_subfunc {
        u8 pcc[16];           # valid with Message-Security-Assist-Extension 4
        u8 ppno[16];          # valid with Message-Security-Assist-Extension 5
        u8 kma[16];           # valid with Message-Security-Assist-Extension 8
-       u8 reserved[1808];    # reserved for future instructions
+       u8 kdsa[16];          # valid with Message-Security-Assist-Extension 9
+       u8 reserved[1792];    # reserved for future instructions
 };
 
 Parameters: address of a buffer to load the subfunction blocks from.
index 3cc52e37b4b2a6c4f209b4df3e153d05729d3d59..ce2770743cc58170cc16cd1c8f7d14b17ba4c94e 100644 (file)
@@ -28,6 +28,7 @@
 #define CPACF_KMCTR            0xb92d          /* MSA4 */
 #define CPACF_PRNO             0xb93c          /* MSA5 */
 #define CPACF_KMA              0xb929          /* MSA8 */
+#define CPACF_KDSA             0xb93a          /* MSA9 */
 
 /*
  * En/decryption modifier bits
index 16511d97e8dc037c8c0b9a60b09a0adf409e6d20..09652eabe7690dc3a80b9525eec1d615f1cbbae6 100644 (file)
@@ -152,7 +152,8 @@ struct kvm_s390_vm_cpu_subfunc {
        __u8 pcc[16];           /* with MSA4 */
        __u8 ppno[16];          /* with MSA5 */
        __u8 kma[16];           /* with MSA8 */
-       __u8 reserved[1808];
+       __u8 kdsa[16];          /* with MSA9 */
+       __u8 reserved[1792];
 };
 
 /* kvm attributes for crypto */
index 009d763a44aad91bf35fd0d56f8c18e7b7318583..0dbb31b750c7c0bf3669049c3a92211f6f9d93ce 100644 (file)
@@ -344,6 +344,10 @@ static void kvm_s390_cpu_feat_init(void)
                __cpacf_query(CPACF_KMA, (cpacf_mask_t *)
                              kvm_s390_available_subfunc.kma);
 
+       if (test_facility(155)) /* MSA9 */
+               __cpacf_query(CPACF_KDSA, (cpacf_mask_t *)
+                             kvm_s390_available_subfunc.kdsa);
+
        if (MACHINE_HAS_ESOP)
                allow_cpu_feat(KVM_S390_VM_CPU_FEAT_ESOP);
        /*
@@ -1226,6 +1230,54 @@ static int kvm_s390_set_processor_subfunc(struct kvm *kvm,
        }
        mutex_unlock(&kvm->lock);
 
+       VM_EVENT(kvm, 3, "SET: guest PLO    subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[1],
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[2],
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[3]);
+       VM_EVENT(kvm, 3, "SET: guest PTFF   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KMAC   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KMC    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KM     subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.km)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.km)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KIMD   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KLMD   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[1]);
+       VM_EVENT(kvm, 3, "SET: guest PCKMO  subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KMCTR  subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KMF    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KMO    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[1]);
+       VM_EVENT(kvm, 3, "SET: guest PCC    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[1]);
+       VM_EVENT(kvm, 3, "SET: guest PPNO   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KMA    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kma)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kma)[1]);
+       VM_EVENT(kvm, 3, "SET: guest KDSA   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[1]);
+
        return 0;
 }
 
@@ -1341,6 +1393,54 @@ static int kvm_s390_get_processor_subfunc(struct kvm *kvm,
            sizeof(struct kvm_s390_vm_cpu_subfunc)))
                return -EFAULT;
 
+       VM_EVENT(kvm, 3, "GET: guest PLO    subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[1],
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[2],
+                ((unsigned long *) &kvm->arch.model.subfuncs.plo)[3]);
+       VM_EVENT(kvm, 3, "GET: guest PTFF   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KMAC   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KMC    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KM     subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.km)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.km)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KIMD   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KLMD   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[1]);
+       VM_EVENT(kvm, 3, "GET: guest PCKMO  subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KMCTR  subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KMF    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KMO    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[1]);
+       VM_EVENT(kvm, 3, "GET: guest PCC    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[1]);
+       VM_EVENT(kvm, 3, "GET: guest PPNO   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KMA    subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kma)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kma)[1]);
+       VM_EVENT(kvm, 3, "GET: guest KDSA   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[1]);
+
        return 0;
 }
 
@@ -1395,6 +1495,9 @@ static int kvm_s390_get_machine_subfunc(struct kvm *kvm,
        VM_EVENT(kvm, 3, "GET: host  KMA    subfunc 0x%16.16lx.%16.16lx",
                 ((unsigned long *) &kvm_s390_available_subfunc.kma)[0],
                 ((unsigned long *) &kvm_s390_available_subfunc.kma)[1]);
+       VM_EVENT(kvm, 3, "GET: host  KDSA   subfunc 0x%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm_s390_available_subfunc.kdsa)[0],
+                ((unsigned long *) &kvm_s390_available_subfunc.kdsa)[1]);
 
        return 0;
 }
index c82b4538268849a6204c9d31c68de8a0aa9e507e..03024f5295b5f95aa6ebe01c1a3244aafdc83d43 100644 (file)
@@ -93,6 +93,7 @@ static struct facility_def facility_defs[] = {
                        131, /* enhanced-SOP 2 and side-effect */
                        139, /* multiple epoch facility */
                        146, /* msa extension 8 */
+                       155, /* msa extension 9 */
                        -1  /* END */
                }
        },
index 4cdaa55fabfe2658e054b5aaf1455b6f0556e584..f5574c832ad07649b9e1050b0d34d06c92f3eff7 100644 (file)
@@ -152,7 +152,8 @@ struct kvm_s390_vm_cpu_subfunc {
        __u8 pcc[16];           /* with MSA4 */
        __u8 ppno[16];          /* with MSA5 */
        __u8 kma[16];           /* with MSA8 */
-       __u8 reserved[1808];
+       __u8 kdsa[16];          /* with MSA9 */
+       __u8 reserved[1792];
 };
 
 /* kvm attributes for crypto */