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