summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Huth <thuth@linux.vnet.ibm.com>2014-04-17 09:57:10 +0200
committerChristian Borntraeger <borntraeger@de.ibm.com>2014-05-16 14:57:19 +0200
commit684135e0962fce7946a89f50cf6c7ffa78a11b09 (patch)
tree3885378f00b547f89664157ef72606a224bcb9b4
parenta3fb577e481d64dc757f506e19685603bbf3db42 (diff)
downloadlinux-684135e0962fce7946a89f50cf6c7ffa78a11b09.tar.bz2
KVM: s390: Avoid endless loops of specification exceptions
If the new PSW for program interrupts is invalid, the VM ends up in an endless loop of specification exceptions. Since there is not much left we can do in this case, we should better drop to userspace instead so that the crash can be reported to the user. Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
-rw-r--r--arch/s390/kvm/intercept.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c
index bd607cf01a5d..ddc69f5f5e19 100644
--- a/arch/s390/kvm/intercept.c
+++ b/arch/s390/kvm/intercept.c
@@ -195,6 +195,7 @@ static int handle_itdb(struct kvm_vcpu *vcpu)
static int handle_prog(struct kvm_vcpu *vcpu)
{
struct kvm_s390_pgm_info pgm_info;
+ psw_t psw;
int rc;
vcpu->stat.exit_program_interruption++;
@@ -207,7 +208,14 @@ static int handle_prog(struct kvm_vcpu *vcpu)
}
trace_kvm_s390_intercept_prog(vcpu, vcpu->arch.sie_block->iprcc);
-
+ if (vcpu->arch.sie_block->iprcc == PGM_SPECIFICATION) {
+ rc = read_guest_lc(vcpu, __LC_PGM_NEW_PSW, &psw, sizeof(psw_t));
+ if (rc)
+ return rc;
+ /* Avoid endless loops of specification exceptions */
+ if (!is_valid_psw(&psw))
+ return -EOPNOTSUPP;
+ }
rc = handle_itdb(vcpu);
if (rc)
return rc;