mrdump_arm.c 786 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include <linux/bug.h>
  2. #include <linux/mm.h>
  3. #include <linux/module.h>
  4. #include <linux/ptrace.h>
  5. #include "mrdump_private.h"
  6. void mrdump_save_current_backtrace(struct pt_regs *regs)
  7. {
  8. asm volatile ("stmia %1, {r0 - r15}\n\t" "mrs %0, cpsr\n":"=r" (regs->uregs[16]) : "r"(regs) : "memory");
  9. }
  10. void mrdump_print_crash(struct pt_regs *regs)
  11. {
  12. unsigned int fp, mode;
  13. int ok = 1;
  14. __show_regs(regs);
  15. /* Print current backtrace */
  16. pr_notice("Backtrace: ");
  17. fp = regs->ARM_fp;
  18. mode = processor_mode(regs);
  19. if (!fp) {
  20. pr_notice("no frame pointer");
  21. ok = 0;
  22. } else if ((fp < PAGE_OFFSET)
  23. || ((high_memory != NULL) && (fp > (unsigned long)high_memory))) {
  24. pr_notice("invalid frame pointer 0x%08x", fp);
  25. ok = 0;
  26. }
  27. pr_notice("\n");
  28. if (ok)
  29. c_backtrace(fp, mode);
  30. }