2008-05-27 02:31:27 +04:00
# include <linux/types.h>
2009-11-25 17:12:08 +03:00
# include <linux/clockchips.h>
2008-05-27 02:31:27 +04: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 13:09:15 +03:00
# include <asm/fixmap.h>
2008-05-27 02:31:27 +04:00
# include "xen-ops.h"
# include "mmu.h"
2011-02-17 14:04:20 +03:00
void xen_arch_pre_suspend ( void )
2008-05-27 02:31:27 +04: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 ( ) ;
}
2011-02-17 14:04:20 +03:00
void xen_arch_hvm_post_suspend ( int suspend_cancelled )
2010-05-14 15:45:07 +04:00
{
2011-02-11 20:55:13 +03:00
# ifdef CONFIG_XEN_PVHVM
2010-05-14 15:48:19 +04:00
int cpu ;
2010-05-14 15:45:07 +04:00
xen_hvm_init_shared_info ( ) ;
xen_callback_vector ( ) ;
2010-12-01 17:51:44 +03:00
xen_unplug_emulated_devices ( ) ;
2010-05-14 15:48:19 +04:00
if ( xen_feature ( XENFEAT_hvm_safe_pvclock ) ) {
for_each_online_cpu ( cpu ) {
xen_setup_runstate_info ( cpu ) ;
}
}
2011-02-11 20:55:13 +03:00
# endif
2010-05-14 15:45:07 +04:00
}
2011-02-17 14:04:20 +03:00
void xen_arch_post_suspend ( int suspend_cancelled )
2008-05-27 02:31:27 +04:00
{
2009-11-21 14:32:49 +03:00
xen_build_mfn_list_list ( ) ;
2008-05-31 04:33:02 +04:00
xen_setup_shared_info ( ) ;
2008-05-27 02:31:27 +04: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-17 04:33:57 +03:00
BUG_ON ( xen_cpu_initialized_map = = NULL ) ;
cpumask_copy ( xen_cpu_initialized_map , cpu_online_mask ) ;
2008-05-27 02:31:27 +04:00
# endif
2008-05-31 04:33:02 +04:00
xen_vcpu_restore ( ) ;
2008-05-27 02:31:27 +04:00
}
}
2009-11-25 17:12:08 +03: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-09 02:06:32 +04:00
void xen_arch_resume ( void )
{
2010-05-19 19:19:25 +04:00
on_each_cpu ( xen_vcpu_notify_restore ,
( void * ) CLOCK_EVT_NOTIFY_RESUME , 1 ) ;
2008-07-09 02:06:32 +04:00
}