]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
KVM: s390: add enhanced sort facilty to cpu model
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.150 and adds the subfunctions for SORTL. Bit 150 is
added to the list of facilities that will be enabled when there is no
cpu model involved as sortl 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>
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
(cherry picked from commit 173aec2d5a9fa5f40e462661a8283fcafe04764f)
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>
arch/s390/include/uapi/asm/kvm.h
arch/s390/kvm/kvm-s390.c
arch/s390/tools/gen_facilities.c

index 09652eabe7690dc3a80b9525eec1d615f1cbbae6..eba5bac08348998571e6134f8aae3be282ccad62 100644 (file)
@@ -153,7 +153,8 @@ struct kvm_s390_vm_cpu_subfunc {
        __u8 ppno[16];          /* with MSA5 */
        __u8 kma[16];           /* with MSA8 */
        __u8 kdsa[16];          /* with MSA9 */
-       __u8 reserved[1792];
+       __u8 sortl[32];         /* with STFLE.150 */
+       __u8 reserved[1760];
 };
 
 /* kvm attributes for crypto */
index 995d22910e9ab9268297fa5c7467989de8b31565..fce4e52a51a60a7dd8f474ff59c84142384f263a 100644 (file)
@@ -310,6 +310,8 @@ static inline void __insn32_query(unsigned int opcode, u8 query[32])
                : "cc");
 }
 
+#define INSN_SORTL 0xb938
+
 static void kvm_s390_cpu_feat_init(void)
 {
        int i;
@@ -361,6 +363,9 @@ static void kvm_s390_cpu_feat_init(void)
                __cpacf_query(CPACF_KDSA, (cpacf_mask_t *)
                              kvm_s390_available_subfunc.kdsa);
 
+       if (test_facility(150)) /* SORTL */
+               __insn32_query(INSN_SORTL, kvm_s390_available_subfunc.sortl);
+
        if (MACHINE_HAS_ESOP)
                allow_cpu_feat(KVM_S390_VM_CPU_FEAT_ESOP);
        /*
@@ -1290,6 +1295,11 @@ static int kvm_s390_set_processor_subfunc(struct kvm *kvm,
        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]);
+       VM_EVENT(kvm, 3, "SET: guest SORTL  subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[1],
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[2],
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[3]);
 
        return 0;
 }
@@ -1453,6 +1463,11 @@ static int kvm_s390_get_processor_subfunc(struct kvm *kvm,
        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]);
+       VM_EVENT(kvm, 3, "GET: guest SORTL  subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[0],
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[1],
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[2],
+                ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[3]);
 
        return 0;
 }
@@ -1511,6 +1526,11 @@ static int kvm_s390_get_machine_subfunc(struct kvm *kvm,
        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]);
+       VM_EVENT(kvm, 3, "GET: host  SORTL  subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
+                ((unsigned long *) &kvm_s390_available_subfunc.sortl)[0],
+                ((unsigned long *) &kvm_s390_available_subfunc.sortl)[1],
+                ((unsigned long *) &kvm_s390_available_subfunc.sortl)[2],
+                ((unsigned long *) &kvm_s390_available_subfunc.sortl)[3]);
 
        return 0;
 }
index 03024f5295b5f95aa6ebe01c1a3244aafdc83d43..39ca8bb4a557e26590912b766b391fbfabdc413f 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 */
+                       150, /* enhanced sort */
                        155, /* msa extension 9 */
                        -1  /* END */
                }