From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Jan Beulich <jbeulich@suse.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: [PATCH 3.18 19/24] x86-64: Handle PC-relative relocations on per-CPU data
Date: Thu, 31 Aug 2017 17:43:55 +0200 [thread overview]
Message-ID: <20170831154106.133995386@linuxfoundation.org> (raw)
In-Reply-To: <20170831154105.116844281@linuxfoundation.org>
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Beulich <JBeulich@suse.com>
commit 6d24c5f72dfb26e5fa7f02fa9266dfdbae41adba upstream.
This is in preparation of using RIP-relative addressing in many of the
per-CPU accesses.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Link: http://lkml.kernel.org/r/5458A15A0200007800044A9A@mail.emea.novell.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/x86/boot/compressed/misc.c | 14 +++++++++++++-
arch/x86/tools/relocs.c | 38 ++++++++++++++++++++++++++++----------
2 files changed, 41 insertions(+), 11 deletions(-)
--- a/arch/x86/boot/compressed/misc.c
+++ b/arch/x86/boot/compressed/misc.c
@@ -260,7 +260,7 @@ static void handle_relocations(void *out
/*
* Process relocations: 32 bit relocations first then 64 bit after.
- * Two sets of binary relocations are added to the end of the kernel
+ * Three 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.
@@ -270,6 +270,8 @@ static void handle_relocations(void *out
* 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
*
@@ -286,6 +288,16 @@ static void handle_relocations(void *out
*(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;
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -20,7 +20,10 @@ struct relocs {
static struct relocs relocs16;
static struct relocs relocs32;
+#if ELF_BITS == 64
+static struct relocs relocs32neg;
static struct relocs relocs64;
+#endif
struct section {
Elf_Shdr shdr;
@@ -762,11 +765,16 @@ static int do_reloc64(struct section *se
switch (r_type) {
case R_X86_64_NONE:
+ /* NONE can be ignored. */
+ break;
+
case R_X86_64_PC32:
/*
- * NONE can be ignored and PC relative relocations don't
- * need to be adjusted.
+ * PC relative relocations don't need to be adjusted unless
+ * referencing a percpu symbol.
*/
+ if (is_percpu_sym(sym, symname))
+ add_reloc(&relocs32neg, offset);
break;
case R_X86_64_32:
@@ -986,7 +994,10 @@ static void emit_relocs(int as_text, int
/* Order the relocations for more efficient processing */
sort_relocs(&relocs16);
sort_relocs(&relocs32);
+#if ELF_BITS == 64
+ sort_relocs(&relocs32neg);
sort_relocs(&relocs64);
+#endif
/* Print the relocations */
if (as_text) {
@@ -1007,14 +1018,21 @@ static void emit_relocs(int as_text, int
for (i = 0; i < relocs32.count; i++)
write_reloc(relocs32.offset[i], stdout);
} else {
- if (ELF_BITS == 64) {
- /* Print a stop */
- write_reloc(0, stdout);
-
- /* Now print each relocation */
- for (i = 0; i < relocs64.count; i++)
- write_reloc(relocs64.offset[i], stdout);
- }
+#if ELF_BITS == 64
+ /* Print a stop */
+ write_reloc(0, stdout);
+
+ /* 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 */
write_reloc(0, stdout);
next prev parent reply other threads:[~2017-08-31 15:44 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-31 15:43 [PATCH 3.18 00/24] 3.18.69-stable review Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 01/24] scsi: isci: avoid array subscript warning Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 02/24] ALSA: au88x0: Fix zero clear of stream->resources Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 03/24] gcov: add support for GCC 5.1 Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 04/24] gcov: add support for gcc version >= 6 Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 05/24] gcov: support GCC 7.1 Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 06/24] p54: memset(0) whole array Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 07/24] arm64: mm: abort uaccess retries upon fatal signal Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 08/24] lib: bitmap: add alignment offset for bitmap_find_next_zero_area() Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 09/24] mm: cma: align to physical address, not CMA region position Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 10/24] mm/cma: make kmemleak ignore CMA regions Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 11/24] mm: cma: split cma-reserved in dmesg log Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 12/24] mm: cma: fix totalcma_pages to include DT defined CMA regions Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 13/24] mm: cma: fix CMA aligned offset calculation Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 14/24] mm: cma: constify and use correct signness in mm/cma.c Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 15/24] mm: cma: fix incorrect type conversion for size during dma allocation Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 17/24] arm64: flush FP/SIMD state correctly after execve() Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 18/24] arm64: fpsimd: Prevent registers leaking across exec Greg Kroah-Hartman
2017-08-31 15:43 ` Greg Kroah-Hartman [this message]
2017-08-31 15:43 ` [PATCH 3.18 21/24] clk: si5351: Constify clock names and struct regmap_config Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 22/24] scsi: sg: protect accesses to reserved page array Greg Kroah-Hartman
2017-08-31 15:43 ` [PATCH 3.18 23/24] scsi: sg: reset res_in_use after unlinking reserved array Greg Kroah-Hartman
2017-08-31 15:44 ` [PATCH 3.18 24/24] f2fs: do more integrity verification for superblock Greg Kroah-Hartman
2017-08-31 16:33 ` Greg Kroah-Hartman
2017-08-31 19:06 ` [PATCH 3.18 00/24] 3.18.69-stable review Shuah Khan
2017-08-31 19:37 ` Guenter Roeck
2017-09-01 2:30 ` Guenter Roeck
2017-09-01 5:02 ` Greg Kroah-Hartman
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=20170831154106.133995386@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=jbeulich@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=tglx@linutronix.de \
/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