blob: d9f96cc5d74367932020edfe71424d7940fa77a3 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
Jeremy Fitzhardinge0e913982008-05-26 23:31:27 +01002#include <linux/types.h>
Thomas Gleixner4ffee522015-03-25 13:09:16 +01003#include <linux/tick.h>
Jeremy Fitzhardinge0e913982008-05-26 23:31:27 +01004
Andrew Mortonfacca612015-12-29 14:54:13 -08005#include <xen/xen.h>
Jeremy Fitzhardinge0e913982008-05-26 23:31:27 +01006#include <xen/interface/xen.h>
7#include <xen/grant_table.h>
8#include <xen/events.h>
9
10#include <asm/xen/hypercall.h>
11#include <asm/xen/page.h>
Ingo Molnar99d00002009-01-23 11:09:15 +010012#include <asm/fixmap.h>
Jeremy Fitzhardinge0e913982008-05-26 23:31:27 +010013
14#include "xen-ops.h"
15#include "mmu.h"
Boris Ostrovsky65d0cf02015-08-10 16:34:34 -040016#include "pmu.h"
Jeremy Fitzhardinge0e913982008-05-26 23:31:27 +010017
David Vrabelaa8532c2014-05-08 11:09:23 +010018void xen_arch_pre_suspend(void)
19{
Joao Martins2229f702017-11-08 17:19:57 +000020 xen_save_time_memory_area();
21
Boris Ostrovsky65d0cf02015-08-10 16:34:34 -040022 if (xen_pv_domain())
23 xen_pv_pre_suspend();
David Vrabelaa8532c2014-05-08 11:09:23 +010024}
25
26void xen_arch_post_suspend(int cancelled)
27{
Boris Ostrovsky65d0cf02015-08-10 16:34:34 -040028 if (xen_pv_domain())
29 xen_pv_post_suspend(cancelled);
30 else
31 xen_hvm_post_suspend(cancelled);
Joao Martins2229f702017-11-08 17:19:57 +000032
33 xen_restore_time_memory_area();
Jeremy Fitzhardinge0e913982008-05-26 23:31:27 +010034}
35
Ian Campbellf6eafe32009-11-25 14:12:08 +000036static void xen_vcpu_notify_restore(void *data)
37{
Ian Campbellf6eafe32009-11-25 14:12:08 +000038 /* Boot processor notified via generic timekeeping_resume() */
Thomas Gleixner4ffee522015-03-25 13:09:16 +010039 if (smp_processor_id() == 0)
Ian Campbellf6eafe32009-11-25 14:12:08 +000040 return;
41
Thomas Gleixnerf46481d2015-03-25 13:11:04 +010042 tick_resume_local();
Ian Campbellf6eafe32009-11-25 14:12:08 +000043}
44
Boris Ostrovsky2b953a52015-04-28 18:46:20 -040045static void xen_vcpu_notify_suspend(void *data)
46{
47 tick_suspend_local();
48}
49
Isaku Yamahataad55db92008-07-08 15:06:32 -070050void xen_arch_resume(void)
51{
Boris Ostrovskyde0afc92015-12-02 12:10:48 -050052 int cpu;
53
Thomas Gleixner4ffee522015-03-25 13:09:16 +010054 on_each_cpu(xen_vcpu_notify_restore, NULL, 1);
Boris Ostrovskyde0afc92015-12-02 12:10:48 -050055
56 for_each_online_cpu(cpu)
57 xen_pmu_init(cpu);
Isaku Yamahataad55db92008-07-08 15:06:32 -070058}
Boris Ostrovsky2b953a52015-04-28 18:46:20 -040059
60void xen_arch_suspend(void)
61{
Boris Ostrovskyde0afc92015-12-02 12:10:48 -050062 int cpu;
63
64 for_each_online_cpu(cpu)
65 xen_pmu_finish(cpu);
66
Boris Ostrovsky2b953a52015-04-28 18:46:20 -040067 on_each_cpu(xen_vcpu_notify_suspend, NULL, 1);
68}