diff options
Diffstat (limited to 'arch/s390/kvm/priv.c')
-rw-r--r-- | arch/s390/kvm/priv.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index e5a45dbd26ac..68a6b2ed16bf 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
@@ -380,3 +380,34 @@ int kvm_s390_handle_e5(struct kvm_vcpu *vcpu) | |||
380 | return -EOPNOTSUPP; | 380 | return -EOPNOTSUPP; |
381 | } | 381 | } |
382 | 382 | ||
383 | static int handle_sckpf(struct kvm_vcpu *vcpu) | ||
384 | { | ||
385 | u32 value; | ||
386 | |||
387 | if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) | ||
388 | return kvm_s390_inject_program_int(vcpu, | ||
389 | PGM_PRIVILEGED_OPERATION); | ||
390 | |||
391 | if (vcpu->run->s.regs.gprs[0] & 0x00000000ffff0000) | ||
392 | return kvm_s390_inject_program_int(vcpu, | ||
393 | PGM_SPECIFICATION); | ||
394 | |||
395 | value = vcpu->run->s.regs.gprs[0] & 0x000000000000ffff; | ||
396 | vcpu->arch.sie_block->todpr = value; | ||
397 | |||
398 | return 0; | ||
399 | } | ||
400 | |||
401 | static intercept_handler_t x01_handlers[256] = { | ||
402 | [0x07] = handle_sckpf, | ||
403 | }; | ||
404 | |||
405 | int kvm_s390_handle_01(struct kvm_vcpu *vcpu) | ||
406 | { | ||
407 | intercept_handler_t handler; | ||
408 | |||
409 | handler = x01_handlers[vcpu->arch.sie_block->ipa & 0x00ff]; | ||
410 | if (handler) | ||
411 | return handler(vcpu); | ||
412 | return -EOPNOTSUPP; | ||
413 | } | ||