ad55db9fed
add xen_timer_resume() hook. Timer resume should be done after event channel is resumed. add xen_arch_resume() hook when ipi becomes usable after resume. After resume, some cpu specific resource must be reinitialized on ia64 that can't be set by another cpu. However available hooks is run once on only one cpu so that ipi has to be used. During stop_machine_run() ipi can't be used because interrupt is masked. So add another hook after stop_machine_run(). Another approach might be use resume hook which is run by device_resume(). However device_resume() may be executed on suspend error recovery path. So it is necessary to determine whether it is executed on real resume path or error recovery path. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Cc: Stephen Tweedie <sct@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
48 lines
984 B
C
48 lines
984 B
C
#include <linux/types.h>
|
|
|
|
#include <xen/interface/xen.h>
|
|
#include <xen/grant_table.h>
|
|
#include <xen/events.h>
|
|
|
|
#include <asm/xen/hypercall.h>
|
|
#include <asm/xen/page.h>
|
|
|
|
#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)
|
|
{
|
|
xen_setup_shared_info();
|
|
|
|
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
|
|
xen_cpu_initialized_map = cpu_online_map;
|
|
#endif
|
|
xen_vcpu_restore();
|
|
}
|
|
|
|
}
|
|
|
|
void xen_arch_resume(void)
|
|
{
|
|
/* nothing */
|
|
}
|