mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
x86: correct ordering of operations during S3 resume
Microcode loading needs to happen before re-enabling interrupts, in case
only updated microcode allows the use of e.g. the SPEC_{CTRL,CMD} MSRs.
Otoh it doesn't need to happen at all when we didn't suspend in the
first place. It needs to happen before spin_debug_enable() though, as it
acquires a lock and hence would otherwise make
common/spinlock.c:check_lock() unhappy. As micrcode loading can be
pretty verbose, also make sure it only runs after console_end_sync().
cpufreq_add_cpu() doesn't need calling on the only "goto enable_cpu"
path, which sits ahead of cpufreq_del_cpu().
Reported-by: Simon Gaiser <simon@invisiblethingslab.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Release-acked-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
1 parent
16fb4b5a9a
commit
cb2a4a449d
1 file changed
+6
-3
@@ -203,6 +203,7 @@ static int enter_state(u32 state)
|
||||
printk(XENLOG_ERR "Some devices failed to power down.");
|
||||
system_state = SYS_STATE_resume;
|
||||
device_power_up(error);
|
||||
console_end_sync();
|
||||
error = -EIO;
|
||||
goto done;
|
||||
}
|
||||
@@ -243,17 +244,19 @@ static int enter_state(u32 state)
|
||||
if ( (state == ACPI_STATE_S3) && error )
|
||||
tboot_s3_error(error);
|
||||
|
||||
console_end_sync();
|
||||
|
||||
microcode_resume_cpu(0);
|
||||
|
||||
done:
|
||||
spin_debug_enable();
|
||||
local_irq_restore(flags);
|
||||
console_end_sync();
|
||||
acpi_sleep_post(state);
|
||||
if ( hvm_cpu_up() )
|
||||
BUG();
|
||||
cpufreq_add_cpu(0);
|
||||
|
||||
enable_cpu:
|
||||
cpufreq_add_cpu(0);
|
||||
microcode_resume_cpu(0);
|
||||
rcu_barrier();
|
||||
mtrr_aps_sync_begin();
|
||||
enable_nonboot_cpus();
|
||||
|
||||