Message ID | 20170912100330.2168-12-julien.grall@arm.com |
---|---|
State | Accepted |
Commit | a0c039a3799b3b44080fd7c6902a4a6457e38a2c |
Headers | show |
Series | xen/arm: Memory subsystem clean-up | expand |
On Tue, 12 Sep 2017, Julien Grall wrote: > 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> Acked-by: Stefano Stabellini <sstabellini@kernel.org> > --- > Andre, I assumed you were happy with changes you suggested, so I > kept your reviewed-by. > > Changes in v2: > - Add Andre's reviewed-by > - Simplify condition check > - Update warning message > --- > xen/arch/arm/traps.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c > index 2e48089d61..0b856fb4fd 100644 > --- a/xen/arch/arm/traps.c > +++ b/xen/arch/arm/traps.c > @@ -2986,7 +2986,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); > -- > 2.11.0 >
diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 2e48089d61..0b856fb4fd 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -2986,7 +2986,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);