kexec.c (1670B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright 2006 Michael Ellerman, IBM Corporation 4 */ 5 6#include <linux/kernel.h> 7#include <linux/interrupt.h> 8 9#include <asm/machdep.h> 10#include <asm/page.h> 11#include <asm/firmware.h> 12#include <asm/kexec.h> 13#include <asm/xics.h> 14#include <asm/xive.h> 15#include <asm/smp.h> 16#include <asm/plpar_wrappers.h> 17 18#include "pseries.h" 19 20void pseries_kexec_cpu_down(int crash_shutdown, int secondary) 21{ 22 /* 23 * Don't risk a hypervisor call if we're crashing 24 * XXX: Why? The hypervisor is not crashing. It might be better 25 * to at least attempt unregister to avoid the hypervisor stepping 26 * on our memory. 27 */ 28 if (firmware_has_feature(FW_FEATURE_SPLPAR) && !crash_shutdown) { 29 int ret; 30 int cpu = smp_processor_id(); 31 int hwcpu = hard_smp_processor_id(); 32 33 if (get_lppaca()->dtl_enable_mask) { 34 ret = unregister_dtl(hwcpu); 35 if (ret) { 36 pr_err("WARNING: DTL deregistration for cpu " 37 "%d (hw %d) failed with %d\n", 38 cpu, hwcpu, ret); 39 } 40 } 41 42 ret = unregister_slb_shadow(hwcpu); 43 if (ret) { 44 pr_err("WARNING: SLB shadow buffer deregistration " 45 "for cpu %d (hw %d) failed with %d\n", 46 cpu, hwcpu, ret); 47 } 48 49 ret = unregister_vpa(hwcpu); 50 if (ret) { 51 pr_err("WARNING: VPA deregistration for cpu %d " 52 "(hw %d) failed with %d\n", cpu, hwcpu, ret); 53 } 54 } 55 56 if (xive_enabled()) { 57 xive_teardown_cpu(); 58 59 if (!secondary) 60 xive_shutdown(); 61 } else 62 xics_kexec_teardown_cpu(secondary); 63} 64 65void pseries_machine_kexec(struct kimage *image) 66{ 67 if (firmware_has_feature(FW_FEATURE_SET_MODE)) 68 pseries_disable_reloc_on_exc(); 69 70 default_machine_kexec(image); 71}