kexec.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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_CODE_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. #ifdef CONFIG_KEXEC
  31. #ifdef __powerpc64__
  32. /*
  33. * This function is responsible for capturing register states if coming
  34. * via panic or invoking dump using sysrq-trigger.
  35. */
  36. static inline void crash_setup_regs(struct pt_regs *newregs,
  37. struct pt_regs *oldregs)
  38. {
  39. if (oldregs)
  40. memcpy(newregs, oldregs, sizeof(*newregs));
  41. else {
  42. /* FIXME Merge this with xmon_save_regs ?? */
  43. unsigned long tmp1, tmp2;
  44. __asm__ __volatile__ (
  45. "std 0,0(%2)\n"
  46. "std 1,8(%2)\n"
  47. "std 2,16(%2)\n"
  48. "std 3,24(%2)\n"
  49. "std 4,32(%2)\n"
  50. "std 5,40(%2)\n"
  51. "std 6,48(%2)\n"
  52. "std 7,56(%2)\n"
  53. "std 8,64(%2)\n"
  54. "std 9,72(%2)\n"
  55. "std 10,80(%2)\n"
  56. "std 11,88(%2)\n"
  57. "std 12,96(%2)\n"
  58. "std 13,104(%2)\n"
  59. "std 14,112(%2)\n"
  60. "std 15,120(%2)\n"
  61. "std 16,128(%2)\n"
  62. "std 17,136(%2)\n"
  63. "std 18,144(%2)\n"
  64. "std 19,152(%2)\n"
  65. "std 20,160(%2)\n"
  66. "std 21,168(%2)\n"
  67. "std 22,176(%2)\n"
  68. "std 23,184(%2)\n"
  69. "std 24,192(%2)\n"
  70. "std 25,200(%2)\n"
  71. "std 26,208(%2)\n"
  72. "std 27,216(%2)\n"
  73. "std 28,224(%2)\n"
  74. "std 29,232(%2)\n"
  75. "std 30,240(%2)\n"
  76. "std 31,248(%2)\n"
  77. "mfmsr %0\n"
  78. "std %0, 264(%2)\n"
  79. "mfctr %0\n"
  80. "std %0, 280(%2)\n"
  81. "mflr %0\n"
  82. "std %0, 288(%2)\n"
  83. "bl 1f\n"
  84. "1: mflr %1\n"
  85. "std %1, 256(%2)\n"
  86. "mtlr %0\n"
  87. "mfxer %0\n"
  88. "std %0, 296(%2)\n"
  89. : "=&r" (tmp1), "=&r" (tmp2)
  90. : "b" (newregs)
  91. : "memory");
  92. }
  93. }
  94. #else
  95. /*
  96. * Provide a dummy definition to avoid build failures. Will remain
  97. * empty till crash dump support is enabled.
  98. */
  99. static inline void crash_setup_regs(struct pt_regs *newregs,
  100. struct pt_regs *oldregs) { }
  101. #endif /* !__powerpc64 __ */
  102. extern void kexec_smp_wait(void); /* get and clear naca physid, wait for
  103. master to copy new code to 0 */
  104. extern int crashing_cpu;
  105. extern void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *));
  106. extern cpumask_t cpus_in_sr;
  107. static inline int kexec_sr_activated(int cpu)
  108. {
  109. return cpu_isset(cpu,cpus_in_sr);
  110. }
  111. struct kimage;
  112. struct pt_regs;
  113. extern void default_machine_kexec(struct kimage *image);
  114. extern int default_machine_kexec_prepare(struct kimage *image);
  115. extern void default_machine_crash_shutdown(struct pt_regs *regs);
  116. extern void machine_kexec_simple(struct kimage *image);
  117. extern void crash_kexec_secondary(struct pt_regs *regs);
  118. extern int overlaps_crashkernel(unsigned long start, unsigned long size);
  119. extern void reserve_crashkernel(void);
  120. #else /* !CONFIG_KEXEC */
  121. static inline int kexec_sr_activated(int cpu) { return 0; }
  122. static inline void crash_kexec_secondary(struct pt_regs *regs) { }
  123. static inline int overlaps_crashkernel(unsigned long start, unsigned long size)
  124. {
  125. return 0;
  126. }
  127. static inline void reserve_crashkernel(void) { ; }
  128. #endif /* CONFIG_KEXEC */
  129. #endif /* ! __ASSEMBLY__ */
  130. #endif /* __KERNEL__ */
  131. #endif /* _ASM_POWERPC_KEXEC_H */