[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [PATCH v3 11/43] arm64: dump the registers for do_bad_mode()/do_sync()



On Wed, Apr 18, 2018 at 09:06:13PM +0100, Julien Grall wrote:
> Hi,
> 
> On 16/04/2018 07:31, Huang Shijie wrote:
> >This patch adds a new function dump_regs() which can dump the registers
> >information.
> >
> >And the do_bad_mode()/do_sync() will use the function to dump the
> >registers.
> >
> >This patch refers to Volodymyr Babchuk's patch:
> 
> Do you mean "based on" instead of "refers to"?
Is there some different?..

> 
> >   "WIP: trap.c: add trap handles for arm64"
> >
> >Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx>
> >---
> >  arch/arm/arm64/traps.c | 32 ++++++++++++++++++++++++++++++--
> >  1 file changed, 30 insertions(+), 2 deletions(-)
> >
> >diff --git a/arch/arm/arm64/traps.c b/arch/arm/arm64/traps.c
> >index 62dd2e6..66f842e 100644
> >--- a/arch/arm/arm64/traps.c
> >+++ b/arch/arm/arm64/traps.c
> >@@ -2,15 +2,43 @@
> >  #include <mini-os/arm64/traps.h>
> >  #include <console.h>
> >+static void dump_regs(struct pt_regs *regs,
> >+                  unsigned long esr, unsigned long far)
> 
> The indentation looks wrong.
okay...

> 
> >+{
> >+    printk("*** Sync exception at PC = %lx *** \n", regs->pc);
> >+    printk("Thread state:\n");
> >+    printk("\tX0  = 0x%016lx X1  = 0x%016lx\n", regs->x[0], regs->x[1]);
> >+    printk("\tX2  = 0x%016lx X3  = 0x%016lx\n", regs->x[2], regs->x[3]);
> >+    printk("\tX4  = 0x%016lx X5  = 0x%016lx\n", regs->x[4], regs->x[5]);
> >+    printk("\tX6  = 0x%016lx X7  = 0x%016lx\n", regs->x[6], regs->x[7]);
> >+    printk("\tX8  = 0x%016lx X9  = 0x%016lx\n", regs->x[8], regs->x[9]);
> >+    printk("\tX10 = 0x%016lx X11 = 0x%016lx\n", regs->x[10], regs->x[11]);
> >+    printk("\tX12 = 0x%016lx X13 = 0x%016lx\n", regs->x[12], regs->x[13]);
> >+    printk("\tX14 = 0x%016lx X15 = 0x%016lx\n", regs->x[14], regs->x[15]);
> >+    printk("\tX16 = 0x%016lx X17 = 0x%016lx\n", regs->x[16], regs->x[17]);
> >+    printk("\tX18 = 0x%016lx X19 = 0x%016lx\n", regs->x[18], regs->x[19]);
> >+    printk("\tX20 = 0x%016lx X21 = 0x%016lx\n", regs->x[20], regs->x[21]);
> >+    printk("\tX22 = 0x%016lx X23 = 0x%016lx\n", regs->x[22], regs->x[23]);
> >+    printk("\tX24 = 0x%016lx X25 = 0x%016lx\n", regs->x[24], regs->x[25]);
> >+    printk("\tX26 = 0x%016lx X27 = 0x%016lx\n", regs->x[26], regs->x[27]);
> >+    printk("\tX28 = 0x%016lx X29 = 0x%016lx\n", regs->x[28], regs->x[29]);
> >+    printk("\tX30 (lr) = 0x%016lx\n", regs->lr);
> >+    printk("\tsp  = 0x%016lx\n", regs->sp);
> >+    printk("\tpstate  = 0x%016x\n", regs->pstate);
> >+    printk("\tesr_el1 = %08lx\n", esr);
> >+    printk("\tfar_el1 = %08lx\n", far);
> >+}
> >+
> >  void do_bad_mode(struct pt_regs *regs, int reason,
> >                    unsigned long esr, unsigned long far)
> >  {
> >-    /* TO DO */
> >+    printk(" Bad abort number : %d\n", reason);
> 
> What was the purpose of the variable "reason"? Is it because some trap don't
> give a meaningful error syndrome?
The "reason" makes it easy to know which trap is from, such IRQ/FIQ.

I guess it may also can get the error information from the syndrome.
but need more code to parse out..

Thanks
Huang Shijie

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.