2008-05-26 23:31:27 +01:00
# include <linux/types.h>
2009-11-25 14:12:08 +00:00
# include <linux/clockchips.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"
void xen_pre_suspend ( void )
{
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 ( ) ;
}
void xen_post_suspend ( int suspend_cancelled )
{
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
}
}
2009-11-25 14:12:08 +00:00
static void xen_vcpu_notify_restore ( void * data )
{
unsigned long reason = ( unsigned long ) data ;
/* Boot processor notified via generic timekeeping_resume() */
if ( smp_processor_id ( ) = = 0 )
return ;
clockevents_notify ( reason , NULL ) ;
}
2008-07-08 15:06:32 -07:00
void xen_arch_resume ( void )
{
2010-05-19 16:19:25 +01:00
on_each_cpu ( xen_vcpu_notify_restore ,
( void * ) CLOCK_EVT_NOTIFY_RESUME , 1 ) ;
2008-07-08 15:06:32 -07:00
}