Commit 0040e7d2 authored by Heiko Carstens's avatar Heiko Carstens Committed by Christian Borntraeger
Browse files

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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent 81480cc1
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -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);
}