X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/6be108db01439d3463342689446e457a315d6705..6b995c8cb722d10aaacba52999f5c43e43daeb85:/lunaix-os/arch/aarch64/trace.c?ds=sidebyside diff --git a/lunaix-os/arch/aarch64/trace.c b/lunaix-os/arch/aarch64/trace.c new file mode 100644 index 0000000..1930003 --- /dev/null +++ b/lunaix-os/arch/aarch64/trace.c @@ -0,0 +1,76 @@ +#include +#include +#include + +static inline char* +__type_name(reg_t syndrome) +{ + switch (hart_vector_stamp(syndrome)) + { + case EXCEPTION_SYNC: + return "sync"; + case EXCEPTION_IRQ: + return "async (irq)"; + case EXCEPTION_FIQ: + return "async (fiq)"; + case EXCEPTION_SERR: + return "async (serr)"; + } + + return "unknwon"; +} + +void +trace_print_transistion_short(struct hart_state* hstate) +{ + struct exec_param* execp; + reg_t syndrome; + + execp = &hstate->execp; + syndrome = execp->syndrome; + + trace_log("%s from EL%d: ec=%04x, iss=%08lx, il=%d", + __type_name(syndrome), !spsr_from_el0(execp->syndrome), + esr_ec(syndrome), esr_iss(syndrome), esr_inst32(syndrome)); +} + +void +trace_print_transition_full(struct hart_state* hstate) +{ + struct exec_param* execp; + reg_t syndrome; + + execp = &hstate->execp; + syndrome = execp->syndrome; + + trace_log("exception %s from EL%d", + __type_name(syndrome), !spsr_from_el0(execp->syndrome)); + trace_log(" ec=0x%08lx, iss=0x%08lx, il=%d", + esr_ec(syndrome), esr_iss(syndrome), esr_inst32(syndrome)); + trace_log(" esr=0x%016lx, spsr=0x%016lx", + syndrome, execp->spsr); + trace_log(" sp_el0=0x%016lx, sp_el1=0x%016lx", + execp->sp_el0, execp->sp_el1); + trace_log(" pc=0x%016lx", execp->link); +} + +void +trace_dump_state(struct hart_state* hstate) +{ + struct regcontext* r; + + r = &hstate->registers; + + trace_log("hart state dump (depth=%d)", hstate->depth); + + for (int i = 0; i < 30; i+=3) + { + trace_log(" x%02d=0x%016lx x%02d=0x%016lx x%02d=0x%016lx", + i, r->x[i], + i + 1, r->x[i + 1], + i + 2, r->x[i + 2]); + } + + trace_log(" x30=0x%016lx x31=0x%016lx (sp)", + r->x[30], hart_sp(hstate)); +} \ No newline at end of file