summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSubrata Banik <subratabanik@google.com>2022-12-31 14:43:57 +0530
committerSubrata Banik <subratabanik@google.com>2023-01-09 04:30:39 +0000
commitad87a82ca7d960ee696dd57c013d75609212eb66 (patch)
treec1eb27873647b8818e95c3273af712eee474d9a3 /src
parent93f12985e6b75f8a7b576a5a6b795ca3a8823395 (diff)
security/intel/txt: Add helper function to disable TXT
Add a function to disable TXT as per TXT BIOS spec Section 6.2.5. AP firmware can disable TXT if TXT fails or TPM is already enabled. On platforms with TXT disabled, the memory can be unlocked using MSR 0x2e6. TEST=Able to perform disable_txt on SoC SKUs with TXT enabled. Signed-off-by: Subrata Banik <subratabanik@google.com> Change-Id: I27f613428e82a1dd924172eab853d2ce9c32b473 Reviewed-on: https://review.coreboot.org/c/coreboot/+/71574 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Tarun Tuli <taruntuli@google.com> Reviewed-by: Sridhar Siricilla <sridhar.siricilla@intel.com> Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/cpu/x86/msr.h1
-rw-r--r--src/security/intel/txt/txt.h1
-rw-r--r--src/security/intel/txt/txtlib.c26
3 files changed, 28 insertions, 0 deletions
diff --git a/src/include/cpu/x86/msr.h b/src/include/cpu/x86/msr.h
index 33eb457f1a..d369972908 100644
--- a/src/include/cpu/x86/msr.h
+++ b/src/include/cpu/x86/msr.h
@@ -81,6 +81,7 @@
#define MCA_STATUS_LO_ERRCODE_EXT_SH 16
#define MCA_STATUS_LO_ERRCODE_EXT_MASK (0x3f << MCA_STATUS_LO_ERRCODE_EXT_SH)
#define MCA_STATUS_LO_ERRCODE_MASK (0xffff << 0)
+#define IA32_LT_UNLOCK_MEMORY 0x2e6
#define IA32_MC0_ADDR 0x402
#define IA32_MC_ADDR(bank) (IA32_MC0_ADDR + 4 * (bank))
#define IA32_MC0_MISC 0x403
diff --git a/src/security/intel/txt/txt.h b/src/security/intel/txt/txt.h
index 64e507d2b3..63e5bcda5b 100644
--- a/src/security/intel/txt/txt.h
+++ b/src/security/intel/txt/txt.h
@@ -30,5 +30,6 @@ bool intel_txt_prepare_txt_env(void);
/* Allow platform override to skip TXT lockdown, e.g. required for RAS error injection. */
bool skip_intel_txt_lockdown(void);
const char *intel_txt_processor_error_type(uint8_t type);
+void disable_intel_txt(void);
#endif /* SECURITY_INTEL_TXT_H_ */
diff --git a/src/security/intel/txt/txtlib.c b/src/security/intel/txt/txtlib.c
index 3ec2322f77..5478206ee2 100644
--- a/src/security/intel/txt/txtlib.c
+++ b/src/security/intel/txt/txtlib.c
@@ -44,3 +44,29 @@ bool is_txt_cpu(void)
return (ecx & (CPUID_SMX | CPUID_VMX)) == (CPUID_SMX | CPUID_VMX);
}
+
+static void unlock_txt_memory(void)
+{
+ msr_t msrval = {0};
+
+ wrmsr(IA32_LT_UNLOCK_MEMORY, msrval);
+}
+
+void disable_intel_txt(void)
+{
+ /* Return if the CPU doesn't support TXT */
+ if (!is_txt_cpu()) {
+ printk(BIOS_DEBUG, "Abort disabling TXT, as CPU is not TXT capable.\n");
+ return;
+ }
+
+ /*
+ * Memory is supposed to be locked if system is TXT capable
+ * As per TXT BIOS spec Section 6.2.5 unlock memory
+ * when security (TPM) is set and TXT is not enabled.
+ */
+ if (!is_establishment_bit_asserted()) {
+ unlock_txt_memory();
+ printk(BIOS_INFO, "TXT disabled successfully - Unlocked memory\n");
+ }
+}