diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2014-01-01 16:37:47 +0100 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2014-04-22 13:24:41 +0200 |
commit | 0040e7d20fe467a4bcdb8a6c284631b80efffa8b (patch) | |
tree | b7993961f9e0b13f99272a5ef0022dd0303590e7 /arch/s390/kvm/intercept.c | |
parent | 81480cc19c56efb573c63d89c46797d34fe58f27 (diff) | |
download | op-kernel-dev-0040e7d20fe467a4bcdb8a6c284631b80efffa8b.zip op-kernel-dev-0040e7d20fe467a4bcdb8a6c284631b80efffa8b.tar.gz |
KVM: s390: convert handle_prog()
Convert handle_prog() to new guest access functions.
Also make the code a bit more readable and look at the return code
of write_guest_lc() which was missing before.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm/intercept.c')
-rw-r--r-- | arch/s390/kvm/intercept.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index eeb1ac7..a8d8da8 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c @@ -111,18 +111,22 @@ static int handle_instruction(struct kvm_vcpu *vcpu) static int handle_prog(struct kvm_vcpu *vcpu) { + struct kvm_s390_itdb *itdb; + int rc; + vcpu->stat.exit_program_interruption++; /* Restore ITDB to Program-Interruption TDB in guest memory */ - if (IS_TE_ENABLED(vcpu) && - !(current->thread.per_flags & PER_FLAG_NO_TE) && - IS_ITDB_VALID(vcpu)) { - copy_to_guest(vcpu, TDB_ADDR, vcpu->arch.sie_block->itdba, - sizeof(struct kvm_s390_itdb)); - memset((void *) vcpu->arch.sie_block->itdba, 0, - sizeof(struct kvm_s390_itdb)); - } - + if (!IS_TE_ENABLED(vcpu) || !IS_ITDB_VALID(vcpu)) + goto skip_itdb; + if (current->thread.per_flags & PER_FLAG_NO_TE) + goto skip_itdb; + itdb = (struct kvm_s390_itdb *)vcpu->arch.sie_block->itdba; + rc = write_guest_lc(vcpu, TDB_ADDR, itdb, sizeof(*itdb)); + if (rc) + return rc; + memset(itdb, 0, sizeof(*itdb)); +skip_itdb: trace_kvm_s390_intercept_prog(vcpu, vcpu->arch.sie_block->iprcc); return kvm_s390_inject_program_int(vcpu, vcpu->arch.sie_block->iprcc); } |