Skip to content

Commit

Permalink
x86, intel_txt: Intel TXT Sx shutdown support
Browse files Browse the repository at this point in the history
Support for graceful handling of sleep states (S3/S4/S5) after an Intel(R) TXT launch.

Without this patch, attempting to place the system in one of the ACPI sleep
states (S3/S4/S5) will cause the TXT hardware to treat this as an attack and
will cause a system reset, with memory locked.  Not only may the subsequent
memory scrub take some time, but the platform will be unable to enter the
requested power state.

This patch calls back into the tboot so that it may properly and securely clean
up system state and clear the secrets-in-memory flag, after which it will place
the system into the requested sleep state using ACPI information passed by the kernel.

 arch/x86/kernel/smpboot.c     |    2 ++
 drivers/acpi/acpica/hwsleep.c |    3 +++
 kernel/cpu.c                  |    7 ++++++-
 3 files changed, 11 insertions(+), 1 deletion(-)

Signed-off-by: Joseph Cihula <joseph.cihula@intel.com>
Signed-off-by: Shane Wang <shane.wang@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
  • Loading branch information
Joseph Cihula authored and H. Peter Anvin committed Jul 21, 2009
1 parent 840c2ba commit 86886e5
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 1 deletion.
2 changes: 2 additions & 0 deletions arch/x86/kernel/smpboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
#include <asm/vmi.h>
#include <asm/apic.h>
#include <asm/setup.h>
#include <asm/tboot.h>
#include <asm/uv/uv.h>
#include <linux/mc146818rtc.h>

Expand Down Expand Up @@ -1317,6 +1318,7 @@ void play_dead_common(void)
void native_play_dead(void)
{
play_dead_common();
tboot_shutdown(TB_SHUTDOWN_WFS);
wbinvd_halt();
}

Expand Down
3 changes: 3 additions & 0 deletions drivers/acpi/acpica/hwsleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#include <acpi/acpi.h>
#include "accommon.h"
#include "actables.h"
#include <asm/tboot.h>

#define _COMPONENT ACPI_HARDWARE
ACPI_MODULE_NAME("hwsleep")
Expand Down Expand Up @@ -342,6 +343,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)

ACPI_FLUSH_CPU_CACHE();

tboot_sleep(sleep_state, pm1a_control, pm1b_control);

/* Write #2: Write both SLP_TYP + SLP_EN */

status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control);
Expand Down
7 changes: 6 additions & 1 deletion kernel/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/kthread.h>
#include <linux/stop_machine.h>
#include <linux/mutex.h>
#include <asm/tboot.h>

#ifdef CONFIG_SMP
/* Serializes the updates to cpu_online_mask, cpu_present_mask */
Expand Down Expand Up @@ -376,7 +377,7 @@ static cpumask_var_t frozen_cpus;

int disable_nonboot_cpus(void)
{
int cpu, first_cpu, error;
int cpu, first_cpu, error, num_cpus = 0;

error = stop_machine_create();
if (error)
Expand All @@ -391,6 +392,7 @@ int disable_nonboot_cpus(void)
for_each_online_cpu(cpu) {
if (cpu == first_cpu)
continue;
num_cpus++;
error = _cpu_down(cpu, 1);
if (!error) {
cpumask_set_cpu(cpu, frozen_cpus);
Expand All @@ -401,6 +403,9 @@ int disable_nonboot_cpus(void)
break;
}
}
/* ensure all CPUs have gone into wait-for-SIPI */
error |= tboot_wait_for_aps(num_cpus);

if (!error) {
BUG_ON(num_online_cpus() > 1);
/* Make sure the CPUs won't be enabled by someone else */
Expand Down

0 comments on commit 86886e5

Please sign in to comment.