2008-05-26 23:31:27 +01:00
# include <linux/types.h>
2015-03-25 13:09:16 +01:00
# include <linux/tick.h>
2008-05-26 23:31:27 +01:00
# include <xen/interface/xen.h>
# include <xen/grant_table.h>
# include <xen/events.h>
# include <asm/xen/hypercall.h>
# include <asm/xen/page.h>
2009-01-23 11:09:15 +01:00
# include <asm/fixmap.h>
2008-05-26 23:31:27 +01:00
# include "xen-ops.h"
# include "mmu.h"
2014-05-08 11:09:23 +01:00
static void xen_pv_pre_suspend ( void )
2008-05-26 23:31:27 +01:00
{
2014-05-08 11:09:23 +01:00
xen_mm_pin_all ( ) ;
2008-05-26 23:31:27 +01:00
xen_start_info - > store_mfn = mfn_to_pfn ( xen_start_info - > store_mfn ) ;
xen_start_info - > console . domU . mfn =
mfn_to_pfn ( xen_start_info - > console . domU . mfn ) ;
BUG_ON ( ! irqs_disabled ( ) ) ;
HYPERVISOR_shared_info = & xen_dummy_shared_info ;
if ( HYPERVISOR_update_va_mapping ( fix_to_virt ( FIX_PARAVIRT_BOOTMAP ) ,
__pte_ma ( 0 ) , 0 ) )
BUG ( ) ;
}
2014-05-08 11:09:23 +01:00
static void xen_hvm_post_suspend ( int suspend_cancelled )
2010-05-14 12:45:07 +01:00
{
2011-02-11 17:55:13 +00:00
# ifdef CONFIG_XEN_PVHVM
2010-05-14 12:48:19 +01:00
int cpu ;
2013-02-14 21:29:31 -05:00
xen_hvm_init_shared_info ( ) ;
2010-05-14 12:45:07 +01:00
xen_callback_vector ( ) ;
2010-12-01 14:51:44 +00:00
xen_unplug_emulated_devices ( ) ;
2010-05-14 12:48:19 +01:00
if ( xen_feature ( XENFEAT_hvm_safe_pvclock ) ) {
for_each_online_cpu ( cpu ) {
xen_setup_runstate_info ( cpu ) ;
}
}
2011-02-11 17:55:13 +00:00
# endif
2010-05-14 12:45:07 +01:00
}
2014-05-08 11:09:23 +01:00
static void xen_pv_post_suspend ( int suspend_cancelled )
2008-05-26 23:31:27 +01:00
{
2009-11-21 11:32:49 +00:00
xen_build_mfn_list_list ( ) ;
2008-05-31 01:33:02 +01:00
xen_setup_shared_info ( ) ;
2008-05-26 23:31:27 +01:00
if ( suspend_cancelled ) {
xen_start_info - > store_mfn =
pfn_to_mfn ( xen_start_info - > store_mfn ) ;
xen_start_info - > console . domU . mfn =
pfn_to_mfn ( xen_start_info - > console . domU . mfn ) ;
} else {
# ifdef CONFIG_SMP
2008-12-16 17:33:57 -08:00
BUG_ON ( xen_cpu_initialized_map = = NULL ) ;
cpumask_copy ( xen_cpu_initialized_map , cpu_online_mask ) ;
2008-05-26 23:31:27 +01:00
# endif
2008-05-31 01:33:02 +01:00
xen_vcpu_restore ( ) ;
2008-05-26 23:31:27 +01:00
}
2014-05-08 11:09:23 +01:00
xen_mm_unpin_all ( ) ;
}
void xen_arch_pre_suspend ( void )
{
if ( xen_pv_domain ( ) )
xen_pv_pre_suspend ( ) ;
}
void xen_arch_post_suspend ( int cancelled )
{
if ( xen_pv_domain ( ) )
xen_pv_post_suspend ( cancelled ) ;
else
xen_hvm_post_suspend ( cancelled ) ;
2008-05-26 23:31:27 +01:00
}
2009-11-25 14:12:08 +00:00
static void xen_vcpu_notify_restore ( void * data )
{
/* Boot processor notified via generic timekeeping_resume() */
2015-03-25 13:09:16 +01:00
if ( smp_processor_id ( ) = = 0 )
2009-11-25 14:12:08 +00:00
return ;
2015-03-25 13:09:16 +01:00
tick_resume ( ) ;
2009-11-25 14:12:08 +00:00
}
2008-07-08 15:06:32 -07:00
void xen_arch_resume ( void )
{
2015-03-25 13:09:16 +01:00
on_each_cpu ( xen_vcpu_notify_restore , NULL , 1 ) ;
2008-07-08 15:06:32 -07:00
}