lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ