aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2015-08-27 11:10:01 -0400
committerWill Deacon <will.deacon@arm.com>2015-08-27 11:16:55 -0400
commit126c69a0bd0e441bf6766a5d9bf20de011be9f68 (patch)
tree2658e0934d7d9140890db83d19964133c60d906d /arch/arm64
parentc13dcf9f2d6f5f06ef1bf79ec456df614c5e058b (diff)
arm64: KVM: Fix host crash when injecting a fault into a 32bit guest
When injecting a fault into a misbehaving 32bit guest, it seems rather idiotic to also inject a 64bit fault that is only going to corrupt the guest state. This leads to a situation where we perform an illegal exception return at EL2 causing the host to crash instead of killing the guest. Just fix the stupid bug that has been there from day 1. Cc: <stable@vger.kernel.org> Reported-by: Russell King <rmk+kernel@arm.linux.org.uk> Tested-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64')
-rw-r--r--arch/arm64/kvm/inject_fault.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c
index f02530e726f6..85c57158dcd9 100644
--- a/arch/arm64/kvm/inject_fault.c
+++ b/arch/arm64/kvm/inject_fault.c
@@ -168,8 +168,8 @@ void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr)
168{ 168{
169 if (!(vcpu->arch.hcr_el2 & HCR_RW)) 169 if (!(vcpu->arch.hcr_el2 & HCR_RW))
170 inject_abt32(vcpu, false, addr); 170 inject_abt32(vcpu, false, addr);
171 171 else
172 inject_abt64(vcpu, false, addr); 172 inject_abt64(vcpu, false, addr);
173} 173}
174 174
175/** 175/**
@@ -184,8 +184,8 @@ void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr)
184{ 184{
185 if (!(vcpu->arch.hcr_el2 & HCR_RW)) 185 if (!(vcpu->arch.hcr_el2 & HCR_RW))
186 inject_abt32(vcpu, true, addr); 186 inject_abt32(vcpu, true, addr);
187 187 else
188 inject_abt64(vcpu, true, addr); 188 inject_abt64(vcpu, true, addr);
189} 189}
190 190
191/** 191/**
@@ -198,6 +198,6 @@ void kvm_inject_undefined(struct kvm_vcpu *vcpu)
198{ 198{
199 if (!(vcpu->arch.hcr_el2 & HCR_RW)) 199 if (!(vcpu->arch.hcr_el2 & HCR_RW))
200 inject_undef32(vcpu); 200 inject_undef32(vcpu);
201 201 else
202 inject_undef64(vcpu); 202 inject_undef64(vcpu);
203} 203}