aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm/priv.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kvm/priv.c')
-rw-r--r--arch/s390/kvm/priv.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index d68f10441a16..8679bd74d337 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -280,9 +280,11 @@ retry:
280 goto retry; 280 goto retry;
281 } 281 }
282 } 282 }
283 if (rc)
284 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
285 up_read(&current->mm->mmap_sem); 283 up_read(&current->mm->mmap_sem);
284 if (rc == -EFAULT)
285 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
286 if (rc < 0)
287 return rc;
286 vcpu->run->s.regs.gprs[reg1] &= ~0xff; 288 vcpu->run->s.regs.gprs[reg1] &= ~0xff;
287 vcpu->run->s.regs.gprs[reg1] |= key; 289 vcpu->run->s.regs.gprs[reg1] |= key;
288 return 0; 290 return 0;
@@ -324,9 +326,11 @@ retry:
324 goto retry; 326 goto retry;
325 } 327 }
326 } 328 }
327 if (rc < 0)
328 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
329 up_read(&current->mm->mmap_sem); 329 up_read(&current->mm->mmap_sem);
330 if (rc == -EFAULT)
331 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
332 if (rc < 0)
333 return rc;
330 kvm_s390_set_psw_cc(vcpu, rc); 334 kvm_s390_set_psw_cc(vcpu, rc);
331 return 0; 335 return 0;
332} 336}
@@ -390,12 +394,12 @@ static int handle_sske(struct kvm_vcpu *vcpu)
390 FAULT_FLAG_WRITE, &unlocked); 394 FAULT_FLAG_WRITE, &unlocked);
391 rc = !rc ? -EAGAIN : rc; 395 rc = !rc ? -EAGAIN : rc;
392 } 396 }
397 up_read(&current->mm->mmap_sem);
393 if (rc == -EFAULT) 398 if (rc == -EFAULT)
394 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 399 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
395 400 if (rc < 0)
396 up_read(&current->mm->mmap_sem); 401 return rc;
397 if (rc >= 0) 402 start += PAGE_SIZE;
398 start += PAGE_SIZE;
399 } 403 }
400 404
401 if (m3 & (SSKE_MC | SSKE_MR)) { 405 if (m3 & (SSKE_MC | SSKE_MR)) {
@@ -1002,13 +1006,15 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
1002 FAULT_FLAG_WRITE, &unlocked); 1006 FAULT_FLAG_WRITE, &unlocked);
1003 rc = !rc ? -EAGAIN : rc; 1007 rc = !rc ? -EAGAIN : rc;
1004 } 1008 }
1009 up_read(&current->mm->mmap_sem);
1005 if (rc == -EFAULT) 1010 if (rc == -EFAULT)
1006 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 1011 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
1007 1012 if (rc == -EAGAIN)
1008 up_read(&current->mm->mmap_sem); 1013 continue;
1009 if (rc >= 0) 1014 if (rc < 0)
1010 start += PAGE_SIZE; 1015 return rc;
1011 } 1016 }
1017 start += PAGE_SIZE;
1012 } 1018 }
1013 if (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) { 1019 if (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) {
1014 if (psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_64BIT) { 1020 if (psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_64BIT) {