aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-03-25 12:22:51 -0400
committerGleb Natapov <gleb@redhat.com>2013-04-02 09:14:33 -0400
commit6fd0fcc93b1eaf82911782de5c7aa35c174bf620 (patch)
tree73341520406163d3c0374d7fb17bd843a62b79df /arch/s390
parentace5058763b72d128efcbe27969e89226c9c593a (diff)
KVM: s390: fix return code handling in lpsw/lpswe handlers
kvm_s390_inject_program_int() may return with a non-zero return value, in case of an error (out of memory). Report that to the calling functions instead of ignoring the error case. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Gleb Natapov <gleb@redhat.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/kvm/priv.c44
1 files changed, 14 insertions, 30 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index 844a2b986112..9d32c56fb02c 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -269,20 +269,14 @@ int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
269 269
270 addr = kvm_s390_get_base_disp_s(vcpu); 270 addr = kvm_s390_get_base_disp_s(vcpu);
271 271
272 if (addr & 7) { 272 if (addr & 7)
273 kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); 273 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
274 goto out;
275 }
276 274
277 if (copy_from_guest(vcpu, &new_psw, addr, sizeof(new_psw))) { 275 if (copy_from_guest(vcpu, &new_psw, addr, sizeof(new_psw)))
278 kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 276 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
279 goto out;
280 }
281 277
282 if (!(new_psw.mask & PSW32_MASK_BASE)) { 278 if (!(new_psw.mask & PSW32_MASK_BASE))
283 kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); 279 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
284 goto out;
285 }
286 280
287 vcpu->arch.sie_block->gpsw.mask = 281 vcpu->arch.sie_block->gpsw.mask =
288 (new_psw.mask & ~PSW32_MASK_BASE) << 32; 282 (new_psw.mask & ~PSW32_MASK_BASE) << 32;
@@ -293,13 +287,10 @@ int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
293 (!(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) && 287 (!(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) &&
294 (vcpu->arch.sie_block->gpsw.addr & ~PSW_ADDR_24)) || 288 (vcpu->arch.sie_block->gpsw.addr & ~PSW_ADDR_24)) ||
295 ((vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) == 289 ((vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) ==
296 PSW_MASK_EA)) { 290 PSW_MASK_EA))
297 kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); 291 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
298 goto out;
299 }
300 292
301 handle_new_psw(vcpu); 293 handle_new_psw(vcpu);
302out:
303 return 0; 294 return 0;
304} 295}
305 296
@@ -310,15 +301,11 @@ static int handle_lpswe(struct kvm_vcpu *vcpu)
310 301
311 addr = kvm_s390_get_base_disp_s(vcpu); 302 addr = kvm_s390_get_base_disp_s(vcpu);
312 303
313 if (addr & 7) { 304 if (addr & 7)
314 kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); 305 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
315 goto out;
316 }
317 306
318 if (copy_from_guest(vcpu, &new_psw, addr, sizeof(new_psw))) { 307 if (copy_from_guest(vcpu, &new_psw, addr, sizeof(new_psw)))
319 kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 308 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
320 goto out;
321 }
322 309
323 vcpu->arch.sie_block->gpsw.mask = new_psw.mask; 310 vcpu->arch.sie_block->gpsw.mask = new_psw.mask;
324 vcpu->arch.sie_block->gpsw.addr = new_psw.addr; 311 vcpu->arch.sie_block->gpsw.addr = new_psw.addr;
@@ -330,13 +317,10 @@ static int handle_lpswe(struct kvm_vcpu *vcpu)
330 (!(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) && 317 (!(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) &&
331 (vcpu->arch.sie_block->gpsw.addr & ~PSW_ADDR_24)) || 318 (vcpu->arch.sie_block->gpsw.addr & ~PSW_ADDR_24)) ||
332 ((vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) == 319 ((vcpu->arch.sie_block->gpsw.mask & PSW_MASK_ADDR_MODE) ==
333 PSW_MASK_EA)) { 320 PSW_MASK_EA))
334 kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); 321 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
335 goto out;
336 }
337 322
338 handle_new_psw(vcpu); 323 handle_new_psw(vcpu);
339out:
340 return 0; 324 return 0;
341} 325}
342 326