arm/arm64: KVM: Report correct FSC for unsupported fault types
authorChristoffer Dall <christoffer.dall@linaro.org>
Fri, 26 Sep 2014 10:29:34 +0000 (12:29 +0200)
committerChristoffer Dall <christoffer.dall@linaro.org>
Fri, 26 Sep 2014 12:39:45 +0000 (14:39 +0200)
When we catch something that's not a permission fault or a translation
fault, we log the unsupported FSC in the kernel log, but we were masking
off the bottom bits of the FSC which was not very helpful.

Also correctly report the FSC for data and instruction faults rather
than telling people it was a DFCS, which doesn't exist in the ARM ARM.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
arch/arm/include/asm/kvm_emulate.h
arch/arm/kvm/mmu.c
arch/arm64/include/asm/kvm_emulate.h

index 69b746955fca322185cea04301ecef8d2feaabe6..b9db269c6e6155bbd1e60f2d7f8bad077b503913 100644 (file)
@@ -148,6 +148,11 @@ static inline bool kvm_vcpu_trap_is_iabt(struct kvm_vcpu *vcpu)
 }
 
 static inline u8 kvm_vcpu_trap_get_fault(struct kvm_vcpu *vcpu)
+{
+       return kvm_vcpu_get_hsr(vcpu) & HSR_FSC;
+}
+
+static inline u8 kvm_vcpu_trap_get_fault_type(struct kvm_vcpu *vcpu)
 {
        return kvm_vcpu_get_hsr(vcpu) & HSR_FSC_TYPE;
 }
index bb06f76a8f890d5151101691f08f28b2c97e3ebb..eea03069161b4b4c2824bd0908edac065f0959a8 100644 (file)
@@ -882,10 +882,12 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run)
                              kvm_vcpu_get_hfar(vcpu), fault_ipa);
 
        /* Check the stage-2 fault is trans. fault or write fault */
-       fault_status = kvm_vcpu_trap_get_fault(vcpu);
+       fault_status = kvm_vcpu_trap_get_fault_type(vcpu);
        if (fault_status != FSC_FAULT && fault_status != FSC_PERM) {
-               kvm_err("Unsupported fault status: EC=%#x DFCS=%#lx\n",
-                       kvm_vcpu_trap_get_class(vcpu), fault_status);
+               kvm_err("Unsupported FSC: EC=%#x xFSC=%#lx ESR_EL2=%#lx\n",
+                       kvm_vcpu_trap_get_class(vcpu),
+                       (unsigned long)kvm_vcpu_trap_get_fault(vcpu),
+                       (unsigned long)kvm_vcpu_get_hsr(vcpu));
                return -EFAULT;
        }
 
index fdc3e21abd8dddee609c7a5e49c5d6efaa3615ee..5674a55b551824bcdb4dfd7f26ae45cb3b6c8836 100644 (file)
@@ -173,6 +173,11 @@ static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu)
 }
 
 static inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
+{
+       return kvm_vcpu_get_hsr(vcpu) & ESR_EL2_FSC;
+}
+
+static inline u8 kvm_vcpu_trap_get_fault_type(const struct kvm_vcpu *vcpu)
 {
        return kvm_vcpu_get_hsr(vcpu) & ESR_EL2_FSC_TYPE;
 }