From: Ard Biesheuvel <ardb@kernel.org>
To: linux-efi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Ard Biesheuvel <ardb@kernel.org>,
Evgeniy Baskov <baskov@ispras.ru>, Borislav Petkov <bp@alien8.de>,
Andy Lutomirski <luto@kernel.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
Ingo Molnar <mingo@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Alexey Khoroshilov <khoroshilov@ispras.ru>,
Peter Jones <pjones@redhat.com>,
Gerd Hoffmann <kraxel@redhat.com>, Dave Young <dyoung@redhat.com>,
Mario Limonciello <mario.limonciello@amd.com>,
Kees Cook <keescook@chromium.org>,
Tom Lendacky <thomas.lendacky@amd.com>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Joerg Roedel <jroedel@suse.de>
Subject: [PATCH v6 06/21] x86/decompressor: Use proper sequence to take the address of the GOT
Date: Tue, 11 Jul 2023 11:14:38 +0200 [thread overview]
Message-ID: <20230711091453.2543622-7-ardb@kernel.org> (raw)
In-Reply-To: <20230711091453.2543622-1-ardb@kernel.org>
The 32-bit decompressor does not actually use a global offset table
(GOT), but as is common for 32-bit position independent code, it uses
the magic symbol _GLOBAL_OFFSET_TABLE_ as an anchor from which to derive
the actual runtime addresses of other symbols, using special @GOTOFF
symbol references that are resolved at link time, and populated with the
distance between the address of the magic _GLOBAL_OFFSET_TABLE_ anchor
and the address of the symbol in question.
This means _GLOBAL_OFFSET_TABLE_ is the only symbol whose actual runtime
address needs to be determined explicitly, which is one of the first
things that happens in startup_32. However, it does so by taking the
absolute address via the immediate field of an ADD instruction (plus a
small offset), which seems to defeat the point.
Fortunately, the assembler knows that _GLOBAL_OFFSET_TABLE_ is magic,
and emits a special relative R_386_GOTPC relocation instead, and so the
resulting code works as expected. However, this is not obvious for
someone reading the code, and the use of LEA with an explicit relative
addend is more idiomatic so use that instead.
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/x86/boot/compressed/head_32.S | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
index 8876ffe30e9a4819..3530465b5b85ccf3 100644
--- a/arch/x86/boot/compressed/head_32.S
+++ b/arch/x86/boot/compressed/head_32.S
@@ -58,7 +58,7 @@ SYM_FUNC_START(startup_32)
leal (BP_scratch+4)(%esi), %esp
call 1f
1: popl %edx
- addl $_GLOBAL_OFFSET_TABLE_+(.-1b), %edx
+ leal (_GLOBAL_OFFSET_TABLE_ - 1b)(%edx), %edx
/* Load new GDT */
leal gdt@GOTOFF(%edx), %eax
--
2.39.2
next prev parent reply other threads:[~2023-07-11 9:16 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-11 9:14 [PATCH v6 00/21] efi/x86: Avoid bare metal decompressor during EFI boot Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 01/21] x86/head_64: Store boot_params pointer in callee save register Ard Biesheuvel
2023-07-18 11:39 ` Borislav Petkov
2023-07-11 9:14 ` [PATCH v6 02/21] x86/efistub: Branch straight to kernel entry point from C code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 03/21] x86/efistub: Simplify and clean up handover entry code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 04/21] x86/decompressor: Avoid magic offsets for EFI handover entrypoint Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 05/21] x86/efistub: Clear BSS in EFI handover protocol entrypoint Ard Biesheuvel
2023-07-11 9:14 ` Ard Biesheuvel [this message]
2023-07-11 9:14 ` [PATCH v6 07/21] x86/decompressor: Store boot_params pointer in callee save register Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 08/21] x86/decompressor: Call trampoline as a normal function Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 09/21] x86/decompressor: Use standard calling convention for trampoline Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 10/21] x86/decompressor: Avoid the need for a stack in the 32-bit trampoline Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 11/21] x86/decompressor: Call trampoline directly from C code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 12/21] x86/decompressor: Only call the trampoline when changing paging levels Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 13/21] x86/decompressor: Merge trampoline cleanup with switching code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 14/21] x86/efistub: Perform 4/5 level paging switch from the stub Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 15/21] x86/efistub: Prefer EFI memory attributes protocol over DXE services Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 16/21] decompress: Use 8 byte alignment Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 17/21] x86/decompressor: Move global symbol references to C code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 18/21] x86/decompressor: Factor out kernel decompression and relocation Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 19/21] efi/libstub: Add limit argument to efi_random_alloc() Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 20/21] x86/efistub: Perform SNP feature test while running in the firmware Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 21/21] x86/efistub: Avoid legacy decompressor when doing EFI boot Ard Biesheuvel
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=20230711091453.2543622-7-ardb@kernel.org \
--to=ardb@kernel.org \
--cc=baskov@ispras.ru \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=dyoung@redhat.com \
--cc=jroedel@suse.de \
--cc=keescook@chromium.org \
--cc=khoroshilov@ispras.ru \
--cc=kirill.shutemov@linux.intel.com \
--cc=kraxel@redhat.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mario.limonciello@amd.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=pjones@redhat.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox