xref: /openbmc/linux/arch/x86/kernel/reboot.c (revision e9b7b8b3)
1 // SPDX-License-Identifier: GPL-2.0
2 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
3 
4 #include <linux/export.h>
5 #include <linux/reboot.h>
6 #include <linux/init.h>
7 #include <linux/pm.h>
8 #include <linux/efi.h>
9 #include <linux/dmi.h>
10 #include <linux/sched.h>
11 #include <linux/tboot.h>
12 #include <linux/delay.h>
13 #include <linux/objtool.h>
14 #include <linux/pgtable.h>
15 #include <acpi/reboot.h>
16 #include <asm/io.h>
17 #include <asm/apic.h>
18 #include <asm/io_apic.h>
19 #include <asm/desc.h>
20 #include <asm/hpet.h>
21 #include <asm/proto.h>
22 #include <asm/reboot_fixups.h>
23 #include <asm/reboot.h>
24 #include <asm/pci_x86.h>
25 #include <asm/cpu.h>
26 #include <asm/nmi.h>
27 #include <asm/smp.h>
28 
29 #include <linux/ctype.h>
30 #include <linux/mc146818rtc.h>
31 #include <asm/realmode.h>
32 #include <asm/x86_init.h>
33 #include <asm/efi.h>
34 
35 /*
36  * Power off function, if any
37  */
38 void (*pm_power_off)(void);
39 EXPORT_SYMBOL(pm_power_off);
40 
41 /*
42  * This is set if we need to go through the 'emergency' path.
43  * When machine_emergency_restart() is called, we may be on
44  * an inconsistent state and won't be able to do a clean cleanup
45  */
46 static int reboot_emergency;
47 
48 /* This is set by the PCI code if either type 1 or type 2 PCI is detected */
49 bool port_cf9_safe = false;
50 
51 /*
52  * Reboot options and system auto-detection code provided by
53  * Dell Inc. so their systems "just work". :-)
54  */
55 
56 /*
57  * Some machines require the "reboot=a" commandline options
58  */
59 static int __init set_acpi_reboot(const struct dmi_system_id *d)
60 {
61 	if (reboot_type != BOOT_ACPI) {
62 		reboot_type = BOOT_ACPI;
63 		pr_info("%s series board detected. Selecting %s-method for reboots.\n",
64 			d->ident, "ACPI");
65 	}
66 	return 0;
67 }
68 
69 /*
70  * Some machines require the "reboot=b" or "reboot=k"  commandline options,
71  * this quirk makes that automatic.
72  */
73 static int __init set_bios_reboot(const struct dmi_system_id *d)
74 {
75 	if (reboot_type != BOOT_BIOS) {
76 		reboot_type = BOOT_BIOS;
77 		pr_info("%s series board detected. Selecting %s-method for reboots.\n",
78 			d->ident, "BIOS");
79 	}
80 	return 0;
81 }
82 
83 /*
84  * Some machines don't handle the default ACPI reboot method and
85  * require the EFI reboot method:
86  */
87 static int __init set_efi_reboot(const struct dmi_system_id *d)
88 {
89 	if (reboot_type != BOOT_EFI && !efi_runtime_disabled()) {
90 		reboot_type = BOOT_EFI;
91 		pr_info("%s series board detected. Selecting EFI-method for reboot.\n", d->ident);
92 	}
93 	return 0;
94 }
95 
96 void __noreturn machine_real_restart(unsigned int type)
97 {
98 	local_irq_disable();
99 
100 	/*
101 	 * Write zero to CMOS register number 0x0f, which the BIOS POST
102 	 * routine will recognize as telling it to do a proper reboot.  (Well
103 	 * that's what this book in front of me says -- it may only apply to
104 	 * the Phoenix BIOS though, it's not clear).  At the same time,
105 	 * disable NMIs by setting the top bit in the CMOS address register,
106 	 * as we're about to do peculiar things to the CPU.  I'm not sure if
107 	 * `outb_p' is needed instead of just `outb'.  Use it to be on the
108 	 * safe side.  (Yes, CMOS_WRITE does outb_p's. -  Paul G.)
109 	 */
110 	spin_lock(&rtc_lock);
111 	CMOS_WRITE(0x00, 0x8f);
112 	spin_unlock(&rtc_lock);
113 
114 	/*
115 	 * Switch to the trampoline page table.
116 	 */
117 	load_trampoline_pgtable();
118 
119 	/* Jump to the identity-mapped low memory code */
120 #ifdef CONFIG_X86_32
121 	asm volatile("jmpl *%0" : :
122 		     "rm" (real_mode_header->machine_real_restart_asm),
123 		     "a" (type));
124 #else
125 	asm volatile("ljmpl *%0" : :
126 		     "m" (real_mode_header->machine_real_restart_asm),
127 		     "D" (type));
128 #endif
129 	unreachable();
130 }
131 #ifdef CONFIG_APM_MODULE
132 EXPORT_SYMBOL(machine_real_restart);
133 #endif
134 STACK_FRAME_NON_STANDARD(machine_real_restart);
135 
136 /*
137  * Some Apple MacBook and MacBookPro's needs reboot=p to be able to reboot
138  */
139 static int __init set_pci_reboot(const struct dmi_system_id *d)
140 {
141 	if (reboot_type != BOOT_CF9_FORCE) {
142 		reboot_type = BOOT_CF9_FORCE;
143 		pr_info("%s series board detected. Selecting %s-method for reboots.\n",
144 			d->ident, "PCI");
145 	}
146 	return 0;
147 }
148 
149 static int __init set_kbd_reboot(const struct dmi_system_id *d)
150 {
151 	if (reboot_type != BOOT_KBD) {
152 		reboot_type = BOOT_KBD;
153 		pr_info("%s series board detected. Selecting %s-method for reboot.\n",
154 			d->ident, "KBD");
155 	}
156 	return 0;
157 }
158 
159 /*
160  * This is a single dmi_table handling all reboot quirks.
161  */
162 static const struct dmi_system_id reboot_dmi_table[] __initconst = {
163 
164 	/* Acer */
165 	{	/* Handle reboot issue on Acer Aspire one */
166 		.callback = set_kbd_reboot,
167 		.ident = "Acer Aspire One A110",
168 		.matches = {
169 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
170 			DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"),
171 		},
172 	},
173 	{	/* Handle reboot issue on Acer TravelMate X514-51T */
174 		.callback = set_efi_reboot,
175 		.ident = "Acer TravelMate X514-51T",
176 		.matches = {
177 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
178 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate X514-51T"),
179 		},
180 	},
181 
182 	/* Apple */
183 	{	/* Handle problems with rebooting on Apple MacBook5 */
184 		.callback = set_pci_reboot,
185 		.ident = "Apple MacBook5",
186 		.matches = {
187 			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
188 			DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"),
189 		},
190 	},
191 	{	/* Handle problems with rebooting on Apple MacBook6,1 */
192 		.callback = set_pci_reboot,
193 		.ident = "Apple MacBook6,1",
194 		.matches = {
195 			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
196 			DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"),
197 		},
198 	},
199 	{	/* Handle problems with rebooting on Apple MacBookPro5 */
200 		.callback = set_pci_reboot,
201 		.ident = "Apple MacBookPro5",
202 		.matches = {
203 			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
204 			DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"),
205 		},
206 	},
207 	{	/* Handle problems with rebooting on Apple Macmini3,1 */
208 		.callback = set_pci_reboot,
209 		.ident = "Apple Macmini3,1",
210 		.matches = {
211 			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
212 			DMI_MATCH(DMI_PRODUCT_NAME, "Macmini3,1"),
213 		},
214 	},
215 	{	/* Handle problems with rebooting on the iMac9,1. */
216 		.callback = set_pci_reboot,
217 		.ident = "Apple iMac9,1",
218 		.matches = {
219 			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
220 			DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1"),
221 		},
222 	},
223 	{	/* Handle problems with rebooting on the iMac10,1. */
224 		.callback = set_pci_reboot,
225 		.ident = "Apple iMac10,1",
226 		.matches = {
227 		    DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
228 		    DMI_MATCH(DMI_PRODUCT_NAME, "iMac10,1"),
229 		},
230 	},
231 
232 	/* ASRock */
233 	{	/* Handle problems with rebooting on ASRock Q1900DC-ITX */
234 		.callback = set_pci_reboot,
235 		.ident = "ASRock Q1900DC-ITX",
236 		.matches = {
237 			DMI_MATCH(DMI_BOARD_VENDOR, "ASRock"),
238 			DMI_MATCH(DMI_BOARD_NAME, "Q1900DC-ITX"),
239 		},
240 	},
241 
242 	/* ASUS */
243 	{	/* Handle problems with rebooting on ASUS P4S800 */
244 		.callback = set_bios_reboot,
245 		.ident = "ASUS P4S800",
246 		.matches = {
247 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
248 			DMI_MATCH(DMI_BOARD_NAME, "P4S800"),
249 		},
250 	},
251 	{	/* Handle problems with rebooting on ASUS EeeBook X205TA */
252 		.callback = set_acpi_reboot,
253 		.ident = "ASUS EeeBook X205TA",
254 		.matches = {
255 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
256 			DMI_MATCH(DMI_PRODUCT_NAME, "X205TA"),
257 		},
258 	},
259 	{	/* Handle problems with rebooting on ASUS EeeBook X205TAW */
260 		.callback = set_acpi_reboot,
261 		.ident = "ASUS EeeBook X205TAW",
262 		.matches = {
263 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
264 			DMI_MATCH(DMI_PRODUCT_NAME, "X205TAW"),
265 		},
266 	},
267 
268 	/* Certec */
269 	{       /* Handle problems with rebooting on Certec BPC600 */
270 		.callback = set_pci_reboot,
271 		.ident = "Certec BPC600",
272 		.matches = {
273 			DMI_MATCH(DMI_SYS_VENDOR, "Certec"),
274 			DMI_MATCH(DMI_PRODUCT_NAME, "BPC600"),
275 		},
276 	},
277 
278 	/* Dell */
279 	{	/* Handle problems with rebooting on Dell DXP061 */
280 		.callback = set_bios_reboot,
281 		.ident = "Dell DXP061",
282 		.matches = {
283 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
284 			DMI_MATCH(DMI_PRODUCT_NAME, "Dell DXP061"),
285 		},
286 	},
287 	{	/* Handle problems with rebooting on Dell E520's */
288 		.callback = set_bios_reboot,
289 		.ident = "Dell E520",
290 		.matches = {
291 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
292 			DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM061"),
293 		},
294 	},
295 	{	/* Handle problems with rebooting on the Latitude E5410. */
296 		.callback = set_pci_reboot,
297 		.ident = "Dell Latitude E5410",
298 		.matches = {
299 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
300 			DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E5410"),
301 		},
302 	},
303 	{	/* Handle problems with rebooting on the Latitude E5420. */
304 		.callback = set_pci_reboot,
305 		.ident = "Dell Latitude E5420",
306 		.matches = {
307 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
308 			DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E5420"),
309 		},
310 	},
311 	{	/* Handle problems with rebooting on the Latitude E6320. */
312 		.callback = set_pci_reboot,
313 		.ident = "Dell Latitude E6320",
314 		.matches = {
315 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
316 			DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6320"),
317 		},
318 	},
319 	{	/* Handle problems with rebooting on the Latitude E6420. */
320 		.callback = set_pci_reboot,
321 		.ident = "Dell Latitude E6420",
322 		.matches = {
323 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
324 			DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6420"),
325 		},
326 	},
327 	{	/* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */
328 		.callback = set_bios_reboot,
329 		.ident = "Dell OptiPlex 330",
330 		.matches = {
331 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
332 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"),
333 			DMI_MATCH(DMI_BOARD_NAME, "0KP561"),
334 		},
335 	},
336 	{	/* Handle problems with rebooting on Dell Optiplex 360 with 0T656F */
337 		.callback = set_bios_reboot,
338 		.ident = "Dell OptiPlex 360",
339 		.matches = {
340 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
341 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 360"),
342 			DMI_MATCH(DMI_BOARD_NAME, "0T656F"),
343 		},
344 	},
345 	{	/* Handle problems with rebooting on Dell Optiplex 745's SFF */
346 		.callback = set_bios_reboot,
347 		.ident = "Dell OptiPlex 745",
348 		.matches = {
349 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
350 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
351 		},
352 	},
353 	{	/* Handle problems with rebooting on Dell Optiplex 745's DFF */
354 		.callback = set_bios_reboot,
355 		.ident = "Dell OptiPlex 745",
356 		.matches = {
357 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
358 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
359 			DMI_MATCH(DMI_BOARD_NAME, "0MM599"),
360 		},
361 	},
362 	{	/* Handle problems with rebooting on Dell Optiplex 745 with 0KW626 */
363 		.callback = set_bios_reboot,
364 		.ident = "Dell OptiPlex 745",
365 		.matches = {
366 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
367 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 745"),
368 			DMI_MATCH(DMI_BOARD_NAME, "0KW626"),
369 		},
370 	},
371 	{	/* Handle problems with rebooting on Dell OptiPlex 760 with 0G919G */
372 		.callback = set_bios_reboot,
373 		.ident = "Dell OptiPlex 760",
374 		.matches = {
375 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
376 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 760"),
377 			DMI_MATCH(DMI_BOARD_NAME, "0G919G"),
378 		},
379 	},
380 	{	/* Handle problems with rebooting on the OptiPlex 990. */
381 		.callback = set_pci_reboot,
382 		.ident = "Dell OptiPlex 990 BIOS A0x",
383 		.matches = {
384 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
385 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"),
386 			DMI_MATCH(DMI_BIOS_VERSION, "A0"),
387 		},
388 	},
389 	{	/* Handle problems with rebooting on Dell 300's */
390 		.callback = set_bios_reboot,
391 		.ident = "Dell PowerEdge 300",
392 		.matches = {
393 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
394 			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 300/"),
395 		},
396 	},
397 	{	/* Handle problems with rebooting on Dell 1300's */
398 		.callback = set_bios_reboot,
399 		.ident = "Dell PowerEdge 1300",
400 		.matches = {
401 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
402 			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1300/"),
403 		},
404 	},
405 	{	/* Handle problems with rebooting on Dell 2400's */
406 		.callback = set_bios_reboot,
407 		.ident = "Dell PowerEdge 2400",
408 		.matches = {
409 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
410 			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),
411 		},
412 	},
413 	{	/* Handle problems with rebooting on the Dell PowerEdge C6100. */
414 		.callback = set_pci_reboot,
415 		.ident = "Dell PowerEdge C6100",
416 		.matches = {
417 			DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
418 			DMI_MATCH(DMI_PRODUCT_NAME, "C6100"),
419 		},
420 	},
421 	{	/* Handle problems with rebooting on the Precision M6600. */
422 		.callback = set_pci_reboot,
423 		.ident = "Dell Precision M6600",
424 		.matches = {
425 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
426 			DMI_MATCH(DMI_PRODUCT_NAME, "Precision M6600"),
427 		},
428 	},
429 	{	/* Handle problems with rebooting on Dell T5400's */
430 		.callback = set_bios_reboot,
431 		.ident = "Dell Precision T5400",
432 		.matches = {
433 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
434 			DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"),
435 		},
436 	},
437 	{	/* Handle problems with rebooting on Dell T7400's */
438 		.callback = set_bios_reboot,
439 		.ident = "Dell Precision T7400",
440 		.matches = {
441 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
442 			DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T7400"),
443 		},
444 	},
445 	{	/* Handle problems with rebooting on Dell XPS710 */
446 		.callback = set_bios_reboot,
447 		.ident = "Dell XPS710",
448 		.matches = {
449 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
450 			DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"),
451 		},
452 	},
453 	{	/* Handle problems with rebooting on Dell Optiplex 7450 AIO */
454 		.callback = set_acpi_reboot,
455 		.ident = "Dell OptiPlex 7450 AIO",
456 		.matches = {
457 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
458 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 7450 AIO"),
459 		},
460 	},
461 
462 	/* Hewlett-Packard */
463 	{	/* Handle problems with rebooting on HP laptops */
464 		.callback = set_bios_reboot,
465 		.ident = "HP Compaq Laptop",
466 		.matches = {
467 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
468 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
469 		},
470 	},
471 
472 	{	/* PCIe Wifi card isn't detected after reboot otherwise */
473 		.callback = set_pci_reboot,
474 		.ident = "Zotac ZBOX CI327 nano",
475 		.matches = {
476 			DMI_MATCH(DMI_SYS_VENDOR, "NA"),
477 			DMI_MATCH(DMI_PRODUCT_NAME, "ZBOX-CI327NANO-GS-01"),
478 		},
479 	},
480 
481 	/* Sony */
482 	{	/* Handle problems with rebooting on Sony VGN-Z540N */
483 		.callback = set_bios_reboot,
484 		.ident = "Sony VGN-Z540N",
485 		.matches = {
486 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
487 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"),
488 		},
489 	},
490 
491 	{ }
492 };
493 
494 static int __init reboot_init(void)
495 {
496 	int rv;
497 
498 	/*
499 	 * Only do the DMI check if reboot_type hasn't been overridden
500 	 * on the command line
501 	 */
502 	if (!reboot_default)
503 		return 0;
504 
505 	/*
506 	 * The DMI quirks table takes precedence. If no quirks entry
507 	 * matches and the ACPI Hardware Reduced bit is set and EFI
508 	 * runtime services are enabled, force EFI reboot.
509 	 */
510 	rv = dmi_check_system(reboot_dmi_table);
511 
512 	if (!rv && efi_reboot_required() && !efi_runtime_disabled())
513 		reboot_type = BOOT_EFI;
514 
515 	return 0;
516 }
517 core_initcall(reboot_init);
518 
519 static inline void kb_wait(void)
520 {
521 	int i;
522 
523 	for (i = 0; i < 0x10000; i++) {
524 		if ((inb(0x64) & 0x02) == 0)
525 			break;
526 		udelay(2);
527 	}
528 }
529 
530 static inline void nmi_shootdown_cpus_on_restart(void);
531 
532 #if IS_ENABLED(CONFIG_KVM_INTEL) || IS_ENABLED(CONFIG_KVM_AMD)
533 /* RCU-protected callback to disable virtualization prior to reboot. */
534 static cpu_emergency_virt_cb __rcu *cpu_emergency_virt_callback;
535 
536 void cpu_emergency_register_virt_callback(cpu_emergency_virt_cb *callback)
537 {
538 	if (WARN_ON_ONCE(rcu_access_pointer(cpu_emergency_virt_callback)))
539 		return;
540 
541 	rcu_assign_pointer(cpu_emergency_virt_callback, callback);
542 }
543 EXPORT_SYMBOL_GPL(cpu_emergency_register_virt_callback);
544 
545 void cpu_emergency_unregister_virt_callback(cpu_emergency_virt_cb *callback)
546 {
547 	if (WARN_ON_ONCE(rcu_access_pointer(cpu_emergency_virt_callback) != callback))
548 		return;
549 
550 	rcu_assign_pointer(cpu_emergency_virt_callback, NULL);
551 	synchronize_rcu();
552 }
553 EXPORT_SYMBOL_GPL(cpu_emergency_unregister_virt_callback);
554 
555 /*
556  * Disable virtualization, i.e. VMX or SVM, to ensure INIT is recognized during
557  * reboot.  VMX blocks INIT if the CPU is post-VMXON, and SVM blocks INIT if
558  * GIF=0, i.e. if the crash occurred between CLGI and STGI.
559  */
560 void cpu_emergency_disable_virtualization(void)
561 {
562 	cpu_emergency_virt_cb *callback;
563 
564 	/*
565 	 * IRQs must be disabled as KVM enables virtualization in hardware via
566 	 * function call IPIs, i.e. IRQs need to be disabled to guarantee
567 	 * virtualization stays disabled.
568 	 */
569 	lockdep_assert_irqs_disabled();
570 
571 	rcu_read_lock();
572 	callback = rcu_dereference(cpu_emergency_virt_callback);
573 	if (callback)
574 		callback();
575 	rcu_read_unlock();
576 }
577 
578 static void emergency_reboot_disable_virtualization(void)
579 {
580 	local_irq_disable();
581 
582 	/*
583 	 * Disable virtualization on all CPUs before rebooting to avoid hanging
584 	 * the system, as VMX and SVM block INIT when running in the host.
585 	 *
586 	 * We can't take any locks and we may be on an inconsistent state, so
587 	 * use NMIs as IPIs to tell the other CPUs to disable VMX/SVM and halt.
588 	 *
589 	 * Do the NMI shootdown even if virtualization is off on _this_ CPU, as
590 	 * other CPUs may have virtualization enabled.
591 	 */
592 	if (rcu_access_pointer(cpu_emergency_virt_callback)) {
593 		/* Safely force _this_ CPU out of VMX/SVM operation. */
594 		cpu_emergency_disable_virtualization();
595 
596 		/* Disable VMX/SVM and halt on other CPUs. */
597 		nmi_shootdown_cpus_on_restart();
598 	}
599 }
600 #else
601 static void emergency_reboot_disable_virtualization(void) { }
602 #endif /* CONFIG_KVM_INTEL || CONFIG_KVM_AMD */
603 
604 void __attribute__((weak)) mach_reboot_fixups(void)
605 {
606 }
607 
608 /*
609  * To the best of our knowledge Windows compatible x86 hardware expects
610  * the following on reboot:
611  *
612  * 1) If the FADT has the ACPI reboot register flag set, try it
613  * 2) If still alive, write to the keyboard controller
614  * 3) If still alive, write to the ACPI reboot register again
615  * 4) If still alive, write to the keyboard controller again
616  * 5) If still alive, call the EFI runtime service to reboot
617  * 6) If no EFI runtime service, call the BIOS to do a reboot
618  *
619  * We default to following the same pattern. We also have
620  * two other reboot methods: 'triple fault' and 'PCI', which
621  * can be triggered via the reboot= kernel boot option or
622  * via quirks.
623  *
624  * This means that this function can never return, it can misbehave
625  * by not rebooting properly and hanging.
626  */
627 static void native_machine_emergency_restart(void)
628 {
629 	int i;
630 	int attempt = 0;
631 	int orig_reboot_type = reboot_type;
632 	unsigned short mode;
633 
634 	if (reboot_emergency)
635 		emergency_reboot_disable_virtualization();
636 
637 	tboot_shutdown(TB_SHUTDOWN_REBOOT);
638 
639 	/* Tell the BIOS if we want cold or warm reboot */
640 	mode = reboot_mode == REBOOT_WARM ? 0x1234 : 0;
641 	*((unsigned short *)__va(0x472)) = mode;
642 
643 	/*
644 	 * If an EFI capsule has been registered with the firmware then
645 	 * override the reboot= parameter.
646 	 */
647 	if (efi_capsule_pending(NULL)) {
648 		pr_info("EFI capsule is pending, forcing EFI reboot.\n");
649 		reboot_type = BOOT_EFI;
650 	}
651 
652 	for (;;) {
653 		/* Could also try the reset bit in the Hammer NB */
654 		switch (reboot_type) {
655 		case BOOT_ACPI:
656 			acpi_reboot();
657 			reboot_type = BOOT_KBD;
658 			break;
659 
660 		case BOOT_KBD:
661 			mach_reboot_fixups(); /* For board specific fixups */
662 
663 			for (i = 0; i < 10; i++) {
664 				kb_wait();
665 				udelay(50);
666 				outb(0xfe, 0x64); /* Pulse reset low */
667 				udelay(50);
668 			}
669 			if (attempt == 0 && orig_reboot_type == BOOT_ACPI) {
670 				attempt = 1;
671 				reboot_type = BOOT_ACPI;
672 			} else {
673 				reboot_type = BOOT_EFI;
674 			}
675 			break;
676 
677 		case BOOT_EFI:
678 			efi_reboot(reboot_mode, NULL);
679 			reboot_type = BOOT_BIOS;
680 			break;
681 
682 		case BOOT_BIOS:
683 			machine_real_restart(MRR_BIOS);
684 
685 			/* We're probably dead after this, but... */
686 			reboot_type = BOOT_CF9_SAFE;
687 			break;
688 
689 		case BOOT_CF9_FORCE:
690 			port_cf9_safe = true;
691 			fallthrough;
692 
693 		case BOOT_CF9_SAFE:
694 			if (port_cf9_safe) {
695 				u8 reboot_code = reboot_mode == REBOOT_WARM ?  0x06 : 0x0E;
696 				u8 cf9 = inb(0xcf9) & ~reboot_code;
697 				outb(cf9|2, 0xcf9); /* Request hard reset */
698 				udelay(50);
699 				/* Actually do the reset */
700 				outb(cf9|reboot_code, 0xcf9);
701 				udelay(50);
702 			}
703 			reboot_type = BOOT_TRIPLE;
704 			break;
705 
706 		case BOOT_TRIPLE:
707 			idt_invalidate();
708 			__asm__ __volatile__("int3");
709 
710 			/* We're probably dead after this, but... */
711 			reboot_type = BOOT_KBD;
712 			break;
713 		}
714 	}
715 }
716 
717 void native_machine_shutdown(void)
718 {
719 	/* Stop the cpus and apics */
720 #ifdef CONFIG_X86_IO_APIC
721 	/*
722 	 * Disabling IO APIC before local APIC is a workaround for
723 	 * erratum AVR31 in "Intel Atom Processor C2000 Product Family
724 	 * Specification Update". In this situation, interrupts that target
725 	 * a Logical Processor whose Local APIC is either in the process of
726 	 * being hardware disabled or software disabled are neither delivered
727 	 * nor discarded. When this erratum occurs, the processor may hang.
728 	 *
729 	 * Even without the erratum, it still makes sense to quiet IO APIC
730 	 * before disabling Local APIC.
731 	 */
732 	clear_IO_APIC();
733 #endif
734 
735 #ifdef CONFIG_SMP
736 	/*
737 	 * Stop all of the others. Also disable the local irq to
738 	 * not receive the per-cpu timer interrupt which may trigger
739 	 * scheduler's load balance.
740 	 */
741 	local_irq_disable();
742 	stop_other_cpus();
743 #endif
744 
745 	lapic_shutdown();
746 	restore_boot_irq_mode();
747 
748 #ifdef CONFIG_HPET_TIMER
749 	hpet_disable();
750 #endif
751 
752 #ifdef CONFIG_X86_64
753 	x86_platform.iommu_shutdown();
754 #endif
755 }
756 
757 static void __machine_emergency_restart(int emergency)
758 {
759 	reboot_emergency = emergency;
760 	machine_ops.emergency_restart();
761 }
762 
763 static void native_machine_restart(char *__unused)
764 {
765 	pr_notice("machine restart\n");
766 
767 	if (!reboot_force)
768 		machine_shutdown();
769 	__machine_emergency_restart(0);
770 }
771 
772 static void native_machine_halt(void)
773 {
774 	/* Stop other cpus and apics */
775 	machine_shutdown();
776 
777 	tboot_shutdown(TB_SHUTDOWN_HALT);
778 
779 	stop_this_cpu(NULL);
780 }
781 
782 static void native_machine_power_off(void)
783 {
784 	if (kernel_can_power_off()) {
785 		if (!reboot_force)
786 			machine_shutdown();
787 		do_kernel_power_off();
788 	}
789 	/* A fallback in case there is no PM info available */
790 	tboot_shutdown(TB_SHUTDOWN_HALT);
791 }
792 
793 struct machine_ops machine_ops __ro_after_init = {
794 	.power_off = native_machine_power_off,
795 	.shutdown = native_machine_shutdown,
796 	.emergency_restart = native_machine_emergency_restart,
797 	.restart = native_machine_restart,
798 	.halt = native_machine_halt,
799 #ifdef CONFIG_KEXEC_CORE
800 	.crash_shutdown = native_machine_crash_shutdown,
801 #endif
802 };
803 
804 void machine_power_off(void)
805 {
806 	machine_ops.power_off();
807 }
808 
809 void machine_shutdown(void)
810 {
811 	machine_ops.shutdown();
812 }
813 
814 void machine_emergency_restart(void)
815 {
816 	__machine_emergency_restart(1);
817 }
818 
819 void machine_restart(char *cmd)
820 {
821 	machine_ops.restart(cmd);
822 }
823 
824 void machine_halt(void)
825 {
826 	machine_ops.halt();
827 }
828 
829 #ifdef CONFIG_KEXEC_CORE
830 void machine_crash_shutdown(struct pt_regs *regs)
831 {
832 	machine_ops.crash_shutdown(regs);
833 }
834 #endif
835 
836 /* This is the CPU performing the emergency shutdown work. */
837 int crashing_cpu = -1;
838 
839 #if defined(CONFIG_SMP)
840 
841 static nmi_shootdown_cb shootdown_callback;
842 
843 static atomic_t waiting_for_crash_ipi;
844 static int crash_ipi_issued;
845 
846 static int crash_nmi_callback(unsigned int val, struct pt_regs *regs)
847 {
848 	int cpu;
849 
850 	cpu = raw_smp_processor_id();
851 
852 	/*
853 	 * Don't do anything if this handler is invoked on crashing cpu.
854 	 * Otherwise, system will completely hang. Crashing cpu can get
855 	 * an NMI if system was initially booted with nmi_watchdog parameter.
856 	 */
857 	if (cpu == crashing_cpu)
858 		return NMI_HANDLED;
859 	local_irq_disable();
860 
861 	if (shootdown_callback)
862 		shootdown_callback(cpu, regs);
863 
864 	/*
865 	 * Prepare the CPU for reboot _after_ invoking the callback so that the
866 	 * callback can safely use virtualization instructions, e.g. VMCLEAR.
867 	 */
868 	cpu_emergency_disable_virtualization();
869 
870 	atomic_dec(&waiting_for_crash_ipi);
871 	/* Assume hlt works */
872 	halt();
873 	for (;;)
874 		cpu_relax();
875 
876 	return NMI_HANDLED;
877 }
878 
879 /**
880  * nmi_shootdown_cpus - Stop other CPUs via NMI
881  * @callback:	Optional callback to be invoked from the NMI handler
882  *
883  * The NMI handler on the remote CPUs invokes @callback, if not
884  * NULL, first and then disables virtualization to ensure that
885  * INIT is recognized during reboot.
886  *
887  * nmi_shootdown_cpus() can only be invoked once. After the first
888  * invocation all other CPUs are stuck in crash_nmi_callback() and
889  * cannot respond to a second NMI.
890  */
891 void nmi_shootdown_cpus(nmi_shootdown_cb callback)
892 {
893 	unsigned long msecs;
894 
895 	local_irq_disable();
896 
897 	/*
898 	 * Avoid certain doom if a shootdown already occurred; re-registering
899 	 * the NMI handler will cause list corruption, modifying the callback
900 	 * will do who knows what, etc...
901 	 */
902 	if (WARN_ON_ONCE(crash_ipi_issued))
903 		return;
904 
905 	/* Make a note of crashing cpu. Will be used in NMI callback. */
906 	crashing_cpu = safe_smp_processor_id();
907 
908 	shootdown_callback = callback;
909 
910 	atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
911 	/* Would it be better to replace the trap vector here? */
912 	if (register_nmi_handler(NMI_LOCAL, crash_nmi_callback,
913 				 NMI_FLAG_FIRST, "crash"))
914 		return;		/* Return what? */
915 	/*
916 	 * Ensure the new callback function is set before sending
917 	 * out the NMI
918 	 */
919 	wmb();
920 
921 	apic_send_IPI_allbutself(NMI_VECTOR);
922 
923 	/* Kick CPUs looping in NMI context. */
924 	WRITE_ONCE(crash_ipi_issued, 1);
925 
926 	msecs = 1000; /* Wait at most a second for the other cpus to stop */
927 	while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
928 		mdelay(1);
929 		msecs--;
930 	}
931 
932 	/*
933 	 * Leave the nmi callback set, shootdown is a one-time thing.  Clearing
934 	 * the callback could result in a NULL pointer dereference if a CPU
935 	 * (finally) responds after the timeout expires.
936 	 */
937 }
938 
939 static inline void nmi_shootdown_cpus_on_restart(void)
940 {
941 	if (!crash_ipi_issued)
942 		nmi_shootdown_cpus(NULL);
943 }
944 
945 /*
946  * Check if the crash dumping IPI got issued and if so, call its callback
947  * directly. This function is used when we have already been in NMI handler.
948  * It doesn't return.
949  */
950 void run_crash_ipi_callback(struct pt_regs *regs)
951 {
952 	if (crash_ipi_issued)
953 		crash_nmi_callback(0, regs);
954 }
955 
956 /* Override the weak function in kernel/panic.c */
957 void __noreturn nmi_panic_self_stop(struct pt_regs *regs)
958 {
959 	while (1) {
960 		/* If no CPU is preparing crash dump, we simply loop here. */
961 		run_crash_ipi_callback(regs);
962 		cpu_relax();
963 	}
964 }
965 
966 #else /* !CONFIG_SMP */
967 void nmi_shootdown_cpus(nmi_shootdown_cb callback)
968 {
969 	/* No other CPUs to shoot down */
970 }
971 
972 static inline void nmi_shootdown_cpus_on_restart(void) { }
973 
974 void run_crash_ipi_callback(struct pt_regs *regs)
975 {
976 }
977 #endif
978