From: Brian Gerst <brgerst@gmail.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org
Cc: Ingo Molnar <mingo@kernel.org>, "H . Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>,
Borislav Petkov <bp@alien8.de>, Ard Biesheuvel <ardb@kernel.org>,
Uros Bizjak <ubizjak@gmail.com>, Brian Gerst <brgerst@gmail.com>
Subject: [PATCH v6 10/15] x86/boot/64: Remove inverse relocations
Date: Thu, 23 Jan 2025 14:07:42 -0500 [thread overview]
Message-ID: <20250123190747.745588-11-brgerst@gmail.com> (raw)
In-Reply-To: <20250123190747.745588-1-brgerst@gmail.com>
Inverse relocations were needed to offset the effects of relocation for
RIP-relative accesses to zero-based percpu data. Now that the percpu
section is linked normally as part of the kernel image, they are no
longer needed.
Signed-off-by: Brian Gerst <brgerst@gmail.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/x86/boot/compressed/misc.c | 14 +---
arch/x86/tools/relocs.c | 130 +-------------------------------
2 files changed, 2 insertions(+), 142 deletions(-)
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
index 0d37420cad02..1cdcd4aaf395 100644
--- a/arch/x86/boot/compressed/misc.c
+++ b/arch/x86/boot/compressed/misc.c
@@ -235,7 +235,7 @@ static void handle_relocations(void *output, unsigned long output_len,
/*
* Process relocations: 32 bit relocations first then 64 bit after.
- * Three sets of binary relocations are added to the end of the kernel
+ * Two sets of binary relocations are added to the end of the kernel
* before compression. Each relocation table entry is the kernel
* address of the location which needs to be updated stored as a
* 32-bit value which is sign extended to 64 bits.
@@ -245,8 +245,6 @@ static void handle_relocations(void *output, unsigned long output_len,
* kernel bits...
* 0 - zero terminator for 64 bit relocations
* 64 bit relocation repeated
- * 0 - zero terminator for inverse 32 bit relocations
- * 32 bit inverse relocation repeated
* 0 - zero terminator for 32 bit relocations
* 32 bit relocation repeated
*
@@ -263,16 +261,6 @@ static void handle_relocations(void *output, unsigned long output_len,
*(uint32_t *)ptr += delta;
}
#ifdef CONFIG_X86_64
- while (*--reloc) {
- long extended = *reloc;
- extended += map;
-
- ptr = (unsigned long)extended;
- if (ptr < min_addr || ptr > max_addr)
- error("inverse 32-bit relocation outside of kernel!\n");
-
- *(int32_t *)ptr -= delta;
- }
for (reloc--; *reloc; reloc--) {
long extended = *reloc;
extended += map;
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
index a9f8bc6aaafc..9e8d5a62ff50 100644
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -29,7 +29,6 @@ static struct relocs relocs16;
static struct relocs relocs32;
#if ELF_BITS == 64
-static struct relocs relocs32neg;
static struct relocs relocs64;
# define FMT PRIu64
@@ -91,7 +90,6 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = {
"__initramfs_start|"
"(jiffies|jiffies_64)|"
#if ELF_BITS == 64
- "__per_cpu_load|"
"init_per_cpu__.*|"
"__end_rodata_hpage_align|"
#endif
@@ -290,34 +288,6 @@ static const char *sym_name(const char *sym_strtab, Elf_Sym *sym)
return name;
}
-static Elf_Sym *sym_lookup(const char *symname)
-{
- int i;
-
- for (i = 0; i < shnum; i++) {
- struct section *sec = &secs[i];
- long nsyms;
- char *strtab;
- Elf_Sym *symtab;
- Elf_Sym *sym;
-
- if (sec->shdr.sh_type != SHT_SYMTAB)
- continue;
-
- nsyms = sec->shdr.sh_size/sizeof(Elf_Sym);
- symtab = sec->symtab;
- strtab = sec->link->strtab;
-
- for (sym = symtab; --nsyms >= 0; sym++) {
- if (!sym->st_name)
- continue;
- if (strcmp(symname, strtab + sym->st_name) == 0)
- return sym;
- }
- }
- return 0;
-}
-
#if BYTE_ORDER == LITTLE_ENDIAN
# define le16_to_cpu(val) (val)
# define le32_to_cpu(val) (val)
@@ -766,78 +736,8 @@ static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
}
}
-/*
- * The .data..percpu section is a special case for x86_64 SMP kernels.
- * It is used to initialize the actual per_cpu areas and to provide
- * definitions for the per_cpu variables that correspond to their offsets
- * within the percpu area. Since the values of all of the symbols need
- * to be offsets from the start of the per_cpu area the virtual address
- * (sh_addr) of .data..percpu is 0 in SMP kernels.
- *
- * This means that:
- *
- * Relocations that reference symbols in the per_cpu area do not
- * need further relocation (since the value is an offset relative
- * to the start of the per_cpu area that does not change).
- *
- * Relocations that apply to the per_cpu area need to have their
- * offset adjusted by by the value of __per_cpu_load to make them
- * point to the correct place in the loaded image (because the
- * virtual address of .data..percpu is 0).
- *
- * For non SMP kernels .data..percpu is linked as part of the normal
- * kernel data and does not require special treatment.
- *
- */
-static int per_cpu_shndx = -1;
-static Elf_Addr per_cpu_load_addr;
-
-static void percpu_init(void)
-{
- int i;
-
- for (i = 0; i < shnum; i++) {
- ElfW(Sym) *sym;
-
- if (strcmp(sec_name(i), ".data..percpu"))
- continue;
-
- if (secs[i].shdr.sh_addr != 0) /* non SMP kernel */
- return;
-
- sym = sym_lookup("__per_cpu_load");
- if (!sym)
- die("can't find __per_cpu_load\n");
-
- per_cpu_shndx = i;
- per_cpu_load_addr = sym->st_value;
-
- return;
- }
-}
-
#if ELF_BITS == 64
-/*
- * Check to see if a symbol lies in the .data..percpu section.
- *
- * The linker incorrectly associates some symbols with the
- * .data..percpu section so we also need to check the symbol
- * name to make sure that we classify the symbol correctly.
- *
- * The GNU linker incorrectly associates:
- * __init_begin
- * __per_cpu_load
- *
- * The "gold" linker incorrectly associates:
- * init_per_cpu__gdt_page
- */
-static int is_percpu_sym(ElfW(Sym) *sym, const char *symname)
-{
- return 0;
-}
-
-
static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
const char *symname)
{
@@ -848,12 +748,6 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
if (sym->st_shndx == SHN_UNDEF)
return 0;
- /*
- * Adjust the offset if this reloc applies to the percpu section.
- */
- if (sec->shdr.sh_info == per_cpu_shndx)
- offset += per_cpu_load_addr;
-
switch (r_type) {
case R_X86_64_NONE:
/* NONE can be ignored. */
@@ -863,32 +757,21 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
case R_X86_64_PLT32:
case R_X86_64_REX_GOTPCRELX:
/*
- * PC relative relocations don't need to be adjusted unless
- * referencing a percpu symbol.
+ * PC relative relocations don't need to be adjusted.
*
* NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32.
*/
- if (is_percpu_sym(sym, symname))
- add_reloc(&relocs32neg, offset);
break;
case R_X86_64_PC64:
/*
* Only used by jump labels
*/
- if (is_percpu_sym(sym, symname))
- die("Invalid R_X86_64_PC64 relocation against per-CPU symbol %s\n", symname);
break;
case R_X86_64_32:
case R_X86_64_32S:
case R_X86_64_64:
- /*
- * References to the percpu area don't need to be adjusted.
- */
- if (is_percpu_sym(sym, symname))
- break;
-
if (shn_abs) {
/*
* Whitelisted absolute symbols do not require
@@ -1101,7 +984,6 @@ static void emit_relocs(int as_text, int use_real_mode)
/* Order the relocations for more efficient processing */
sort_relocs(&relocs32);
#if ELF_BITS == 64
- sort_relocs(&relocs32neg);
sort_relocs(&relocs64);
#else
sort_relocs(&relocs16);
@@ -1133,13 +1015,6 @@ static void emit_relocs(int as_text, int use_real_mode)
/* Now print each relocation */
for (i = 0; i < relocs64.count; i++)
write_reloc(relocs64.offset[i], stdout);
-
- /* Print a stop */
- write_reloc(0, stdout);
-
- /* Now print each inverse 32-bit relocation */
- for (i = 0; i < relocs32neg.count; i++)
- write_reloc(relocs32neg.offset[i], stdout);
#endif
/* Print a stop */
@@ -1192,9 +1067,6 @@ void process(FILE *fp, int use_real_mode, int as_text,
read_symtabs(fp);
read_relocs(fp);
- if (ELF_BITS == 64)
- percpu_init();
-
if (show_absolute_syms) {
print_absolute_symbols();
return;
--
2.47.1
next prev parent reply other threads:[~2025-01-23 19:08 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-23 19:07 [PATCH v6 00/15] x86-64: Stack protector and percpu improvements Brian Gerst
2025-01-23 19:07 ` [PATCH v6 01/15] x86: Raise minimum GCC version to 8.1 Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] x86/build: Raise the " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 02/15] x86/stackprotector: Remove stack protector test scripts Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 03/15] x86/boot: Disable stack protector for early boot code Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 04/15] x86/pvh: Use fixed_percpu_data for early boot GSBASE Brian Gerst
2025-01-25 15:06 ` Borislav Petkov
2025-01-25 16:51 ` Brian Gerst
2025-01-26 3:57 ` Borislav Petkov
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-03-04 22:26 ` [PATCH v6 04/15] " Mateusz Guzik
2025-03-04 23:44 ` H. Peter Anvin
2025-03-04 23:49 ` Mateusz Guzik
2025-03-05 7:16 ` Uros Bizjak
2025-03-05 12:01 ` Mateusz Guzik
2025-01-23 19:07 ` [PATCH v6 05/15] x86/relocs: Handle R_X86_64_REX_GOTPCRELX relocations Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 06/15] x86/module: Deal with GOT based stack cookie load on Clang < 17 Brian Gerst
2025-02-18 9:07 ` Ingo Molnar
2025-02-18 14:05 ` Brian Gerst
2025-02-18 21:52 ` H. Peter Anvin
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Ard Biesheuvel
2025-01-23 19:07 ` [PATCH v6 07/15] x86/stackprotector/64: Convert to normal percpu variable Brian Gerst
2025-02-18 9:14 ` Ingo Molnar
2025-02-18 12:11 ` [tip: x86/asm] x86/stackprotector/64: Convert to normal per-CPU variable tip-bot2 for Brian Gerst
2025-02-19 19:59 ` [PATCH v6 07/15] x86/stackprotector/64: Convert to normal percpu variable Nathan Chancellor
2025-02-20 9:23 ` Ard Biesheuvel
2025-03-12 11:59 ` [tip: x86/asm] x86/stackprotector/64: Only export __ref_stack_chk_guard on CONFIG_SMP tip-bot2 for Ingo Molnar
2025-03-19 11:03 ` [tip: x86/core] " tip-bot2 for Ingo Molnar
2025-01-23 19:07 ` [PATCH v6 08/15] x86/percpu/64: Use relative percpu offsets Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 09/15] x86/percpu/64: Remove fixed_percpu_data Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` Brian Gerst [this message]
2025-02-18 12:11 ` [tip: x86/asm] x86/boot/64: Remove inverse relocations tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 11/15] x86/percpu/64: Remove INIT_PER_CPU macros Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 12/15] percpu: Remove PER_CPU_FIRST_SECTION Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 13/15] percpu: Remove PERCPU_VADDR() Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 14/15] percpu: Remove __per_cpu_load Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 15/15] kallsyms: Remove KALLSYMS_ABSOLUTE_PERCPU Brian Gerst
2025-02-18 12:11 ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-02-18 9:22 ` [PATCH v6 00/15] x86-64: Stack protector and percpu improvements Ingo Molnar
2025-02-18 17:46 ` Uros Bizjak
2025-02-19 11:47 ` Ingo Molnar
2025-02-19 13:18 ` Brian Gerst
2025-02-20 9:51 ` Uros Bizjak
2025-02-20 10:05 ` Ard Biesheuvel
2025-02-20 10:46 ` Uros Bizjak
2025-02-20 10:52 ` Ard Biesheuvel
2025-02-20 10:56 ` Uros Bizjak
2025-02-20 17:24 ` Brian Gerst
2025-02-20 17:35 ` Ard Biesheuvel
2025-02-20 17:47 ` Brian Gerst
2025-02-20 17:59 ` Brian Gerst
2025-02-20 20:09 ` Uros Bizjak
2025-02-20 13:26 ` Ingo Molnar
2025-02-20 17:05 ` Brian Gerst
2025-02-22 12:25 ` Ingo Molnar
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=20250123190747.745588-11-brgerst@gmail.com \
--to=brgerst@gmail.com \
--cc=ardb@kernel.org \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=tglx@linutronix.de \
--cc=ubizjak@gmail.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox