@@ -131,66 +131,66 @@ void enter_s3(struct acrn_vm *vm, uint32_t pm1a_cnt_val, uint32_t pm1b_cnt_val)
131
131
132
132
/* We assume enter s3 success by default */
133
133
host_enter_s3_success = 1U ;
134
- if (vm -> pm .sx_state_data == NULL ) {
135
- pr_err ("No Sx state info avaiable. No Sx support" );
136
- host_enter_s3_success = 0U ;
137
- return ;
138
- }
134
+ if (vm -> pm .sx_state_data != NULL ) {
135
+ pause_vm (vm ); /* pause vm0 before suspend system */
139
136
140
- pause_vm ( vm ); /* pause vm0 before suspend system */
137
+ pcpu_id = get_cpu_id ();
141
138
142
- pcpu_id = get_cpu_id ();
139
+ /* Save the wakeup vec set by guest. Will return to guest
140
+ * with this wakeup vec as entry.
141
+ */
142
+ guest_wakeup_vec32 = * vm -> pm .sx_state_data -> wake_vector_32 ;
143
143
144
- /* Save the wakeup vec set by guest. Will return to guest
145
- * with this wakeup vec as entry.
146
- */
147
- guest_wakeup_vec32 = * vm -> pm .sx_state_data -> wake_vector_32 ;
144
+ /* set ACRN wakeup vec instead */
145
+ * vm -> pm .sx_state_data -> wake_vector_32 =
146
+ (uint32_t ) trampoline_start16_paddr ;
148
147
149
- /* set ACRN wakeup vec instead */
150
- * vm -> pm .sx_state_data -> wake_vector_32 =
151
- (uint32_t ) trampoline_start16_paddr ;
148
+ /* offline all APs */
149
+ stop_cpus ();
152
150
153
- /* offline all APs */
154
- stop_cpus ();
151
+ /* Save default main entry and we will restore it after
152
+ * back from S3. So the AP online could jmp to correct
153
+ * main entry.
154
+ */
155
+ pmain_entry_saved = read_trampoline_sym (main_entry );
155
156
156
- /* Save default main entry and we will restore it after
157
- * back from S3. So the AP online could jmp to correct
158
- * main entry.
159
- */
160
- pmain_entry_saved = read_trampoline_sym (main_entry );
157
+ /* Set the main entry for resume from S3 state */
158
+ write_trampoline_sym (main_entry , (uint64_t )restore_s3_context );
161
159
162
- /* Set the main entry for resume from S3 state */
163
- write_trampoline_sym ( main_entry , ( uint64_t ) restore_s3_context );
160
+ CPU_IRQ_DISABLE ();
161
+ vmx_off ( pcpu_id );
164
162
165
- CPU_IRQ_DISABLE ();
166
- vmx_off (pcpu_id );
163
+ suspend_console ();
164
+ suspend_ioapic ();
165
+ suspend_iommu ();
166
+ suspend_lapic ();
167
167
168
- suspend_console ();
169
- suspend_ioapic ();
170
- suspend_iommu ();
171
- suspend_lapic ();
168
+ asm_enter_s3 (vm , pm1a_cnt_val , pm1b_cnt_val );
172
169
173
- asm_enter_s3 (vm , pm1a_cnt_val , pm1b_cnt_val );
170
+ /* release the lock aquired in trampoline code */
171
+ spinlock_release (& trampoline_spinlock );
174
172
175
- /* release the lock aquired in trampoline code */
176
- spinlock_release (& trampoline_spinlock );
173
+ resume_lapic ();
174
+ resume_iommu ();
175
+ resume_ioapic ();
176
+ resume_console ();
177
177
178
- resume_lapic ();
179
- resume_iommu ();
180
- resume_ioapic ();
181
- resume_console ();
178
+ exec_vmxon_instr (pcpu_id );
179
+ CPU_IRQ_ENABLE ();
182
180
183
- exec_vmxon_instr ( pcpu_id );
184
- CPU_IRQ_ENABLE ( );
181
+ /* restore the default main entry */
182
+ write_trampoline_sym ( main_entry , pmain_entry_saved );
185
183
186
- /* restore the default main entry */
187
- write_trampoline_sym ( main_entry , pmain_entry_saved );
184
+ /* online all APs again */
185
+ start_cpus ( );
188
186
189
- /* online all APs again */
190
- start_cpus ();
187
+ /* jump back to vm */
188
+ resume_vm_from_s3 (vm , guest_wakeup_vec32 );
189
+ } else {
190
+ pr_err ("No Sx state info avaiable. No Sx support" );
191
+ host_enter_s3_success = 0U ;
192
+ }
191
193
192
- /* jump back to vm */
193
- resume_vm_from_s3 (vm , guest_wakeup_vec32 );
194
194
195
195
return ;
196
196
}
0 commit comments