1 #include <linux/types.h> 2 #include <linux/clockchips.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 15 void xen_arch_pre_suspend(void) 16 { 17 xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn); 18 xen_start_info->console.domU.mfn = 19 mfn_to_pfn(xen_start_info->console.domU.mfn); 20 21 BUG_ON(!irqs_disabled()); 22 23 HYPERVISOR_shared_info = &xen_dummy_shared_info; 24 if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_PARAVIRT_BOOTMAP), 25 __pte_ma(0), 0)) 26 BUG(); 27 } 28 29 void xen_arch_hvm_post_suspend(int suspend_cancelled) 30 { 31 #ifdef CONFIG_XEN_PVHVM 32 int cpu; 33 xen_hvm_resume_shared_info(); 34 xen_callback_vector(); 35 xen_unplug_emulated_devices(); 36 if (xen_feature(XENFEAT_hvm_safe_pvclock)) { 37 for_each_online_cpu(cpu) { 38 xen_setup_runstate_info(cpu); 39 } 40 } 41 #endif 42 } 43 44 void xen_arch_post_suspend(int suspend_cancelled) 45 { 46 xen_build_mfn_list_list(); 47 48 xen_setup_shared_info(); 49 50 if (suspend_cancelled) { 51 xen_start_info->store_mfn = 52 pfn_to_mfn(xen_start_info->store_mfn); 53 xen_start_info->console.domU.mfn = 54 pfn_to_mfn(xen_start_info->console.domU.mfn); 55 } else { 56 #ifdef CONFIG_SMP 57 BUG_ON(xen_cpu_initialized_map == NULL); 58 cpumask_copy(xen_cpu_initialized_map, cpu_online_mask); 59 #endif 60 xen_vcpu_restore(); 61 } 62 63 } 64 65 static void xen_vcpu_notify_restore(void *data) 66 { 67 unsigned long reason = (unsigned long)data; 68 69 /* Boot processor notified via generic timekeeping_resume() */ 70 if ( smp_processor_id() == 0) 71 return; 72 73 clockevents_notify(reason, NULL); 74 } 75 76 void xen_arch_resume(void) 77 { 78 on_each_cpu(xen_vcpu_notify_restore, 79 (void *)CLOCK_EVT_NOTIFY_RESUME, 1); 80 } 81