162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/types.h>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <asm/xen/hypercall.h>
562306a36Sopenharmony_ci#include <asm/xen/page.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <asm/fixmap.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "xen-ops.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_civoid xen_pv_pre_suspend(void)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	xen_mm_pin_all();
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
1662306a36Sopenharmony_ci	xen_start_info->console.domU.mfn =
1762306a36Sopenharmony_ci		mfn_to_pfn(xen_start_info->console.domU.mfn);
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	BUG_ON(!irqs_disabled());
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	HYPERVISOR_shared_info = &xen_dummy_shared_info;
2262306a36Sopenharmony_ci	if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_PARAVIRT_BOOTMAP),
2362306a36Sopenharmony_ci					 __pte_ma(0), 0))
2462306a36Sopenharmony_ci		BUG();
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_civoid xen_pv_post_suspend(int suspend_cancelled)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	xen_build_mfn_list_list();
3062306a36Sopenharmony_ci	set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_start_info->shared_info);
3162306a36Sopenharmony_ci	HYPERVISOR_shared_info = (void *)fix_to_virt(FIX_PARAVIRT_BOOTMAP);
3262306a36Sopenharmony_ci	xen_setup_mfn_list_list();
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if (suspend_cancelled) {
3562306a36Sopenharmony_ci		xen_start_info->store_mfn =
3662306a36Sopenharmony_ci			pfn_to_mfn(xen_start_info->store_mfn);
3762306a36Sopenharmony_ci		xen_start_info->console.domU.mfn =
3862306a36Sopenharmony_ci			pfn_to_mfn(xen_start_info->console.domU.mfn);
3962306a36Sopenharmony_ci	} else {
4062306a36Sopenharmony_ci#ifdef CONFIG_SMP
4162306a36Sopenharmony_ci		BUG_ON(xen_cpu_initialized_map == NULL);
4262306a36Sopenharmony_ci		cpumask_copy(xen_cpu_initialized_map, cpu_online_mask);
4362306a36Sopenharmony_ci#endif
4462306a36Sopenharmony_ci		xen_vcpu_restore();
4562306a36Sopenharmony_ci	}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	xen_mm_unpin_all();
4862306a36Sopenharmony_ci}
49