These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / s390 / kvm / priv.c
index d22d8ee..d76b51c 100644 (file)
 /* Handle SCK (SET CLOCK) interception */
 static int handle_set_clock(struct kvm_vcpu *vcpu)
 {
-       struct kvm_vcpu *cpup;
-       s64 hostclk, val;
-       int i, rc;
+       int rc;
        ar_t ar;
-       u64 op2;
+       u64 op2, val;
 
        if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
                return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
@@ -49,16 +47,8 @@ static int handle_set_clock(struct kvm_vcpu *vcpu)
        if (rc)
                return kvm_s390_inject_prog_cond(vcpu, rc);
 
-       if (store_tod_clock(&hostclk)) {
-               kvm_s390_set_psw_cc(vcpu, 3);
-               return 0;
-       }
-       val = (val - hostclk) & ~0x3fUL;
-
-       mutex_lock(&vcpu->kvm->lock);
-       kvm_for_each_vcpu(i, cpup, vcpu->kvm)
-               cpup->arch.sie_block->epoch = val;
-       mutex_unlock(&vcpu->kvm->lock);
+       VCPU_EVENT(vcpu, 3, "SCK: setting guest TOD to 0x%llx", val);
+       kvm_s390_set_tod_clock(vcpu->kvm, val);
 
        kvm_s390_set_psw_cc(vcpu, 0);
        return 0;
@@ -98,8 +88,6 @@ static int handle_set_prefix(struct kvm_vcpu *vcpu)
                return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
 
        kvm_s390_set_prefix(vcpu, address);
-
-       VCPU_EVENT(vcpu, 5, "setting prefix to %x", address);
        trace_kvm_s390_handle_prefix(vcpu, 1, address);
        return 0;
 }
@@ -129,7 +117,7 @@ static int handle_store_prefix(struct kvm_vcpu *vcpu)
        if (rc)
                return kvm_s390_inject_prog_cond(vcpu, rc);
 
-       VCPU_EVENT(vcpu, 5, "storing prefix to %x", address);
+       VCPU_EVENT(vcpu, 3, "STPX: storing prefix 0x%x into 0x%llx", address, operand2);
        trace_kvm_s390_handle_prefix(vcpu, 0, address);
        return 0;
 }
@@ -155,7 +143,7 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
        if (rc)
                return kvm_s390_inject_prog_cond(vcpu, rc);
 
-       VCPU_EVENT(vcpu, 5, "storing cpu address to %llx", ga);
+       VCPU_EVENT(vcpu, 3, "STAP: storing cpu address (%u) to 0x%llx", vcpu_id, ga);
        trace_kvm_s390_handle_stap(vcpu, ga);
        return 0;
 }
@@ -167,6 +155,7 @@ static int __skey_check_enable(struct kvm_vcpu *vcpu)
                return rc;
 
        rc = s390_enable_skey();
+       VCPU_EVENT(vcpu, 3, "%s", "enabling storage keys for guest");
        trace_kvm_s390_skey_related_inst(vcpu);
        vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
        return rc;
@@ -370,7 +359,7 @@ static int handle_stfl(struct kvm_vcpu *vcpu)
                            &fac, sizeof(fac));
        if (rc)
                return rc;
-       VCPU_EVENT(vcpu, 5, "store facility list value %x", fac);
+       VCPU_EVENT(vcpu, 3, "STFL: store facility list 0x%x", fac);
        trace_kvm_s390_handle_stfl(vcpu, fac);
        return 0;
 }
@@ -468,7 +457,7 @@ static int handle_stidp(struct kvm_vcpu *vcpu)
        if (rc)
                return kvm_s390_inject_prog_cond(vcpu, rc);
 
-       VCPU_EVENT(vcpu, 5, "%s", "store cpu id");
+       VCPU_EVENT(vcpu, 3, "STIDP: store cpu id 0x%llx", stidp_data);
        return 0;
 }
 
@@ -521,7 +510,7 @@ static int handle_stsi(struct kvm_vcpu *vcpu)
        ar_t ar;
 
        vcpu->stat.instruction_stsi++;
-       VCPU_EVENT(vcpu, 4, "stsi: fc: %x sel1: %x sel2: %x", fc, sel1, sel2);
+       VCPU_EVENT(vcpu, 3, "STSI: fc: %u sel1: %u sel2: %u", fc, sel1, sel2);
 
        if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
                return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
@@ -671,7 +660,7 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
 
        kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);
 
-       if (!MACHINE_HAS_PFMF)
+       if (!test_kvm_facility(vcpu->kvm, 8))
                return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);
 
        if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
@@ -698,10 +687,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);
        }
@@ -754,10 +747,10 @@ static int handle_essa(struct kvm_vcpu *vcpu)
        struct gmap *gmap;
        int i;
 
-       VCPU_EVENT(vcpu, 5, "cmma release %d pages", entries);
+       VCPU_EVENT(vcpu, 4, "ESSA: release %d pages", entries);
        gmap = vcpu->arch.gmap;
        vcpu->stat.instruction_essa++;
-       if (!kvm_s390_cmma_enabled(vcpu->kvm))
+       if (!vcpu->kvm->arch.use_cmma)
                return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);
 
        if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
@@ -825,7 +818,7 @@ int kvm_s390_handle_lctl(struct kvm_vcpu *vcpu)
        if (ga & 3)
                return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
 
-       VCPU_EVENT(vcpu, 5, "lctl r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
+       VCPU_EVENT(vcpu, 4, "LCTL: r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
        trace_kvm_s390_handle_lctl(vcpu, 0, reg1, reg3, ga);
 
        nr_regs = ((reg3 - reg1) & 0xf) + 1;
@@ -864,7 +857,7 @@ int kvm_s390_handle_stctl(struct kvm_vcpu *vcpu)
        if (ga & 3)
                return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
 
-       VCPU_EVENT(vcpu, 5, "stctl r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
+       VCPU_EVENT(vcpu, 4, "STCTL r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
        trace_kvm_s390_handle_stctl(vcpu, 0, reg1, reg3, ga);
 
        reg = reg1;
@@ -898,7 +891,7 @@ static int handle_lctlg(struct kvm_vcpu *vcpu)
        if (ga & 7)
                return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
 
-       VCPU_EVENT(vcpu, 5, "lctlg r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
+       VCPU_EVENT(vcpu, 4, "LCTLG: r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
        trace_kvm_s390_handle_lctl(vcpu, 1, reg1, reg3, ga);
 
        nr_regs = ((reg3 - reg1) & 0xf) + 1;
@@ -936,7 +929,7 @@ static int handle_stctg(struct kvm_vcpu *vcpu)
        if (ga & 7)
                return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
 
-       VCPU_EVENT(vcpu, 5, "stctg r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
+       VCPU_EVENT(vcpu, 4, "STCTG r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
        trace_kvm_s390_handle_stctl(vcpu, 1, reg1, reg3, ga);
 
        reg = reg1;