All of lore.kernel.org
 help / color / mirror / Atom feed
From: "tip-bot2 for Ard Biesheuvel" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: Ard Biesheuvel <ardb@kernel.org>, Borislav Petkov <bp@suse.de>,
	x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [tip: x86/boot] x86/boot/compressed: Move startup32_check_sev_cbit() out of head_64.S
Date: Thu, 24 Nov 2022 08:12:01 -0000	[thread overview]
Message-ID: <166927752150.4906.4076564626502028600.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20221122161017.2426828-15-ardb@kernel.org>

The following commit has been merged into the x86/boot branch of tip:

Commit-ID:     9d7eaae6a071ff1f718e0aa5e610bb712f8cc632
Gitweb:        https://git.kernel.org/tip/9d7eaae6a071ff1f718e0aa5e610bb712f8cc632
Author:        Ard Biesheuvel <ardb@kernel.org>
AuthorDate:    Tue, 22 Nov 2022 17:10:14 +01:00
Committer:     Borislav Petkov <bp@suse.de>
CommitterDate: Thu, 24 Nov 2022 08:57:41 +01:00

x86/boot/compressed: Move startup32_check_sev_cbit() out of head_64.S

Now that the startup32_check_sev_cbit() routine can execute from
anywhere and behaves like an ordinary function, it can be moved where it
belongs.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221122161017.2426828-15-ardb@kernel.org
---
 arch/x86/boot/compressed/head_64.S     | 71 +-------------------------
 arch/x86/boot/compressed/mem_encrypt.S | 68 ++++++++++++++++++++++++-
 2 files changed, 68 insertions(+), 71 deletions(-)

diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index 30ba541..db577fb 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -711,77 +711,6 @@ SYM_DATA_START(boot_idt)
 SYM_DATA_END_LABEL(boot_idt, SYM_L_GLOBAL, boot_idt_end)
 
 /*
- * Check for the correct C-bit position when the startup_32 boot-path is used.
- *
- * The check makes use of the fact that all memory is encrypted when paging is
- * disabled. The function creates 64 bits of random data using the RDRAND
- * instruction. RDRAND is mandatory for SEV guests, so always available. If the
- * hypervisor violates that the kernel will crash right here.
- *
- * The 64 bits of random data are stored to a memory location and at the same
- * time kept in the %eax and %ebx registers. Since encryption is always active
- * when paging is off the random data will be stored encrypted in main memory.
- *
- * Then paging is enabled. When the C-bit position is correct all memory is
- * still mapped encrypted and comparing the register values with memory will
- * succeed. An incorrect C-bit position will map all memory unencrypted, so that
- * the compare will use the encrypted random data and fail.
- */
-#ifdef CONFIG_AMD_MEM_ENCRYPT
-	.text
-SYM_FUNC_START(startup32_check_sev_cbit)
-	pushl	%ebx
-	pushl	%ebp
-
-	call	0f
-0:	popl	%ebp
-
-	/* Check for non-zero sev_status */
-	movl	(sev_status - 0b)(%ebp), %eax
-	testl	%eax, %eax
-	jz	4f
-
-	/*
-	 * Get two 32-bit random values - Don't bail out if RDRAND fails
-	 * because it is better to prevent forward progress if no random value
-	 * can be gathered.
-	 */
-1:	rdrand	%eax
-	jnc	1b
-2:	rdrand	%ebx
-	jnc	2b
-
-	/* Store to memory and keep it in the registers */
-	leal	(sev_check_data - 0b)(%ebp), %ebp
-	movl	%eax, 0(%ebp)
-	movl	%ebx, 4(%ebp)
-
-	/* Enable paging to see if encryption is active */
-	movl	%cr0, %edx			 /* Backup %cr0 in %edx */
-	movl	$(X86_CR0_PG | X86_CR0_PE), %ecx /* Enable Paging and Protected mode */
-	movl	%ecx, %cr0
-
-	cmpl	%eax, 0(%ebp)
-	jne	3f
-	cmpl	%ebx, 4(%ebp)
-	jne	3f
-
-	movl	%edx, %cr0	/* Restore previous %cr0 */
-
-	jmp	4f
-
-3:	/* Check failed - hlt the machine */
-	hlt
-	jmp	3b
-
-4:
-	popl	%ebp
-	popl	%ebx
-	RET
-SYM_FUNC_END(startup32_check_sev_cbit)
-#endif
-
-/*
  * Stack and heap for uncompression
  */
 	.bss
diff --git a/arch/x86/boot/compressed/mem_encrypt.S b/arch/x86/boot/compressed/mem_encrypt.S
index 6747e5e..14cf04a 100644
--- a/arch/x86/boot/compressed/mem_encrypt.S
+++ b/arch/x86/boot/compressed/mem_encrypt.S
@@ -243,6 +243,74 @@ SYM_FUNC_START(startup32_load_idt)
 	RET
 SYM_FUNC_END(startup32_load_idt)
 
+/*
+ * Check for the correct C-bit position when the startup_32 boot-path is used.
+ *
+ * The check makes use of the fact that all memory is encrypted when paging is
+ * disabled. The function creates 64 bits of random data using the RDRAND
+ * instruction. RDRAND is mandatory for SEV guests, so always available. If the
+ * hypervisor violates that the kernel will crash right here.
+ *
+ * The 64 bits of random data are stored to a memory location and at the same
+ * time kept in the %eax and %ebx registers. Since encryption is always active
+ * when paging is off the random data will be stored encrypted in main memory.
+ *
+ * Then paging is enabled. When the C-bit position is correct all memory is
+ * still mapped encrypted and comparing the register values with memory will
+ * succeed. An incorrect C-bit position will map all memory unencrypted, so that
+ * the compare will use the encrypted random data and fail.
+ */
+SYM_FUNC_START(startup32_check_sev_cbit)
+	pushl	%ebx
+	pushl	%ebp
+
+	call	0f
+0:	popl	%ebp
+
+	/* Check for non-zero sev_status */
+	movl	(sev_status - 0b)(%ebp), %eax
+	testl	%eax, %eax
+	jz	4f
+
+	/*
+	 * Get two 32-bit random values - Don't bail out if RDRAND fails
+	 * because it is better to prevent forward progress if no random value
+	 * can be gathered.
+	 */
+1:	rdrand	%eax
+	jnc	1b
+2:	rdrand	%ebx
+	jnc	2b
+
+	/* Store to memory and keep it in the registers */
+	leal	(sev_check_data - 0b)(%ebp), %ebp
+	movl	%eax, 0(%ebp)
+	movl	%ebx, 4(%ebp)
+
+	/* Enable paging to see if encryption is active */
+	movl	%cr0, %edx			 /* Backup %cr0 in %edx */
+	movl	$(X86_CR0_PG | X86_CR0_PE), %ecx /* Enable Paging and Protected mode */
+	movl	%ecx, %cr0
+
+	cmpl	%eax, 0(%ebp)
+	jne	3f
+	cmpl	%ebx, 4(%ebp)
+	jne	3f
+
+	movl	%edx, %cr0	/* Restore previous %cr0 */
+
+	jmp	4f
+
+3:	/* Check failed - hlt the machine */
+	hlt
+	jmp	3b
+
+4:
+	popl	%ebp
+	popl	%ebx
+	RET
+SYM_FUNC_END(startup32_check_sev_cbit)
+
 	.code64
 
 #include "../../kernel/sev_verify_cbit.S"

  reply	other threads:[~2022-11-24  8:13 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-22 16:10 [PATCH v3 00/17] x86: head_64.S spring cleaning Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 01/17] x86/compressed: efi-mixed: rename efi_thunk_64.S to efi-mixed.S Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Rename " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 02/17] x86/compressed: efi-mixed: move 32-bit entrypoint code into .text section Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 03/17] x86/compressed: efi-mixed: move bootargs parsing out of 32-bit startup code Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 04/17] x86/compressed: efi-mixed: move efi32_pe_entry into .text section Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 05/17] x86/compressed: efi-mixed: move efi32_entry out of head_64.S Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 06/17] x86/compressed: efi-mixed: move efi32_pe_entry() " Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 07/17] x86/compressed: efi: merge multiple definitions of image_offset into one Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed, efi: Merge " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 08/17] x86/compressed: efi-mixed: simplify IDT/GDT preserve/restore Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Simplify IDT/GDT preserve/restore in the EFI thunk tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 09/17] x86/compressed: avoid touching ECX in startup32_set_idt_entry() Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Avoid " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 10/17] x86/compressed: pull global variable ref up into startup32_load_idt() Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Pull global variable reference " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 11/17] x86/compressed: move startup32_load_idt() into .text section Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 12/17] x86/compressed: move startup32_load_idt() out of head_64.S Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 13/17] x86/compressed: move startup32_check_sev_cbit() into .text Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Move " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 14/17] x86/compressed: move startup32_check_sev_cbit() out of head_64.S Ard Biesheuvel
2022-11-24  8:12   ` tip-bot2 for Ard Biesheuvel [this message]
2022-11-22 16:10 ` [PATCH v3 15/17] x86/compressed: adhere to calling convention in get_sev_encryption_bit() Ard Biesheuvel
2022-11-24  8:12   ` [tip: x86/boot] x86/boot/compressed: Adhere " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 16/17] x86/compressed: only build mem_encrypt.S if AMD_MEM_ENCRYPT=y Ard Biesheuvel
2022-11-24  8:11   ` [tip: x86/boot] x86/boot/compressed: Only " tip-bot2 for Ard Biesheuvel
2022-11-22 16:10 ` [PATCH v3 17/17] efi: x86: Make the deprecated EFI handover protocol optional Ard Biesheuvel
2022-11-22 18:56   ` Randy Dunlap
2022-11-24  8:11   ` [tip: x86/boot] x86/efi: " tip-bot2 for Ard Biesheuvel
2022-11-22 20:48 ` [PATCH v3 00/17] x86: head_64.S spring cleaning Tom Lendacky
2022-11-22 21:37   ` Ard Biesheuvel
2022-11-22 21:42     ` Ard Biesheuvel
2022-11-22 21:50       ` Tom Lendacky
2022-11-22 21:51         ` Ard Biesheuvel
2022-11-22 21:49     ` Tom Lendacky
2022-11-22 22:20       ` Borislav Petkov
2022-11-23 10:49       ` Borislav Petkov
2022-11-23 10:52         ` Ard Biesheuvel
2022-11-23 11:09           ` Borislav Petkov
2022-11-23 11:22             ` Ard Biesheuvel
2022-11-23 14:16           ` Tom Lendacky
2022-11-23 14:33             ` Ard Biesheuvel
2022-11-23 14:13         ` Tom Lendacky

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=166927752150.4906.4076564626502028600.tip-bot2@tip-bot2 \
    --to=tip-bot2@linutronix.de \
    --cc=ardb@kernel.org \
    --cc=bp@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=x86@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.