Commit 630f337f authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Borislav Petkov
Browse files

x86/boot/compressed: Simplify IDT/GDT preserve/restore in the EFI thunk



Tweak the asm and remove some redundant instructions. While at it,
fix the associated comment for style and correctness.

Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221122161017.2426828-9-ardb@kernel.org
parent 4b520162
Loading
Loading
Loading
Loading
+7 −13
Original line number Diff line number Diff line
@@ -96,24 +96,20 @@ SYM_FUNC_START(__efi64_thunk)

	leaq	0x20(%rsp), %rbx
	sgdt	(%rbx)

	addq	$16, %rbx
	sidt	(%rbx)
	sidt	16(%rbx)

	leaq	1f(%rip), %rbp

	/*
	 * Switch to IDT and GDT with 32-bit segments. This is the firmware GDT
	 * and IDT that was installed when the kernel started executing. The
	 * pointers were saved by the efi32_entry() routine below.
	 * Switch to IDT and GDT with 32-bit segments. These are the firmware
	 * GDT and IDT that were installed when the kernel started executing.
	 * The pointers were saved by the efi32_entry() routine below.
	 *
	 * Pass the saved DS selector to the 32-bit code, and use far return to
	 * restore the saved CS selector.
	 */
	leaq	efi32_boot_idt(%rip), %rax
	lidt	(%rax)
	leaq	efi32_boot_gdt(%rip), %rax
	lgdt	(%rax)
	lidt	efi32_boot_idt(%rip)
	lgdt	efi32_boot_gdt(%rip)

	movzwl	efi32_boot_ds(%rip), %edx
	movzwq	efi32_boot_cs(%rip), %rax
@@ -187,9 +183,7 @@ SYM_FUNC_START_LOCAL(efi_enter32)
	 */
	cli

	lidtl	(%ebx)
	subl	$16, %ebx

	lidtl	16(%ebx)
	lgdtl	(%ebx)

	movl	%cr4, %eax