summaryrefslogtreecommitdiffstats
path: root/arch/x86/realmode/rm
diff options
context:
space:
mode:
authorSean Christopherson <seanjc@google.com>2022-04-06 02:29:32 +0300
committerDave Hansen <dave.hansen@linux.intel.com>2022-04-07 08:27:53 -0700
commit77a512e35db7609a8c909e2006b2ea82f2b1616f (patch)
treece05de2fb1b2e98446cfb7c846f27e188fa627e6 /arch/x86/realmode/rm
parent9cf30606405f37b68ee1c0f6846253313c077088 (diff)
downloadlinux-stable-77a512e35db7609a8c909e2006b2ea82f2b1616f.tar.gz
linux-stable-77a512e35db7609a8c909e2006b2ea82f2b1616f.tar.bz2
linux-stable-77a512e35db7609a8c909e2006b2ea82f2b1616f.zip
x86/boot: Avoid #VE during boot for TDX platforms
There are a few MSRs and control register bits that the kernel normally needs to modify during boot. But, TDX disallows modification of these registers to help provide consistent security guarantees. Fortunately, TDX ensures that these are all in the correct state before the kernel loads, which means the kernel does not need to modify them. The conditions to avoid are: * Any writes to the EFER MSR * Clearing CR4.MCE This theoretically makes the guest boot more fragile. If, for instance, EFER was set up incorrectly and a WRMSR was performed, it will trigger early exception panic or a triple fault, if it's before early exceptions are set up. However, this is likely to trip up the guest BIOS long before control reaches the kernel. In any case, these kinds of problems are unlikely to occur in production environments, and developers have good debug tools to fix them quickly. Change the common boot code to work on TDX and non-TDX systems. This should have no functional effect on non-TDX systems. Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Andi Kleen <ak@linux.intel.com> Reviewed-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/r/20220405232939.73860-24-kirill.shutemov@linux.intel.com
Diffstat (limited to 'arch/x86/realmode/rm')
-rw-r--r--arch/x86/realmode/rm/trampoline_64.S13
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S
index d380f2d1fd23..e38d61d6562e 100644
--- a/arch/x86/realmode/rm/trampoline_64.S
+++ b/arch/x86/realmode/rm/trampoline_64.S
@@ -143,11 +143,22 @@ SYM_CODE_START(startup_32)
movl %eax, %cr3
# Set up EFER
+ movl $MSR_EFER, %ecx
+ rdmsr
+ /*
+ * Skip writing to EFER if the register already has desired
+ * value (to avoid #VE for the TDX guest).
+ */
+ cmp pa_tr_efer, %eax
+ jne .Lwrite_efer
+ cmp pa_tr_efer + 4, %edx
+ je .Ldone_efer
+.Lwrite_efer:
movl pa_tr_efer, %eax
movl pa_tr_efer + 4, %edx
- movl $MSR_EFER, %ecx
wrmsr
+.Ldone_efer:
# Enable paging and in turn activate Long Mode.
movl $CR0_STATE, %eax
movl %eax, %cr0