summaryrefslogtreecommitdiff
path: root/src/crash-stack
diff options
context:
space:
mode:
authorŁukasz Stelmach <l.stelmach@samsung.com>2016-10-20 12:14:53 +0200
committerŁukasz Stelmach <l.stelmach@samsung.com>2016-12-08 13:51:36 +0100
commit9c3bf3fb2f53e171a2c46a43ef34c312c9878604 (patch)
treea42d0b902a342b82541a7e478e3f8ced0ad866dd /src/crash-stack
parentb6df9cafb1fe97c153993d027af21eaff82616b8 (diff)
downloadcrash-worker-9c3bf3fb2f53e171a2c46a43ef34c312c9878604.tar.gz
crash-worker-9c3bf3fb2f53e171a2c46a43ef34c312c9878604.tar.bz2
crash-worker-9c3bf3fb2f53e171a2c46a43ef34c312c9878604.zip
crash-stack: Print register values
Change-Id: If8d82aa32eb524ffb23715af6016f0fec12bd144
Diffstat (limited to 'src/crash-stack')
-rw-r--r--src/crash-stack/crash-stack-aarch64.c27
-rw-r--r--src/crash-stack/crash-stack-arm.c24
-rw-r--r--src/crash-stack/crash-stack-x86_64.c28
-rw-r--r--src/crash-stack/crash-stack.c3
-rw-r--r--src/crash-stack/crash-stack.h8
-rw-r--r--src/crash-stack/wind/unwarm.h2
6 files changed, 91 insertions, 1 deletions
diff --git a/src/crash-stack/crash-stack-aarch64.c b/src/crash-stack/crash-stack-aarch64.c
index 6333a45..4e8ef32 100644
--- a/src/crash-stack/crash-stack-aarch64.c
+++ b/src/crash-stack/crash-stack-aarch64.c
@@ -96,3 +96,30 @@ void *_get_place_for_register_value(const char *regname, int regnum)
return &g_regs.x30;
return NULL;
}
+
+#define PSR_MODE32_BIT 0x00000010
+#define PSR_MODE_MASK 0x0000000f
+
+void _crash_stack_print_regs(FILE* outputfile)
+{
+ int i,top_reg;
+
+ if ((g_registers.pstate & (PSR_MODE32_BIT | PSR_MODE_MASK)) == PSR_MODE32_BIT) {
+ top_reg = 12;
+ } else {
+ top_reg = 29;
+ }
+
+ fprintf(outputfile, "\nRegister Information\n");
+ fprintf(outputfile, "pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n",
+ g_registers.pc, g_registers.regs[30], g_registers.pstate);
+ fprintf(outputfile, "sp : %016llx\n", g_registers.sp);
+
+ for (i = top_reg; i >= 0; i--) {
+ fprintf(outputfile, "x%-2d: %016llx ", i, g_registers.regs[i]);
+ if ((i%2) == 0) {
+ fprintf(outputfile,"\n");
+ }
+ }
+ fprintf(outputfile,"\n");
+}
diff --git a/src/crash-stack/crash-stack-arm.c b/src/crash-stack/crash-stack-arm.c
index 7ad3b9b..e02f324 100644
--- a/src/crash-stack/crash-stack-arm.c
+++ b/src/crash-stack/crash-stack-arm.c
@@ -190,3 +190,27 @@ void _create_crash_stack(Dwfl *dwfl, Elf *core, pid_t pid, Mappings *mappings, C
UnwStartArm(&state);
}
+void _crash_stack_print_regs(FILE* outputfile)
+{
+ fprintf(outputfile, "\nRegister Information\n");
+ fprintf(outputfile, "pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n",
+ g_ptrace_registers.uregs[REG_PC], g_ptrace_registers.uregs[REG_LR],
+ g_ptrace_registers.uregs[REG_SPSR]
+ );
+ fprintf(outputfile, "sp : %08lx ip : %08lx fp : %08lx\n",
+ g_ptrace_registers.uregs[REG_SP], g_ptrace_registers.uregs[REG_IP],
+ g_ptrace_registers.uregs[REG_FP]
+ );
+ fprintf(outputfile, "r10: %08lx r9 : %08lx r8 : %08lx\n",
+ g_ptrace_registers.uregs[10], g_ptrace_registers.uregs[9],
+ g_ptrace_registers.uregs[8]
+ );
+ fprintf(outputfile, "r7 : %08lx r6 : %08lx r5 : %08lx r4 : %08lx\n",
+ g_ptrace_registers.uregs[7], g_ptrace_registers.uregs[6],
+ g_ptrace_registers.uregs[5], g_ptrace_registers.uregs[4]
+ );
+ fprintf(outputfile, "r3 : %08lx r2 : %08lx r1 : %08lx r0 : %08lx\n",
+ g_ptrace_registers.uregs[3], g_ptrace_registers.uregs[2],
+ g_ptrace_registers.uregs[1], g_ptrace_registers.uregs[0]
+ );
+}
diff --git a/src/crash-stack/crash-stack-x86_64.c b/src/crash-stack/crash-stack-x86_64.c
index 174b2f4..1690c7a 100644
--- a/src/crash-stack/crash-stack-x86_64.c
+++ b/src/crash-stack/crash-stack-x86_64.c
@@ -42,3 +42,31 @@ void _crash_stack_set_ptrace_registers(void *regbuf)
memcpy(rsp, &regs->rsp, sizeof(regs->rsp));
memcpy(rip, &regs->rip, sizeof(regs->rip));
}
+
+void _crash_stack_print_regs(FILE* outputfile)
+{
+#define _PRINT_REGISTERS(a,b,c) \
+ fprintf(outputfile, "%3s: %016lx %3s: %016lx %3s: %016lx\n", \
+ #a, g_registers.a, \
+ #b, g_registers.b, \
+ #c, g_registers.c)
+ fprintf(outputfile, "\nRegister Information\n");
+#ifdef __x86_64__
+ fprintf(outputfile, "rip: %04lx:[<%016lx>]\n",
+ g_registers.cs & 0xffff,
+ g_registers.rip);
+ fprintf(outputfile, "rsp: %04lx:%016lx eflags: %08lx\n",
+ g_registers.ss,
+ g_registers.rsp,
+ g_registers.eflags);
+ _PRINT_REGISTERS(rax, rbx, rcx);
+ _PRINT_REGISTERS(rdx, rsi, rdi);
+ _PRINT_REGISTERS(rbp, r8, r9);
+ _PRINT_REGISTERS(r10, r11, r12);
+ _PRINT_REGISTERS(r13, r14, r15);
+#else
+ fprintf(outputfile, "Unsupported architecture\n")
+#endif
+ fprintf(outputfile, "\n");
+#undef _PRINT_REGISTERS
+}
diff --git a/src/crash-stack/crash-stack.c b/src/crash-stack/crash-stack.c
index 71c3114..2fc64fd 100644
--- a/src/crash-stack/crash-stack.c
+++ b/src/crash-stack/crash-stack.c
@@ -738,6 +738,9 @@ int main(int argc, char **argv)
_create_crash_stack(dwfl, core, pid, &mappings, &callstack);
+ /* Print registers */
+ _crash_stack_print_regs(outputfile);
+
/* Print the results */
__print_callstack(&callstack, dwfl, core, pid, notes);
diff --git a/src/crash-stack/crash-stack.h b/src/crash-stack/crash-stack.h
index e5d3f20..3dfccef 100644
--- a/src/crash-stack/crash-stack.h
+++ b/src/crash-stack/crash-stack.h
@@ -119,7 +119,7 @@ bool _crash_stack_libelf_read_value(Dwfl *dwfl, Elf *core, pid_t pid,
void *_crash_stack_get_memory_for_ptrace_registers(size_t *size);
/**
- * @brief Sets current values of registers from ptrace buffer
+ * @brief Sets current values of registers from the ptrace buffer
*
* @param regbuf buffer used for getting registers with ptrace()
*
@@ -127,4 +127,10 @@ void *_crash_stack_get_memory_for_ptrace_registers(size_t *size);
*/
void _crash_stack_set_ptrace_registers(void *regbuf);
+/**
+ * @brief Print values of registers from the ptrace buffer
+ *
+ * @param outputfile output stream
+ */
+void _crash_stack_print_regs(FILE* outputfile);
#endif /* CRASH_STACK_H */
diff --git a/src/crash-stack/wind/unwarm.h b/src/crash-stack/wind/unwarm.h
index b75b6cb..5cff863 100644
--- a/src/crash-stack/wind/unwarm.h
+++ b/src/crash-stack/wind/unwarm.h
@@ -98,6 +98,8 @@ typedef struct
MemData;
#define REGS_REGULAR_NUM 13
+#define REG_FP 11
+#define REG_IP 12
#define REG_SP 13
#define REG_LR 14
#define REG_PC 15