diff options
Diffstat (limited to 'arch/s390/kvm/priv.c')
-rw-r--r-- | arch/s390/kvm/priv.c | 30 |
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(¤t->mm->mmap_sem); | 283 | up_read(¤t->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(¤t->mm->mmap_sem); | 329 | up_read(¤t->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(¤t->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(¤t->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(¤t->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(¤t->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) { |