xref: /openbmc/linux/arch/powerpc/kexec/crash.c (revision dff03381)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Architecture specific (PPC64) functions for kexec based crash dumps.
4  *
5  * Copyright (C) 2005, IBM Corp.
6  *
7  * Created by: Haren Myneni
8  */
9 
10 #include <linux/kernel.h>
11 #include <linux/smp.h>
12 #include <linux/reboot.h>
13 #include <linux/kexec.h>
14 #include <linux/export.h>
15 #include <linux/crash_dump.h>
16 #include <linux/delay.h>
17 #include <linux/irq.h>
18 #include <linux/types.h>
19 
20 #include <asm/processor.h>
21 #include <asm/machdep.h>
22 #include <asm/kexec.h>
23 #include <asm/smp.h>
24 #include <asm/setjmp.h>
25 #include <asm/debug.h>
26 #include <asm/interrupt.h>
27 
28 /*
29  * The primary CPU waits a while for all secondary CPUs to enter. This is to
30  * avoid sending an IPI if the secondary CPUs are entering
31  * crash_kexec_secondary on their own (eg via a system reset).
32  *
33  * The secondary timeout has to be longer than the primary. Both timeouts are
34  * in milliseconds.
35  */
36 #define PRIMARY_TIMEOUT		500
37 #define SECONDARY_TIMEOUT	1000
38 
39 #define IPI_TIMEOUT		10000
40 #define REAL_MODE_TIMEOUT	10000
41 
42 static int time_to_dump;
43 
44 /*
45  * In case of system reset, secondary CPUs enter crash_kexec_secondary with out
46  * having to send an IPI explicitly. So, indicate if the crash is via
47  * system reset to avoid sending another IPI.
48  */
49 static int is_via_system_reset;
50 
51 /*
52  * crash_wake_offline should be set to 1 by platforms that intend to wake
53  * up offline cpus prior to jumping to a kdump kernel. Currently powernv
54  * sets it to 1, since we want to avoid things from happening when an
55  * offline CPU wakes up due to something like an HMI (malfunction error),
56  * which propagates to all threads.
57  */
58 int crash_wake_offline;
59 
60 #define CRASH_HANDLER_MAX 3
61 /* List of shutdown handles */
62 static crash_shutdown_t crash_shutdown_handles[CRASH_HANDLER_MAX];
63 static DEFINE_SPINLOCK(crash_handlers_lock);
64 
65 static unsigned long crash_shutdown_buf[JMP_BUF_LEN];
66 static int crash_shutdown_cpu = -1;
67 
68 static int handle_fault(struct pt_regs *regs)
69 {
70 	if (crash_shutdown_cpu == smp_processor_id())
71 		longjmp(crash_shutdown_buf, 1);
72 	return 0;
73 }
74 
75 #ifdef CONFIG_SMP
76 
77 static atomic_t cpus_in_crash;
78 void crash_ipi_callback(struct pt_regs *regs)
79 {
80 	static cpumask_t cpus_state_saved = CPU_MASK_NONE;
81 
82 	int cpu = smp_processor_id();
83 
84 	hard_irq_disable();
85 	if (!cpumask_test_cpu(cpu, &cpus_state_saved)) {
86 		crash_save_cpu(regs, cpu);
87 		cpumask_set_cpu(cpu, &cpus_state_saved);
88 	}
89 
90 	atomic_inc(&cpus_in_crash);
91 	smp_mb__after_atomic();
92 
93 	/*
94 	 * Starting the kdump boot.
95 	 * This barrier is needed to make sure that all CPUs are stopped.
96 	 */
97 	while (!time_to_dump)
98 		cpu_relax();
99 
100 	if (ppc_md.kexec_cpu_down)
101 		ppc_md.kexec_cpu_down(1, 1);
102 
103 #ifdef CONFIG_PPC64
104 	kexec_smp_wait();
105 #else
106 	for (;;);	/* FIXME */
107 #endif
108 
109 	/* NOTREACHED */
110 }
111 
112 static void crash_kexec_prepare_cpus(void)
113 {
114 	unsigned int msecs;
115 	volatile unsigned int ncpus = num_online_cpus() - 1;/* Excluding the panic cpu */
116 	volatile int tries = 0;
117 	int (*old_handler)(struct pt_regs *regs);
118 
119 	printk(KERN_EMERG "Sending IPI to other CPUs\n");
120 
121 	if (crash_wake_offline)
122 		ncpus = num_present_cpus() - 1;
123 
124 	/*
125 	 * If we came in via system reset, secondaries enter via crash_kexec_secondary().
126 	 * So, wait a while for the secondary CPUs to enter for that case.
127 	 * Else, send IPI to all other CPUs.
128 	 */
129 	if (is_via_system_reset)
130 		mdelay(PRIMARY_TIMEOUT);
131 	else
132 		crash_send_ipi(crash_ipi_callback);
133 	smp_wmb();
134 
135 again:
136 	/*
137 	 * FIXME: Until we will have the way to stop other CPUs reliably,
138 	 * the crash CPU will send an IPI and wait for other CPUs to
139 	 * respond.
140 	 */
141 	msecs = IPI_TIMEOUT;
142 	while ((atomic_read(&cpus_in_crash) < ncpus) && (--msecs > 0))
143 		mdelay(1);
144 
145 	/* Would it be better to replace the trap vector here? */
146 
147 	if (atomic_read(&cpus_in_crash) >= ncpus) {
148 		printk(KERN_EMERG "IPI complete\n");
149 		return;
150 	}
151 
152 	printk(KERN_EMERG "ERROR: %d cpu(s) not responding\n",
153 		ncpus - atomic_read(&cpus_in_crash));
154 
155 	/*
156 	 * If we have a panic timeout set then we can't wait indefinitely
157 	 * for someone to activate system reset. We also give up on the
158 	 * second time through if system reset fail to work.
159 	 */
160 	if ((panic_timeout > 0) || (tries > 0))
161 		return;
162 
163 	/*
164 	 * A system reset will cause all CPUs to take an 0x100 exception.
165 	 * The primary CPU returns here via setjmp, and the secondary
166 	 * CPUs reexecute the crash_kexec_secondary path.
167 	 */
168 	old_handler = __debugger;
169 	__debugger = handle_fault;
170 	crash_shutdown_cpu = smp_processor_id();
171 
172 	if (setjmp(crash_shutdown_buf) == 0) {
173 		printk(KERN_EMERG "Activate system reset (dumprestart) "
174 				  "to stop other cpu(s)\n");
175 
176 		/*
177 		 * A system reset will force all CPUs to execute the
178 		 * crash code again. We need to reset cpus_in_crash so we
179 		 * wait for everyone to do this.
180 		 */
181 		atomic_set(&cpus_in_crash, 0);
182 		smp_mb();
183 
184 		while (atomic_read(&cpus_in_crash) < ncpus)
185 			cpu_relax();
186 	}
187 
188 	crash_shutdown_cpu = -1;
189 	__debugger = old_handler;
190 
191 	tries++;
192 	goto again;
193 }
194 
195 /*
196  * This function will be called by secondary cpus.
197  */
198 void crash_kexec_secondary(struct pt_regs *regs)
199 {
200 	unsigned long flags;
201 	int msecs = SECONDARY_TIMEOUT;
202 
203 	local_irq_save(flags);
204 
205 	/* Wait for the primary crash CPU to signal its progress */
206 	while (crashing_cpu < 0) {
207 		if (--msecs < 0) {
208 			/* No response, kdump image may not have been loaded */
209 			local_irq_restore(flags);
210 			return;
211 		}
212 
213 		mdelay(1);
214 	}
215 
216 	crash_ipi_callback(regs);
217 }
218 
219 #else	/* ! CONFIG_SMP */
220 
221 static void crash_kexec_prepare_cpus(void)
222 {
223 	/*
224 	 * move the secondaries to us so that we can copy
225 	 * the new kernel 0-0x100 safely
226 	 *
227 	 * do this if kexec in setup.c ?
228 	 */
229 #ifdef CONFIG_PPC64
230 	smp_release_cpus();
231 #else
232 	/* FIXME */
233 #endif
234 }
235 
236 void crash_kexec_secondary(struct pt_regs *regs)
237 {
238 }
239 #endif	/* CONFIG_SMP */
240 
241 /* wait for all the CPUs to hit real mode but timeout if they don't come in */
242 #if defined(CONFIG_SMP) && defined(CONFIG_PPC64)
243 noinstr static void __maybe_unused crash_kexec_wait_realmode(int cpu)
244 {
245 	unsigned int msecs;
246 	int i;
247 
248 	msecs = REAL_MODE_TIMEOUT;
249 	for (i=0; i < nr_cpu_ids && msecs > 0; i++) {
250 		if (i == cpu)
251 			continue;
252 
253 		while (paca_ptrs[i]->kexec_state < KEXEC_STATE_REAL_MODE) {
254 			barrier();
255 			if (!cpu_possible(i) || !cpu_online(i) || (msecs <= 0))
256 				break;
257 			msecs--;
258 			mdelay(1);
259 		}
260 	}
261 	mb();
262 }
263 #else
264 static inline void crash_kexec_wait_realmode(int cpu) {}
265 #endif	/* CONFIG_SMP && CONFIG_PPC64 */
266 
267 void crash_kexec_prepare(void)
268 {
269 	/* Avoid hardlocking with irresponsive CPU holding logbuf_lock */
270 	printk_deferred_enter();
271 
272 	/*
273 	 * This function is only called after the system
274 	 * has panicked or is otherwise in a critical state.
275 	 * The minimum amount of code to allow a kexec'd kernel
276 	 * to run successfully needs to happen here.
277 	 *
278 	 * In practice this means stopping other cpus in
279 	 * an SMP system.
280 	 * The kernel is broken so disable interrupts.
281 	 */
282 	hard_irq_disable();
283 
284 	/*
285 	 * Make a note of crashing cpu. Will be used in machine_kexec
286 	 * such that another IPI will not be sent.
287 	 */
288 	crashing_cpu = smp_processor_id();
289 
290 	crash_kexec_prepare_cpus();
291 }
292 
293 /*
294  * Register a function to be called on shutdown.  Only use this if you
295  * can't reset your device in the second kernel.
296  */
297 int crash_shutdown_register(crash_shutdown_t handler)
298 {
299 	unsigned int i, rc;
300 
301 	spin_lock(&crash_handlers_lock);
302 	for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
303 		if (!crash_shutdown_handles[i]) {
304 			/* Insert handle at first empty entry */
305 			crash_shutdown_handles[i] = handler;
306 			rc = 0;
307 			break;
308 		}
309 
310 	if (i == CRASH_HANDLER_MAX) {
311 		printk(KERN_ERR "Crash shutdown handles full, "
312 		       "not registered.\n");
313 		rc = 1;
314 	}
315 
316 	spin_unlock(&crash_handlers_lock);
317 	return rc;
318 }
319 EXPORT_SYMBOL(crash_shutdown_register);
320 
321 int crash_shutdown_unregister(crash_shutdown_t handler)
322 {
323 	unsigned int i, rc;
324 
325 	spin_lock(&crash_handlers_lock);
326 	for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
327 		if (crash_shutdown_handles[i] == handler)
328 			break;
329 
330 	if (i == CRASH_HANDLER_MAX) {
331 		printk(KERN_ERR "Crash shutdown handle not found\n");
332 		rc = 1;
333 	} else {
334 		/* Shift handles down */
335 		for (; i < (CRASH_HANDLER_MAX - 1); i++)
336 			crash_shutdown_handles[i] =
337 				crash_shutdown_handles[i+1];
338 		/*
339 		 * Reset last entry to NULL now that it has been shifted down,
340 		 * this will allow new handles to be added here.
341 		 */
342 		crash_shutdown_handles[i] = NULL;
343 		rc = 0;
344 	}
345 
346 	spin_unlock(&crash_handlers_lock);
347 	return rc;
348 }
349 EXPORT_SYMBOL(crash_shutdown_unregister);
350 
351 void default_machine_crash_shutdown(struct pt_regs *regs)
352 {
353 	unsigned int i;
354 	int (*old_handler)(struct pt_regs *regs);
355 
356 	if (TRAP(regs) == INTERRUPT_SYSTEM_RESET)
357 		is_via_system_reset = 1;
358 
359 	crash_smp_send_stop();
360 
361 	crash_save_cpu(regs, crashing_cpu);
362 
363 	time_to_dump = 1;
364 
365 	crash_kexec_wait_realmode(crashing_cpu);
366 
367 	machine_kexec_mask_interrupts();
368 
369 	/*
370 	 * Call registered shutdown routines safely.  Swap out
371 	 * __debugger_fault_handler, and replace on exit.
372 	 */
373 	old_handler = __debugger_fault_handler;
374 	__debugger_fault_handler = handle_fault;
375 	crash_shutdown_cpu = smp_processor_id();
376 	for (i = 0; i < CRASH_HANDLER_MAX && crash_shutdown_handles[i]; i++) {
377 		if (setjmp(crash_shutdown_buf) == 0) {
378 			/*
379 			 * Insert syncs and delay to ensure
380 			 * instructions in the dangerous region don't
381 			 * leak away from this protected region.
382 			 */
383 			asm volatile("sync; isync");
384 			/* dangerous region */
385 			crash_shutdown_handles[i]();
386 			asm volatile("sync; isync");
387 		}
388 	}
389 	crash_shutdown_cpu = -1;
390 	__debugger_fault_handler = old_handler;
391 
392 	if (ppc_md.kexec_cpu_down)
393 		ppc_md.kexec_cpu_down(1, 0);
394 }
395