1#include <linux/types.h> 2#include <linux/tick.h> 3 4#include <xen/interface/xen.h> 5#include <xen/grant_table.h> 6#include <xen/events.h> 7 8#include <asm/xen/hypercall.h> 9#include <asm/xen/page.h> 10#include <asm/fixmap.h> 11 12#include "xen-ops.h" 13#include "mmu.h" 14 15static void xen_pv_pre_suspend(void) 16{ 17 xen_mm_pin_all(); 18 19 xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn); 20 xen_start_info->console.domU.mfn = 21 mfn_to_pfn(xen_start_info->console.domU.mfn); 22 23 BUG_ON(!irqs_disabled()); 24 25 HYPERVISOR_shared_info = &xen_dummy_shared_info; 26 if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_PARAVIRT_BOOTMAP), 27 __pte_ma(0), 0)) 28 BUG(); 29} 30 31static void xen_hvm_post_suspend(int suspend_cancelled) 32{ 33#ifdef CONFIG_XEN_PVHVM 34 int cpu; 35 if (!suspend_cancelled) 36 xen_hvm_init_shared_info(); 37 xen_callback_vector(); 38 xen_unplug_emulated_devices(); 39 if (xen_feature(XENFEAT_hvm_safe_pvclock)) { 40 for_each_online_cpu(cpu) { 41 xen_setup_runstate_info(cpu); 42 } 43 } 44#endif 45} 46 47static void xen_pv_post_suspend(int suspend_cancelled) 48{ 49 xen_build_mfn_list_list(); 50 51 xen_setup_shared_info(); 52 53 if (suspend_cancelled) { 54 xen_start_info->store_mfn = 55 pfn_to_mfn(xen_start_info->store_mfn); 56 xen_start_info->console.domU.mfn = 57 pfn_to_mfn(xen_start_info->console.domU.mfn); 58 } else { 59#ifdef CONFIG_SMP 60 BUG_ON(xen_cpu_initialized_map == NULL); 61 cpumask_copy(xen_cpu_initialized_map, cpu_online_mask); 62#endif 63 xen_vcpu_restore(); 64 } 65 66 xen_mm_unpin_all(); 67} 68 69void xen_arch_pre_suspend(void) 70{ 71 if (xen_pv_domain()) 72 xen_pv_pre_suspend(); 73} 74 75void xen_arch_post_suspend(int cancelled) 76{ 77 if (xen_pv_domain()) 78 xen_pv_post_suspend(cancelled); 79 else 80 xen_hvm_post_suspend(cancelled); 81} 82 83static void xen_vcpu_notify_restore(void *data) 84{ 85 /* Boot processor notified via generic timekeeping_resume() */ 86 if (smp_processor_id() == 0) 87 return; 88 89 tick_resume_local(); 90} 91 92static void xen_vcpu_notify_suspend(void *data) 93{ 94 tick_suspend_local(); 95} 96 97void xen_arch_resume(void) 98{ 99 on_each_cpu(xen_vcpu_notify_restore, NULL, 1); 100} 101 102void xen_arch_suspend(void) 103{ 104 on_each_cpu(xen_vcpu_notify_suspend, NULL, 1); 105} 106