]> xenbits.xensource.com Git - xen.git/commitdiff
xen/arm: traps: Improve logging for data/prefetch abort fault
authorJulien Grall <julien.grall@arm.com>
Tue, 12 Sep 2017 10:03:17 +0000 (11:03 +0100)
committerStefano Stabellini <sstabellini@kernel.org>
Wed, 20 Sep 2017 00:26:05 +0000 (17:26 -0700)
Walk the hypervisor page table for data/prefetch abort fault to help
diagnostics error in the page tables.

Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
xen/arch/arm/traps.c

index cc08dab6005e4f1630f27114d4c5aabde4cbe840..701fdc841d152816799a0b2f3c838eeefcebff2a 100644 (file)
@@ -2368,7 +2368,26 @@ void do_trap_hyp_sync(struct cpu_user_regs *regs)
         do_trap_brk(regs, hsr);
         break;
 #endif
+    case HSR_EC_DATA_ABORT_CURR_EL:
+    case HSR_EC_INSTR_ABORT_CURR_EL:
+    {
+        bool is_data = (hsr.ec == HSR_EC_DATA_ABORT_CURR_EL);
+        const char *fault = (is_data) ? "Data Abort" : "Instruction Abort";
+
+        printk("%s Trap. Syndrome=%#x\n", fault, hsr.iss);
+        /*
+         * FAR may not be valid for a Synchronous External abort other
+         * than translation table walk.
+         */
+        if ( hsr.xabt.fsc == FSC_SEA && hsr.xabt.fnv )
+            printk("Invalid FAR, not walking the hypervisor tables\n");
+        else
+            dump_hyp_walk(get_hfar(is_data));
+
+        do_unexpected_trap(fault, regs);
 
+        break;
+    }
     default:
         printk("Hypervisor Trap. HSR=0x%x EC=0x%x IL=%x Syndrome=0x%"PRIx32"\n",
                hsr.bits, hsr.ec, hsr.len, hsr.iss);