struct suspend_info {
int cancelled;
unsigned long arg; /* extra hypercall argument */
+ void (*pre)(void);
+ void (*post)(int cancelled);
};
static void xen_hvm_post_suspend(int cancelled)
return err;
}
+ if (si->pre)
+ si->pre();
+
/*
* This hypercall returns 1 if suspend was cancelled
* or the domain was merely checkpointed, and 0 if it
*/
si->cancelled = HYPERVISOR_suspend(si->arg);
- xen_hvm_post_suspend(si->cancelled);
+ if (si->post)
+ si->post(si->cancelled);
if (!si->cancelled) {
xen_irq_resume();
return err;
}
- xen_pre_suspend();
+ if (si->pre)
+ si->pre();
/*
* This hypercall returns 1 if suspend was cancelled
*/
si->cancelled = HYPERVISOR_suspend(si->arg);
- xen_post_suspend(si->cancelled);
+ if (si->post)
+ si->post(si->cancelled);
if (!si->cancelled) {
xen_irq_resume();
si.cancelled = 1;
- if (xen_hvm_domain())
+ if (xen_hvm_domain()) {
si.arg = 0UL;
- else
+ si.pre = NULL;
+ si.post = &xen_hvm_post_suspend;
+ } else {
si.arg = virt_to_mfn(xen_start_info);
+ si.pre = &xen_pre_suspend;
+ si.post = &xen_post_suspend;
+ }
if (xen_hvm_domain())
err = stop_machine(xen_hvm_suspend, &si, cpumask_of(0));