diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2013-03-25 12:22:51 -0400 |
---|---|---|
committer | Gleb Natapov <gleb@redhat.com> | 2013-04-02 09:14:33 -0400 |
commit | 6fd0fcc93b1eaf82911782de5c7aa35c174bf620 (patch) | |
tree | 73341520406163d3c0374d7fb17bd843a62b79df /arch/s390 | |
parent | ace5058763b72d128efcbe27969e89226c9c593a (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.c | 44 |
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); |
302 | out: | ||
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); |
339 | out: | ||
340 | return 0; | 324 | return 0; |
341 | } | 325 | } |
342 | 326 | ||