move gic to new devtree interface
[lunaix-os.git] / lunaix-os / arch / aarch64 / trace.c
1 #include <lunaix/trace.h>
2 #include <asm/aa64_exception.h>
3 #include <sys-generic/trace_arch.h>
4
5 static inline char*
6 __type_name(reg_t syndrome)
7 {
8     switch (BITS_GET(syndrome, SYNDROME_ETYPE))
9     {
10         case EXCEPTION_SYNC:
11             return "sync";
12         case EXCEPTION_IRQ:
13             return "async (irq)";
14         case EXCEPTION_FIQ:
15             return "async (fiq)";
16         case EXCEPTION_SERR:
17             return "async (serr)";
18     }
19
20     return "unknwon";
21 }
22
23 void
24 trace_print_transistion_short(struct hart_state* hstate)
25 {
26     struct exec_param* execp;
27     reg_t syndrome;
28     
29     execp = &hstate->execp;
30     syndrome = execp->syndrome;
31
32     trace_log("%s from EL%d: ec=%04x, iss=%08lx, il=%d", 
33                 __type_name(syndrome), !spsr_from_el0(execp->syndrome),
34                 esr_ec(syndrome), esr_iss(syndrome), esr_inst32(syndrome));
35 }
36
37 void
38 trace_print_transition_full(struct hart_state* hstate)
39 {
40     struct exec_param* execp;
41     reg_t syndrome;
42     
43     execp = &hstate->execp;
44     syndrome = execp->syndrome;
45
46     trace_log("exception %s from EL%d", 
47                 __type_name(syndrome), !spsr_from_el0(execp->syndrome));
48     trace_log("  ec=0x%08lx, iss=0x%08lx, il=%d",
49                 esr_ec(syndrome), esr_iss(syndrome), esr_inst32(syndrome));
50     trace_log("  esr=0x%016lx,  spsr=0x%016lx",
51                 syndrome, execp->spsr);
52     trace_log("  sp_el0=0x%016lx,  sp_el1=0x%016lx",
53                 execp->sp_el0, hart_sp(hstate));
54     trace_log("  pc=0x%016lx", execp->link);
55 }
56
57 void
58 trace_dump_state(struct hart_state* hstate)
59 {
60     struct regcontext* r;
61     
62     r = &hstate->registers;
63
64     trace_log("hart state dump (depth=%d)", hstate->depth);
65
66     for (int i = 0; i < 30; i+=3)
67     {
68         trace_log("  x%02d=0x%016lx   x%02d=0x%016lx   x%02d=0x%016lx",
69                     i, r->x[i], 
70                     i + 1, r->x[i + 1], 
71                     i + 2, r->x[i + 2]);
72     }
73     
74     trace_log("  x30=0x%016lx   x31=0x%016lx (sp)",
75                 r->x[30],   hart_sp(hstate));
76 }