|
@@ -380,3 +380,34 @@ int kvm_s390_handle_e5(struct kvm_vcpu *vcpu)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int handle_sckpf(struct kvm_vcpu *vcpu)
|
|
|
|
+{
|
|
|
|
+ u32 value;
|
|
|
|
+
|
|
|
|
+ if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
|
|
|
|
+ return kvm_s390_inject_program_int(vcpu,
|
|
|
|
+ PGM_PRIVILEGED_OPERATION);
|
|
|
|
+
|
|
|
|
+ if (vcpu->run->s.regs.gprs[0] & 0x00000000ffff0000)
|
|
|
|
+ return kvm_s390_inject_program_int(vcpu,
|
|
|
|
+ PGM_SPECIFICATION);
|
|
|
|
+
|
|
|
|
+ value = vcpu->run->s.regs.gprs[0] & 0x000000000000ffff;
|
|
|
|
+ vcpu->arch.sie_block->todpr = value;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static intercept_handler_t x01_handlers[256] = {
|
|
|
|
+ [0x07] = handle_sckpf,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+int kvm_s390_handle_01(struct kvm_vcpu *vcpu)
|
|
|
|
+{
|
|
|
|
+ intercept_handler_t handler;
|
|
|
|
+
|
|
|
|
+ handler = x01_handlers[vcpu->arch.sie_block->ipa & 0x00ff];
|
|
|
|
+ if (handler)
|
|
|
|
+ return handler(vcpu);
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+}
|