Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a11bdb1a authored by Janosch Frank's avatar Janosch Frank Committed by Christian Borntraeger
Browse files

KVM: s390: Fix pfmf and conditional skey emulation



We should not return with a lock.
We also have to increase the address when we do page clearing.

Fixes: bd096f64 ("KVM: s390: Add skey emulation fault handling")
Signed-off-by: default avatarJanosch Frank <frankja@linux.ibm.com>
Message-Id: <20180830081355.59234-1-frankja@linux.ibm.com>
Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent 57361846
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -280,9 +280,11 @@ static int handle_iske(struct kvm_vcpu *vcpu)
			goto retry;
		}
	}
	if (rc)
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	up_read(&current->mm->mmap_sem);
	if (rc == -EFAULT)
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	if (rc < 0)
		return rc;
	vcpu->run->s.regs.gprs[reg1] &= ~0xff;
	vcpu->run->s.regs.gprs[reg1] |= key;
	return 0;
@@ -324,9 +326,11 @@ static int handle_rrbe(struct kvm_vcpu *vcpu)
			goto retry;
		}
	}
	if (rc < 0)
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	up_read(&current->mm->mmap_sem);
	if (rc == -EFAULT)
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	if (rc < 0)
		return rc;
	kvm_s390_set_psw_cc(vcpu, rc);
	return 0;
}
@@ -390,11 +394,11 @@ static int handle_sske(struct kvm_vcpu *vcpu)
					      FAULT_FLAG_WRITE, &unlocked);
			rc = !rc ? -EAGAIN : rc;
		}
		up_read(&current->mm->mmap_sem);
		if (rc == -EFAULT)
			return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);

		up_read(&current->mm->mmap_sem);
		if (rc >= 0)
		if (rc < 0)
			return rc;
		start += PAGE_SIZE;
	}

@@ -1002,13 +1006,15 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
						      FAULT_FLAG_WRITE, &unlocked);
				rc = !rc ? -EAGAIN : rc;
			}
			up_read(&current->mm->mmap_sem);
			if (rc == -EFAULT)
				return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);

			up_read(&current->mm->mmap_sem);
			if (rc >= 0)
				start += PAGE_SIZE;
			if (rc == -EAGAIN)
				continue;
			if (rc < 0)
				return rc;
		}
		start += PAGE_SIZE;
	}
	if (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) {
		if (psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_64BIT) {