kexec.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ARM_KEXEC_H
  3. #define _ARM_KEXEC_H
  4. #ifdef CONFIG_KEXEC
  5. /* Maximum physical address we can use pages from */
  6. #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
  7. /* Maximum address we can reach in physical address mode */
  8. #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
  9. /* Maximum address we can use for the control code buffer */
  10. #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
  11. #define KEXEC_CONTROL_PAGE_SIZE 4096
  12. #define KEXEC_ARCH KEXEC_ARCH_ARM
  13. #define KEXEC_ARM_ATAGS_OFFSET 0x1000
  14. #define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
  15. #ifndef __ASSEMBLY__
  16. #define ARCH_HAS_KIMAGE_ARCH
  17. struct kimage_arch {
  18. u32 kernel_r2;
  19. };
  20. /**
  21. * crash_setup_regs() - save registers for the panic kernel
  22. * @newregs: registers are saved here
  23. * @oldregs: registers to be saved (may be %NULL)
  24. *
  25. * Function copies machine registers from @oldregs to @newregs. If @oldregs is
  26. * %NULL then current registers are stored there.
  27. */
  28. static inline void crash_setup_regs(struct pt_regs *newregs,
  29. struct pt_regs *oldregs)
  30. {
  31. if (oldregs) {
  32. memcpy(newregs, oldregs, sizeof(*newregs));
  33. } else {
  34. __asm__ __volatile__ (
  35. "stmia %[regs_base], {r0-r12}\n\t"
  36. "mov %[_ARM_sp], sp\n\t"
  37. "str lr, %[_ARM_lr]\n\t"
  38. "adr %[_ARM_pc], 1f\n\t"
  39. "mrs %[_ARM_cpsr], cpsr\n\t"
  40. "1:"
  41. : [_ARM_pc] "=r" (newregs->ARM_pc),
  42. [_ARM_cpsr] "=r" (newregs->ARM_cpsr),
  43. [_ARM_sp] "=r" (newregs->ARM_sp),
  44. [_ARM_lr] "=o" (newregs->ARM_lr)
  45. : [regs_base] "r" (&newregs->ARM_r0)
  46. : "memory"
  47. );
  48. }
  49. }
  50. static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
  51. {
  52. return phys_to_idmap(phys);
  53. }
  54. #define phys_to_boot_phys phys_to_boot_phys
  55. static inline phys_addr_t boot_phys_to_phys(unsigned long entry)
  56. {
  57. return idmap_to_phys(entry);
  58. }
  59. #define boot_phys_to_phys boot_phys_to_phys
  60. static inline unsigned long page_to_boot_pfn(struct page *page)
  61. {
  62. return page_to_pfn(page) + (arch_phys_to_idmap_offset >> PAGE_SHIFT);
  63. }
  64. #define page_to_boot_pfn page_to_boot_pfn
  65. static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
  66. {
  67. return pfn_to_page(boot_pfn - (arch_phys_to_idmap_offset >> PAGE_SHIFT));
  68. }
  69. #define boot_pfn_to_page boot_pfn_to_page
  70. #endif /* __ASSEMBLY__ */
  71. #endif /* CONFIG_KEXEC */
  72. #endif /* _ARM_KEXEC_H */