This source file includes following definitions.
- cpu_suspend_set_dbg_restorer
- __cpu_suspend_exit
- cpu_suspend
- cpu_suspend_init
1
2 #include <linux/ftrace.h>
3 #include <linux/percpu.h>
4 #include <linux/slab.h>
5 #include <linux/uaccess.h>
6 #include <asm/alternative.h>
7 #include <asm/cacheflush.h>
8 #include <asm/cpufeature.h>
9 #include <asm/daifflags.h>
10 #include <asm/debug-monitors.h>
11 #include <asm/exec.h>
12 #include <asm/pgtable.h>
13 #include <asm/memory.h>
14 #include <asm/mmu_context.h>
15 #include <asm/smp_plat.h>
16 #include <asm/suspend.h>
17
18
19
20
21
22 unsigned long *sleep_save_stash;
23
24
25
26
27
28
29
30
31 static int (*hw_breakpoint_restore)(unsigned int);
32 void __init cpu_suspend_set_dbg_restorer(int (*hw_bp_restore)(unsigned int))
33 {
34
35 if (WARN_ON(hw_breakpoint_restore))
36 return;
37 hw_breakpoint_restore = hw_bp_restore;
38 }
39
40 void notrace __cpu_suspend_exit(void)
41 {
42 unsigned int cpu = smp_processor_id();
43
44
45
46
47
48
49 cpu_uninstall_idmap();
50
51
52 if (system_supports_cnp())
53 cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
54
55
56
57
58
59 __uaccess_enable_hw_pan();
60 uao_thread_switch(current);
61
62
63
64
65
66
67 if (hw_breakpoint_restore)
68 hw_breakpoint_restore(cpu);
69
70
71
72
73
74
75 if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE)
76 arm64_set_ssbd_mitigation(false);
77 }
78
79
80
81
82
83
84
85
86 int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
87 {
88 int ret = 0;
89 unsigned long flags;
90 struct sleep_stack_data state;
91
92
93
94
95
96
97 flags = local_daif_save();
98
99
100
101
102
103
104 pause_graph_tracing();
105
106 if (__cpu_suspend_enter(&state)) {
107
108 ret = fn(arg);
109
110
111
112
113
114
115
116
117 if (!ret)
118 ret = -EOPNOTSUPP;
119 } else {
120 __cpu_suspend_exit();
121 }
122
123 unpause_graph_tracing();
124
125
126
127
128
129
130 local_daif_restore(flags);
131
132 return ret;
133 }
134
135 static int __init cpu_suspend_init(void)
136 {
137
138 sleep_save_stash = kcalloc(mpidr_hash_size(), sizeof(*sleep_save_stash),
139 GFP_KERNEL);
140
141 if (WARN_ON(!sleep_save_stash))
142 return -ENOMEM;
143
144 return 0;
145 }
146 early_initcall(cpu_suspend_init);