xref: /openbmc/linux/arch/x86/xen/suspend_pv.c (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
29963236dSVitaly Kuznetsov #include <linux/types.h>
39963236dSVitaly Kuznetsov 
49963236dSVitaly Kuznetsov #include <asm/xen/hypercall.h>
59963236dSVitaly Kuznetsov #include <asm/xen/page.h>
69963236dSVitaly Kuznetsov 
7*0cd39f46SPeter Zijlstra #include <asm/fixmap.h>
8*0cd39f46SPeter Zijlstra 
99963236dSVitaly Kuznetsov #include "xen-ops.h"
109963236dSVitaly Kuznetsov 
xen_pv_pre_suspend(void)119963236dSVitaly Kuznetsov void xen_pv_pre_suspend(void)
129963236dSVitaly Kuznetsov {
139963236dSVitaly Kuznetsov 	xen_mm_pin_all();
149963236dSVitaly Kuznetsov 
159963236dSVitaly Kuznetsov 	xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
169963236dSVitaly Kuznetsov 	xen_start_info->console.domU.mfn =
179963236dSVitaly Kuznetsov 		mfn_to_pfn(xen_start_info->console.domU.mfn);
189963236dSVitaly Kuznetsov 
199963236dSVitaly Kuznetsov 	BUG_ON(!irqs_disabled());
209963236dSVitaly Kuznetsov 
219963236dSVitaly Kuznetsov 	HYPERVISOR_shared_info = &xen_dummy_shared_info;
229963236dSVitaly Kuznetsov 	if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_PARAVIRT_BOOTMAP),
239963236dSVitaly Kuznetsov 					 __pte_ma(0), 0))
249963236dSVitaly Kuznetsov 		BUG();
259963236dSVitaly Kuznetsov }
269963236dSVitaly Kuznetsov 
xen_pv_post_suspend(int suspend_cancelled)279963236dSVitaly Kuznetsov void xen_pv_post_suspend(int suspend_cancelled)
289963236dSVitaly Kuznetsov {
299963236dSVitaly Kuznetsov 	xen_build_mfn_list_list();
307b25b9cbSPavel Tatashin 	set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_start_info->shared_info);
317b25b9cbSPavel Tatashin 	HYPERVISOR_shared_info = (void *)fix_to_virt(FIX_PARAVIRT_BOOTMAP);
327b25b9cbSPavel Tatashin 	xen_setup_mfn_list_list();
339963236dSVitaly Kuznetsov 
349963236dSVitaly Kuznetsov 	if (suspend_cancelled) {
359963236dSVitaly Kuznetsov 		xen_start_info->store_mfn =
369963236dSVitaly Kuznetsov 			pfn_to_mfn(xen_start_info->store_mfn);
379963236dSVitaly Kuznetsov 		xen_start_info->console.domU.mfn =
389963236dSVitaly Kuznetsov 			pfn_to_mfn(xen_start_info->console.domU.mfn);
399963236dSVitaly Kuznetsov 	} else {
409963236dSVitaly Kuznetsov #ifdef CONFIG_SMP
419963236dSVitaly Kuznetsov 		BUG_ON(xen_cpu_initialized_map == NULL);
429963236dSVitaly Kuznetsov 		cpumask_copy(xen_cpu_initialized_map, cpu_online_mask);
439963236dSVitaly Kuznetsov #endif
449963236dSVitaly Kuznetsov 		xen_vcpu_restore();
459963236dSVitaly Kuznetsov 	}
469963236dSVitaly Kuznetsov 
479963236dSVitaly Kuznetsov 	xen_mm_unpin_all();
489963236dSVitaly Kuznetsov }
49