[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20181219190145.252035-1-ndesaulniers@google.com>
Date: Wed, 19 Dec 2018 11:01:43 -0800
From: ndesaulniers@...gle.com
To: bp@...en8.de
Cc: rafael@...indo.la, x86@...nel.org, tglx@...utronix.de,
mingo@...hat.com, morbo@...gle.com, dima@...ovin.in, hpa@...or.com,
matz@...e.de, Tri Vo <trong@...roid.com>,
Nick Desaulniers <ndesaulniers@...gle.com>,
Brijesh Singh <brijesh.singh@....com>,
Masami Hiramatsu <mhiramat@...nel.org>,
Andy Lutomirski <luto@...nel.org>,
Joerg Roedel <jroedel@...e.de>,
Cao jin <caoj.fnst@...fujitsu.com>,
Masahiro Yamada <yamada.masahiro@...ionext.com>,
linux-kernel@...r.kernel.org
Subject: [PATCH v2] x86/build: Mark per-cpu symbols as absolute
From: Rafael Ávila de Espíndola <rafael@...indo.la>
The kernel has many variables that it wants to have per CPU. It is
similar to how each thread wants a copy of a thread local variable.
To access such variable, the code has to find the offset of that
variable in the per cpu block and add it to the address of the current
brock for that cpu.
Section 3.10.8 of ld.bfd's documentation states:
```
For expressions involving numbers, relative addresses and absolute
addresses, ld follows these rules to evaluate terms:
Other binary operations, that is, between two relative addresses
not in the same section, or between a relative address and an
absolute address, first convert any non-absolute term to an
absolute address before applying the operator."
```
Note that ld.lld does not implement this behavior. Instead, we can
explicitly mark non-absolute terms ABSOLUTE via linker script. This is
no functional change for ld.bfd which coverts the term to ABSOLUTE
anyways as specified above.
Reported-by: Dmitry Golovin <dima@...ovin.in>
Tested-by: Dmitry Golovin <dima@...ovin.in>
Suggested-by: Borislav Petkov <bp@...en8.de>
Suggested-by: Michael Matz <matz@...e.de>
Signed-off-by: Tri Vo <trong@...roid.com>
Signed-off-by: Nick Desaulniers <ndesaulniers@...gle.com>
Signed-off-by: Rafael Ávila de Espíndola <rafael@...indo.la>
[nd: commit message updated as per Boris' and Michael's sugguestions]
---
Changes from v1 -> v2: commit message updated
arch/x86/kernel/vmlinux.lds.S | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
index 0d618ee634ac..ee3b5c7d662e 100644
--- a/arch/x86/kernel/vmlinux.lds.S
+++ b/arch/x86/kernel/vmlinux.lds.S
@@ -401,7 +401,7 @@ SECTIONS
* Per-cpu symbols which need to be offset from __per_cpu_load
* for the boot processor.
*/
-#define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load
+#define INIT_PER_CPU(x) init_per_cpu__##x = ABSOLUTE(x) + __per_cpu_load
INIT_PER_CPU(gdt_page);
INIT_PER_CPU(irq_stack_union);
--
2.20.1.415.g653613c723-goog
Powered by blists - more mailing lists