summaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorHeiko Carstens2014-01-01 16:37:47 +0100
committerChristian Borntraeger2014-04-22 13:24:41 +0200
commit0040e7d20fe467a4bcdb8a6c284631b80efffa8b (patch)
treeb7993961f9e0b13f99272a5ef0022dd0303590e7 /arch/s390/kvm
parentKVM: s390: convert pfault code (diff)
downloadkernel-qcow2-linux-0040e7d20fe467a4bcdb8a6c284631b80efffa8b.tar.gz
kernel-qcow2-linux-0040e7d20fe467a4bcdb8a6c284631b80efffa8b.tar.xz
kernel-qcow2-linux-0040e7d20fe467a4bcdb8a6c284631b80efffa8b.zip
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')
-rw-r--r--arch/s390/kvm/intercept.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c
index eeb1ac7d8fa4..a8d8da84005b 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);
}