diff options
author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2012-04-24 03:24:44 -0400 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2012-04-30 20:55:52 -0400 |
commit | 8c3f61e2ddb6c1845704fd8ef1b999ecd2e4725c (patch) | |
tree | 0a2c2375f75ae52b879afe1cbfb770ef5ce53394 /arch/s390 | |
parent | 8733ac36fc37fe055a7d7daadf5451b4231f0214 (diff) |
KVM: s390: Handle sckpf instruction
Handle the mandatory intercept SET CLOCK PROGRAMMABLE FIELD
instruction.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/kvm/intercept.c | 1 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.h | 1 | ||||
-rw-r--r-- | arch/s390/kvm/priv.c | 31 |
3 files changed, 33 insertions, 0 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 361456577c6f..979cbe55bf5e 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -101,6 +101,7 @@ static int handle_lctl(struct kvm_vcpu *vcpu) | |||
101 | } | 101 | } |
102 | 102 | ||
103 | static intercept_handler_t instruction_handlers[256] = { | 103 | static intercept_handler_t instruction_handlers[256] = { |
104 | [0x01] = kvm_s390_handle_01, | ||
104 | [0x83] = kvm_s390_handle_diag, | 105 | [0x83] = kvm_s390_handle_diag, |
105 | [0xae] = kvm_s390_handle_sigp, | 106 | [0xae] = kvm_s390_handle_sigp, |
106 | [0xb2] = kvm_s390_handle_b2, | 107 | [0xb2] = kvm_s390_handle_b2, |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index ff28f9d1c9eb..2294377975e8 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
@@ -79,6 +79,7 @@ int kvm_s390_inject_sigp_stop(struct kvm_vcpu *vcpu, int action); | |||
79 | /* implemented in priv.c */ | 79 | /* implemented in priv.c */ |
80 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu); | 80 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu); |
81 | int kvm_s390_handle_e5(struct kvm_vcpu *vcpu); | 81 | int kvm_s390_handle_e5(struct kvm_vcpu *vcpu); |
82 | int kvm_s390_handle_01(struct kvm_vcpu *vcpu); | ||
82 | 83 | ||
83 | /* implemented in sigp.c */ | 84 | /* implemented in sigp.c */ |
84 | int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu); | 85 | int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu); |
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 | } | ||