Merge tag 'kvm-s390-next-5.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 3 Aug 2020 18:19:13 +0000 (14:19 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 3 Aug 2020 18:19:13 +0000 (14:19 -0400)
KVM: s390: Enhancement for 5.9
- implement diagnose 318

arch/s390/include/asm/diag.h
arch/s390/include/asm/kvm_host.h
arch/s390/include/uapi/asm/kvm.h
arch/s390/kernel/setup.c
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/vsie.c
include/uapi/linux/kvm.h

index 0036eab..ca8f85b 100644 (file)
@@ -298,10 +298,8 @@ struct diag26c_mac_resp {
 union diag318_info {
        unsigned long val;
        struct {
-               unsigned int cpnc : 8;
-               unsigned int cpvc_linux : 24;
-               unsigned char cpvc_distro[3];
-               unsigned char zero;
+               unsigned long cpnc : 8;
+               unsigned long cpvc : 56;
        };
 };
 
index 6ea0820..463c24e 100644 (file)
@@ -260,7 +260,8 @@ struct kvm_s390_sie_block {
        __u32   scaol;                  /* 0x0064 */
        __u8    sdf;                    /* 0x0068 */
        __u8    epdx;                   /* 0x0069 */
-       __u8    reserved6a[2];          /* 0x006a */
+       __u8    cpnc;                   /* 0x006a */
+       __u8    reserved6b;             /* 0x006b */
        __u32   todpr;                  /* 0x006c */
 #define GISA_FORMAT1 0x00000001
        __u32   gd;                     /* 0x0070 */
@@ -745,6 +746,7 @@ struct kvm_vcpu_arch {
        bool gs_enabled;
        bool skey_enabled;
        struct kvm_s390_pv_vcpu pv;
+       union diag318_info diag318_info;
 };
 
 struct kvm_vm_stat {
index 436ec76..7a6b148 100644 (file)
@@ -231,11 +231,13 @@ struct kvm_guest_debug_arch {
 #define KVM_SYNC_GSCB   (1UL << 9)
 #define KVM_SYNC_BPBC   (1UL << 10)
 #define KVM_SYNC_ETOKEN (1UL << 11)
+#define KVM_SYNC_DIAG318 (1UL << 12)
 
 #define KVM_SYNC_S390_VALID_FIELDS \
        (KVM_SYNC_PREFIX | KVM_SYNC_GPRS | KVM_SYNC_ACRS | KVM_SYNC_CRS | \
         KVM_SYNC_ARCH0 | KVM_SYNC_PFAULT | KVM_SYNC_VRS | KVM_SYNC_RICCB | \
-        KVM_SYNC_FPRS | KVM_SYNC_GSCB | KVM_SYNC_BPBC | KVM_SYNC_ETOKEN)
+        KVM_SYNC_FPRS | KVM_SYNC_GSCB | KVM_SYNC_BPBC | KVM_SYNC_ETOKEN | \
+        KVM_SYNC_DIAG318)
 
 /* length and alignment of the sdnx as a power of two */
 #define SDNXC 8
@@ -264,7 +266,8 @@ struct kvm_sync_regs {
        __u8 reserved2 : 7;
        __u8 padding1[51];      /* riccb needs to be 64byte aligned */
        __u8 riccb[64];         /* runtime instrumentation controls block */
-       __u8 padding2[192];     /* sdnx needs to be 256byte aligned */
+       __u64 diag318;          /* diagnose 0x318 info */
+       __u8 padding2[184];     /* sdnx needs to be 256byte aligned */
        union {
                __u8 sdnx[SDNXL];  /* state description annex */
                struct {
index 5853c98..878cacf 100644 (file)
@@ -1021,8 +1021,7 @@ static void __init setup_control_program_code(void)
 {
        union diag318_info diag318_info = {
                .cpnc = CPNC_LINUX,
-               .cpvc_linux = 0,
-               .cpvc_distro = {0},
+               .cpvc = 0,
        };
 
        if (!sclp.has_diag318)
index cab3c01..66da278 100644 (file)
@@ -545,6 +545,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
        case KVM_CAP_S390_AIS_MIGRATION:
        case KVM_CAP_S390_VCPU_RESETS:
        case KVM_CAP_SET_GUEST_DEBUG:
+       case KVM_CAP_S390_DIAG318:
                r = 1;
                break;
        case KVM_CAP_S390_HPAGE_1M:
@@ -3267,7 +3268,8 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
                                    KVM_SYNC_ACRS |
                                    KVM_SYNC_CRS |
                                    KVM_SYNC_ARCH0 |
-                                   KVM_SYNC_PFAULT;
+                                   KVM_SYNC_PFAULT |
+                                   KVM_SYNC_DIAG318;
        kvm_s390_set_prefix(vcpu, 0);
        if (test_kvm_facility(vcpu->kvm, 64))
                vcpu->run->kvm_valid_regs |= KVM_SYNC_RICCB;
@@ -3562,6 +3564,7 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
                vcpu->arch.sie_block->pp = 0;
                vcpu->arch.sie_block->fpf &= ~FPF_BPBC;
                vcpu->arch.sie_block->todpr = 0;
+               vcpu->arch.sie_block->cpnc = 0;
        }
 }
 
@@ -3579,6 +3582,7 @@ static void kvm_arch_vcpu_ioctl_clear_reset(struct kvm_vcpu *vcpu)
 
        regs->etoken = 0;
        regs->etoken_extension = 0;
+       regs->diag318 = 0;
 }
 
 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
@@ -4195,6 +4199,10 @@ static void sync_regs_fmt2(struct kvm_vcpu *vcpu)
                if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID)
                        kvm_clear_async_pf_completion_queue(vcpu);
        }
+       if (kvm_run->kvm_dirty_regs & KVM_SYNC_DIAG318) {
+               vcpu->arch.diag318_info.val = kvm_run->s.regs.diag318;
+               vcpu->arch.sie_block->cpnc = vcpu->arch.diag318_info.cpnc;
+       }
        /*
         * If userspace sets the riccb (e.g. after migration) to a valid state,
         * we should enable RI here instead of doing the lazy enablement.
@@ -4300,6 +4308,7 @@ static void store_regs_fmt2(struct kvm_vcpu *vcpu)
        kvm_run->s.regs.pp = vcpu->arch.sie_block->pp;
        kvm_run->s.regs.gbea = vcpu->arch.sie_block->gbea;
        kvm_run->s.regs.bpbc = (vcpu->arch.sie_block->fpf & FPF_BPBC) == FPF_BPBC;
+       kvm_run->s.regs.diag318 = vcpu->arch.diag318_info.val;
        if (MACHINE_HAS_GS) {
                __ctl_set_bit(2, 4);
                if (vcpu->arch.gs_enabled)
index 9e9056c..4f3cbf6 100644 (file)
@@ -548,6 +548,7 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
                scb_s->ecd |= scb_o->ecd & ECD_ETOKENF;
 
        scb_s->hpid = HPID_VSIE;
+       scb_s->cpnc = scb_o->cpnc;
 
        prepare_ibc(vcpu, vsie_page);
        rc = shadow_crycb(vcpu, vsie_page);
index 2c73dcf..f6d8603 100644 (file)
@@ -1034,7 +1034,7 @@ struct kvm_ppc_resize_hpt {
 #define KVM_CAP_ASYNC_PF_INT 183
 #define KVM_CAP_LAST_CPU 184
 #define KVM_CAP_SMALLER_MAXPHYADDR 185
-
+#define KVM_CAP_S390_DIAG318 186
 
 #ifdef KVM_CAP_IRQ_ROUTING