kexec.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #ifndef _ASM_POWERPC_KEXEC_H
  2. #define _ASM_POWERPC_KEXEC_H
  3. #ifdef __KERNEL__
  4. /*
  5. * Maximum page that is mapped directly into kernel memory.
  6. * XXX: Since we copy virt we can use any page we allocate
  7. */
  8. #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
  9. /*
  10. * Maximum address we can reach in physical address mode.
  11. * XXX: I want to allow initrd in highmem. Otherwise set to rmo on LPAR.
  12. */
  13. #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
  14. /* Maximum address we can use for the control code buffer */
  15. #ifdef __powerpc64__
  16. #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
  17. #else
  18. /* TASK_SIZE, probably left over from use_mm ?? */
  19. #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
  20. #endif
  21. #define KEXEC_CONTROL_PAGE_SIZE 4096
  22. /* The native architecture */
  23. #ifdef __powerpc64__
  24. #define KEXEC_ARCH KEXEC_ARCH_PPC64
  25. #else
  26. #define KEXEC_ARCH KEXEC_ARCH_PPC
  27. #endif
  28. #ifndef __ASSEMBLY__
  29. #include <linux/cpumask.h>
  30. typedef void (*crash_shutdown_t)(void);
  31. #ifdef CONFIG_KEXEC
  32. #ifdef __powerpc64__
  33. /*
  34. * This function is responsible for capturing register states if coming
  35. * via panic or invoking dump using sysrq-trigger.
  36. */
  37. static inline void crash_setup_regs(struct pt_regs *newregs,
  38. struct pt_regs *oldregs)
  39. {
  40. if (oldregs)
  41. memcpy(newregs, oldregs, sizeof(*newregs));
  42. else {
  43. /* FIXME Merge this with xmon_save_regs ?? */
  44. unsigned long tmp1, tmp2;
  45. __asm__ __volatile__ (
  46. "std 0,0(%2)\n"
  47. "std 1,8(%2)\n"
  48. "std 2,16(%2)\n"
  49. "std 3,24(%2)\n"
  50. "std 4,32(%2)\n"
  51. "std 5,40(%2)\n"
  52. "std 6,48(%2)\n"
  53. "std 7,56(%2)\n"
  54. "std 8,64(%2)\n"
  55. "std 9,72(%2)\n"
  56. "std 10,80(%2)\n"
  57. "std 11,88(%2)\n"
  58. "std 12,96(%2)\n"
  59. "std 13,104(%2)\n"
  60. "std 14,112(%2)\n"
  61. "std 15,120(%2)\n"
  62. "std 16,128(%2)\n"
  63. "std 17,136(%2)\n"
  64. "std 18,144(%2)\n"
  65. "std 19,152(%2)\n"
  66. "std 20,160(%2)\n"
  67. "std 21,168(%2)\n"
  68. "std 22,176(%2)\n"
  69. "std 23,184(%2)\n"
  70. "std 24,192(%2)\n"
  71. "std 25,200(%2)\n"
  72. "std 26,208(%2)\n"
  73. "std 27,216(%2)\n"
  74. "std 28,224(%2)\n"
  75. "std 29,232(%2)\n"
  76. "std 30,240(%2)\n"
  77. "std 31,248(%2)\n"
  78. "mfmsr %0\n"
  79. "std %0, 264(%2)\n"
  80. "mfctr %0\n"
  81. "std %0, 280(%2)\n"
  82. "mflr %0\n"
  83. "std %0, 288(%2)\n"
  84. "bl 1f\n"
  85. "1: mflr %1\n"
  86. "std %1, 256(%2)\n"
  87. "mtlr %0\n"
  88. "mfxer %0\n"
  89. "std %0, 296(%2)\n"
  90. : "=&r" (tmp1), "=&r" (tmp2)
  91. : "b" (newregs)
  92. : "memory");
  93. }
  94. }
  95. #else
  96. /*
  97. * Provide a dummy definition to avoid build failures. Will remain
  98. * empty till crash dump support is enabled.
  99. */
  100. static inline void crash_setup_regs(struct pt_regs *newregs,
  101. struct pt_regs *oldregs) { }
  102. #endif /* !__powerpc64 __ */
  103. extern void kexec_smp_wait(void); /* get and clear naca physid, wait for
  104. master to copy new code to 0 */
  105. extern int crashing_cpu;
  106. extern void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *));
  107. extern cpumask_t cpus_in_sr;
  108. static inline int kexec_sr_activated(int cpu)
  109. {
  110. return cpu_isset(cpu,cpus_in_sr);
  111. }
  112. struct kimage;
  113. struct pt_regs;
  114. extern void default_machine_kexec(struct kimage *image);
  115. extern int default_machine_kexec_prepare(struct kimage *image);
  116. extern void default_machine_crash_shutdown(struct pt_regs *regs);
  117. extern int crash_shutdown_register(crash_shutdown_t handler);
  118. extern int crash_shutdown_unregister(crash_shutdown_t handler);
  119. extern void machine_kexec_simple(struct kimage *image);
  120. extern void crash_kexec_secondary(struct pt_regs *regs);
  121. extern int overlaps_crashkernel(unsigned long start, unsigned long size);
  122. extern void reserve_crashkernel(void);
  123. #else /* !CONFIG_KEXEC */
  124. static inline int kexec_sr_activated(int cpu) { return 0; }
  125. static inline void crash_kexec_secondary(struct pt_regs *regs) { }
  126. static inline int overlaps_crashkernel(unsigned long start, unsigned long size)
  127. {
  128. return 0;
  129. }
  130. static inline void reserve_crashkernel(void) { ; }
  131. static inline int crash_shutdown_register(crash_shutdown_t handler)
  132. {
  133. return 0;
  134. }
  135. static inline int crash_shutdown_unregister(crash_shutdown_t handler)
  136. {
  137. return 0;
  138. }
  139. #endif /* CONFIG_KEXEC */
  140. #endif /* ! __ASSEMBLY__ */
  141. #endif /* __KERNEL__ */
  142. #endif /* _ASM_POWERPC_KEXEC_H */