linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kuppuswamy Sathyanarayanan  <sathyanarayanan.kuppuswamy@linux.intel.com>
To: Peter Zijlstra <peterz@infradead.org>,
	Andy Lutomirski <luto@kernel.org>,
	Dave Hansen <dave.hansen@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>,
	Kirill Shutemov <kirill.shutemov@linux.intel.com>,
	Kuppuswamy Sathyanarayanan <knsathya@kernel.org>,
	Dan Williams <dan.j.williams@intel.com>,
	Raj Ashok <ashok.raj@intel.com>,
	Sean Christopherson <seanjc@google.com>,
	linux-kernel@vger.kernel.org,
	Sean Christopherson <sean.j.christopherson@intel.com>,
	Kai Huang <kai.huang@intel.com>,
	Kuppuswamy Sathyanarayanan 
	<sathyanarayanan.kuppuswamy@linux.intel.com>
Subject: [RFC v1 15/26] x86/boot: Add a trampoline for APs booting in 64-bit mode
Date: Fri,  5 Feb 2021 15:38:32 -0800	[thread overview]
Message-ID: <e55cfc38f3af5459712683ab8252bf8d4fb1ea1a.1612563142.git.sathyanarayanan.kuppuswamy@linux.intel.com> (raw)
In-Reply-To: <cover.1612563142.git.sathyanarayanan.kuppuswamy@linux.intel.com>

From: Sean Christopherson <sean.j.christopherson@intel.com>

Add a trampoline for booting APs in 64-bit mode via a software handoff
with BIOS, and use the new trampoline for the ACPI MP wake protocol used
by TDX.

Extend the real mode IDT pointer by four bytes to support LIDT in 64-bit
mode.  For the GDT pointer, create a new entry as the existing storage
for the pointer occupies the zero entry in the GDT itself.

Reported-by: Kai Huang <kai.huang@intel.com>
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
---
 arch/x86/include/asm/realmode.h          |  1 +
 arch/x86/kernel/smpboot.c                |  5 +++
 arch/x86/realmode/rm/header.S            |  1 +
 arch/x86/realmode/rm/trampoline_64.S     | 49 +++++++++++++++++++++++-
 arch/x86/realmode/rm/trampoline_common.S |  5 ++-
 5 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h
index 5db5d083c873..5066c8b35e7c 100644
--- a/arch/x86/include/asm/realmode.h
+++ b/arch/x86/include/asm/realmode.h
@@ -25,6 +25,7 @@ struct real_mode_header {
 	u32	sev_es_trampoline_start;
 #endif
 #ifdef CONFIG_X86_64
+	u32	trampoline_start64;
 	u32	trampoline_pgd;
 #endif
 	/* ACPI S3 wakeup */
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 8ca66af96a54..11dd0deb4810 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1035,6 +1035,11 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle,
 	unsigned long boot_error = 0;
 	unsigned long timeout;
 
+#ifdef CONFIG_X86_64
+	if (is_tdx_guest())
+		start_ip = real_mode_header->trampoline_start64;
+#endif
+
 	idle->thread.sp = (unsigned long)task_pt_regs(idle);
 	early_gdt_descr.address = (unsigned long)get_cpu_gdt_rw(cpu);
 	initial_code = (unsigned long)start_secondary;
diff --git a/arch/x86/realmode/rm/header.S b/arch/x86/realmode/rm/header.S
index 8c1db5bf5d78..2eb62be6d256 100644
--- a/arch/x86/realmode/rm/header.S
+++ b/arch/x86/realmode/rm/header.S
@@ -24,6 +24,7 @@ SYM_DATA_START(real_mode_header)
 	.long	pa_sev_es_trampoline_start
 #endif
 #ifdef CONFIG_X86_64
+	.long	pa_trampoline_start64
 	.long	pa_trampoline_pgd;
 #endif
 	/* ACPI S3 wakeup */
diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S
index 84c5d1b33d10..12b734b1da8b 100644
--- a/arch/x86/realmode/rm/trampoline_64.S
+++ b/arch/x86/realmode/rm/trampoline_64.S
@@ -143,13 +143,20 @@ SYM_CODE_START(startup_32)
 	movl	%eax, %cr3
 
 	# Set up EFER
+	movl	$MSR_EFER, %ecx
+	rdmsr
+	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	$(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE), %eax
+	movl	$(X86_CR0_PG | X86_CR0_WP | X86_CR0_NE | X86_CR0_PE), %eax
 	movl	%eax, %cr0
 
 	/*
@@ -161,6 +168,19 @@ SYM_CODE_START(startup_32)
 	ljmpl	$__KERNEL_CS, $pa_startup_64
 SYM_CODE_END(startup_32)
 
+SYM_CODE_START(pa_trampoline_compat)
+	/*
+	 * In compatibility mode.  Prep ESP and DX for startup_32, then disable
+	 * paging and complete the switch to legacy 32-bit mode.
+	 */
+	movl	$rm_stack_end, %esp
+	movw	$__KERNEL_DS, %dx
+
+	movl	$(X86_CR0_NE | X86_CR0_PE), %eax
+	movl	%eax, %cr0
+	ljmpl   $__KERNEL32_CS, $pa_startup_32
+SYM_CODE_END(pa_trampoline_compat)
+
 	.section ".text64","ax"
 	.code64
 	.balign 4
@@ -169,6 +189,20 @@ SYM_CODE_START(startup_64)
 	jmpq	*tr_start(%rip)
 SYM_CODE_END(startup_64)
 
+SYM_CODE_START(trampoline_start64)
+	/*
+	 * APs start here on a direct transfer from 64-bit BIOS with identity
+	 * mapped page tables.  Load the kernel's GDT in order to gear down to
+	 * 32-bit mode (to handle 4-level vs. 5-level paging), and to (re)load
+	 * segment registers.  Load the zero IDT so any fault triggers a
+	 * shutdown instead of jumping back into BIOS.
+	 */
+	lidt	tr_idt(%rip)
+	lgdt	tr_gdt64(%rip)
+
+	ljmpl	*tr_compat(%rip)
+SYM_CODE_END(trampoline_start64)
+
 	.section ".rodata","a"
 	# Duplicate the global descriptor table
 	# so the kernel can live anywhere
@@ -182,6 +216,17 @@ SYM_DATA_START(tr_gdt)
 	.quad	0x00cf93000000ffff	# __KERNEL_DS
 SYM_DATA_END_LABEL(tr_gdt, SYM_L_LOCAL, tr_gdt_end)
 
+SYM_DATA_START(tr_gdt64)
+	.short	tr_gdt_end - tr_gdt - 1	# gdt limit
+	.long	pa_tr_gdt
+	.long	0
+SYM_DATA_END(tr_gdt64)
+
+SYM_DATA_START(tr_compat)
+	.long	pa_trampoline_compat
+	.short	__KERNEL32_CS
+SYM_DATA_END(tr_compat)
+
 	.bss
 	.balign	PAGE_SIZE
 SYM_DATA(trampoline_pgd, .space PAGE_SIZE)
diff --git a/arch/x86/realmode/rm/trampoline_common.S b/arch/x86/realmode/rm/trampoline_common.S
index 5033e640f957..506d5897112a 100644
--- a/arch/x86/realmode/rm/trampoline_common.S
+++ b/arch/x86/realmode/rm/trampoline_common.S
@@ -1,4 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 	.section ".rodata","a"
 	.balign	16
-SYM_DATA_LOCAL(tr_idt, .fill 1, 6, 0)
+SYM_DATA_START_LOCAL(tr_idt)
+	.short	0
+	.quad	0
+SYM_DATA_END(tr_idt)
-- 
2.25.1


  parent reply	other threads:[~2021-02-06  5:00 UTC|newest]

Thread overview: 161+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-06  3:02 Test Email sathyanarayanan.kuppuswamy
2021-02-05 23:38 ` [RFC v1 00/26] Add TDX Guest Support Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 01/26] x86/paravirt: Introduce CONFIG_PARAVIRT_XL Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 02/26] x86/cpufeatures: Add TDX Guest CPU feature Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 03/26] x86/cpufeatures: Add is_tdx_guest() interface Kuppuswamy Sathyanarayanan
2021-04-01 21:08   ` Dave Hansen
2021-04-01 21:15     ` Kuppuswamy, Sathyanarayanan
2021-04-01 21:19       ` Dave Hansen
2021-04-01 22:25         ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 04/26] x86/tdx: Get TD execution environment information via TDINFO Kuppuswamy Sathyanarayanan
2021-02-08 10:00   ` Peter Zijlstra
2021-02-08 19:10     ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 05/26] x86/traps: Add #VE support for TDX guest Kuppuswamy Sathyanarayanan
2021-02-08 10:20   ` Peter Zijlstra
2021-02-08 16:23     ` Andi Kleen
2021-02-08 16:33       ` Peter Zijlstra
2021-02-08 16:46         ` Sean Christopherson
2021-02-08 16:59           ` Peter Zijlstra
2021-02-08 19:05             ` Kuppuswamy, Sathyanarayanan
2021-02-08 16:46         ` Andi Kleen
2021-02-12 19:20   ` Dave Hansen
2021-02-12 19:47   ` Andy Lutomirski
2021-02-12 20:06     ` Sean Christopherson
2021-02-12 20:17       ` Dave Hansen
2021-02-12 20:37         ` Sean Christopherson
2021-02-12 20:46           ` Dave Hansen
2021-02-12 20:54             ` Sean Christopherson
2021-02-12 21:06               ` Dave Hansen
2021-02-12 21:37                 ` Sean Christopherson
2021-02-12 21:47                   ` Andy Lutomirski
2021-02-12 21:48                     ` Dave Hansen
2021-02-14 19:33                       ` Andi Kleen
2021-02-14 19:54                         ` Andy Lutomirski
2021-02-12 20:20       ` Andy Lutomirski
2021-02-12 20:44         ` Sean Christopherson
2021-02-05 23:38 ` [RFC v1 06/26] x86/tdx: Add HLT " Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 07/26] x86/tdx: Wire up KVM hypercalls Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 08/26] x86/tdx: Add MSR support for TDX guest Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 09/26] x86/tdx: Handle CPUID via #VE Kuppuswamy Sathyanarayanan
2021-02-05 23:42   ` Andy Lutomirski
2021-02-07 14:13     ` Kirill A. Shutemov
2021-02-07 16:01       ` Dave Hansen
2021-02-07 20:29         ` Kirill A. Shutemov
2021-02-07 22:31           ` Dave Hansen
2021-02-07 22:45             ` Andy Lutomirski
2021-02-08 17:10               ` Sean Christopherson
2021-02-08 17:35                 ` Andy Lutomirski
2021-02-08 17:47                   ` Sean Christopherson
2021-03-18 21:30               ` [PATCH v1 1/1] x86/tdx: Add tdcall() and tdvmcall() helper functions Kuppuswamy Sathyanarayanan
2021-03-19 16:55                 ` Sean Christopherson
2021-03-19 17:42                   ` Kuppuswamy, Sathyanarayanan
2021-03-19 18:22                     ` Dave Hansen
2021-03-19 19:58                       ` Kuppuswamy, Sathyanarayanan
2021-03-26 23:38                         ` [PATCH v2 1/1] x86/tdx: Add __tdcall() and __tdvmcall() " Kuppuswamy Sathyanarayanan
2021-04-20 17:36                           ` Dave Hansen
2021-04-20 19:20                             ` Kuppuswamy, Sathyanarayanan
2021-04-20 19:59                               ` Dave Hansen
2021-04-20 23:12                                 ` Kuppuswamy, Sathyanarayanan
2021-04-20 23:42                                   ` Dave Hansen
2021-04-23  1:09                                     ` Kuppuswamy, Sathyanarayanan
2021-04-23  1:21                                       ` Dave Hansen
2021-04-23  1:35                                         ` Andi Kleen
2021-04-23 15:15                                           ` Sean Christopherson
2021-04-23 15:28                                             ` Dan Williams
2021-04-23 15:38                                               ` Andi Kleen
2021-04-23 15:50                                               ` Sean Christopherson
2021-04-23 15:47                                             ` Andi Kleen
2021-04-23 18:18                                             ` Kuppuswamy, Sathyanarayanan
2021-04-20 23:53                                   ` Dan Williams
2021-04-20 23:59                                     ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 10/26] x86/io: Allow to override inX() and outX() implementation Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 11/26] x86/tdx: Handle port I/O Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 12/26] x86/tdx: Handle in-kernel MMIO Kuppuswamy Sathyanarayanan
2021-04-01 19:56   ` Dave Hansen
2021-04-01 22:26     ` Sean Christopherson
2021-04-01 22:53       ` Dave Hansen
2021-02-05 23:38 ` [RFC v1 13/26] x86/tdx: Handle MWAIT, MONITOR and WBINVD Kuppuswamy Sathyanarayanan
2021-02-05 23:43   ` Andy Lutomirski
2021-02-05 23:54     ` Kuppuswamy, Sathyanarayanan
2021-02-06  1:05       ` Andy Lutomirski
2021-03-27  0:18         ` [PATCH v1 1/1] " Kuppuswamy Sathyanarayanan
2021-03-27  2:40           ` Andy Lutomirski
2021-03-27  3:40             ` Kuppuswamy, Sathyanarayanan
2021-03-27 16:03               ` Andy Lutomirski
2021-03-27 22:54                 ` [PATCH v2 " Kuppuswamy Sathyanarayanan
2021-03-29 17:14                   ` Dave Hansen
2021-03-29 21:55                     ` Kuppuswamy, Sathyanarayanan
2021-03-29 22:02                       ` Dave Hansen
2021-03-29 22:09                         ` Kuppuswamy, Sathyanarayanan
2021-03-29 22:12                           ` Dave Hansen
2021-03-29 22:42                             ` Kuppuswamy, Sathyanarayanan
2021-03-29 23:16                             ` [PATCH v3 " Kuppuswamy Sathyanarayanan
2021-03-29 23:23                               ` Andy Lutomirski
2021-03-29 23:37                                 ` Kuppuswamy, Sathyanarayanan
2021-03-29 23:42                                   ` Sean Christopherson
2021-03-29 23:58                                     ` Andy Lutomirski
2021-03-30  2:04                                       ` Andi Kleen
2021-03-30  2:58                                         ` Andy Lutomirski
2021-03-30 15:14                                           ` Sean Christopherson
2021-03-30 16:37                                             ` Andy Lutomirski
2021-03-30 16:57                                               ` Sean Christopherson
2021-04-07 15:24                                                 ` Andi Kleen
2021-03-31 21:09                                           ` [PATCH v4 " Kuppuswamy Sathyanarayanan
2021-03-31 21:49                                             ` Dave Hansen
2021-03-31 22:29                                               ` Kuppuswamy, Sathyanarayanan
2021-03-31 21:53                                             ` Sean Christopherson
2021-03-31 22:00                                               ` Dave Hansen
2021-03-31 22:06                                                 ` Sean Christopherson
2021-03-31 22:11                                                   ` Dave Hansen
2021-03-31 22:28                                                     ` Kuppuswamy, Sathyanarayanan
2021-03-31 22:32                                                       ` Sean Christopherson
2021-03-31 22:34                                                       ` Dave Hansen
2021-04-01  3:28                                                         ` Andi Kleen
2021-04-01  3:46                                                           ` Dave Hansen
2021-04-01  4:24                                                             ` Andi Kleen
2021-04-01  4:51                                                               ` [PATCH v5 " Kuppuswamy Sathyanarayanan
2021-03-29 23:39                                 ` [PATCH v3 " Sean Christopherson
2021-03-29 23:38                               ` Dave Hansen
2021-03-30  4:56           ` [PATCH v1 " Xiaoyao Li
2021-03-30 15:00             ` Andi Kleen
2021-03-30 15:10               ` Dave Hansen
2021-03-30 17:02                 ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 14/26] ACPI: tables: Add multiprocessor wake-up support Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` Kuppuswamy Sathyanarayanan [this message]
2021-02-05 23:38 ` [RFC v1 16/26] x86/boot: Avoid #VE during compressed boot for TDX platforms Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 17/26] x86/boot: Avoid unnecessary #VE during boot process Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 18/26] x86/topology: Disable CPU hotplug support for TDX platforms Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 19/26] x86/tdx: Forcefully disable legacy PIC for TDX guests Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 20/26] x86/tdx: Introduce INTEL_TDX_GUEST config option Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 21/26] x86/mm: Move force_dma_unencrypted() to common code Kuppuswamy Sathyanarayanan
2021-04-01 20:06   ` Dave Hansen
2021-04-06 15:37     ` Kirill A. Shutemov
2021-04-06 16:11       ` Dave Hansen
2021-04-06 16:37         ` Kirill A. Shutemov
2021-02-05 23:38 ` [RFC v1 22/26] x86/tdx: Exclude Shared bit from __PHYSICAL_MASK Kuppuswamy Sathyanarayanan
2021-04-01 20:13   ` Dave Hansen
2021-04-06 15:54     ` Kirill A. Shutemov
2021-04-06 16:12       ` Dave Hansen
2021-02-05 23:38 ` [RFC v1 23/26] x86/tdx: Make pages shared in ioremap() Kuppuswamy Sathyanarayanan
2021-04-01 20:26   ` Dave Hansen
2021-04-06 16:00     ` Kirill A. Shutemov
2021-04-06 16:14       ` Dave Hansen
2021-02-05 23:38 ` [RFC v1 24/26] x86/tdx: Add helper to do MapGPA TDVMALL Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` [RFC v1 25/26] x86/tdx: Make DMA pages shared Kuppuswamy Sathyanarayanan
2021-04-01 21:01   ` Dave Hansen
2021-04-06 16:31     ` Kirill A. Shutemov
2021-04-06 16:38       ` Dave Hansen
2021-04-06 17:16         ` Sean Christopherson
2021-02-05 23:38 ` [RFC v1 26/26] x86/kvm: Use bounce buffers for TD guest Kuppuswamy Sathyanarayanan
2021-04-01 21:17   ` Dave Hansen
2021-02-06  3:04 ` Test Email sathyanarayanan.kuppuswamy
2021-02-06  6:24 ` [RFC v1 00/26] Add TDX Guest Support sathyanarayanan.kuppuswamy
2021-03-31 21:38 ` Kuppuswamy, Sathyanarayanan
2021-04-02  0:02 ` Dave Hansen
2021-04-02  2:48   ` Andi Kleen
2021-04-02 15:27     ` Dave Hansen
2021-04-02 21:32       ` Andi Kleen
2021-04-03 16:26         ` Dave Hansen
2021-04-03 17:28           ` Andi Kleen
2021-04-04 15:02 ` Dave Hansen
2021-04-12 17:24   ` Dan Williams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e55cfc38f3af5459712683ab8252bf8d4fb1ea1a.1612563142.git.sathyanarayanan.kuppuswamy@linux.intel.com \
    --to=sathyanarayanan.kuppuswamy@linux.intel.com \
    --cc=ak@linux.intel.com \
    --cc=ashok.raj@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=kai.huang@intel.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=knsathya@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=peterz@infradead.org \
    --cc=sean.j.christopherson@intel.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).