Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Tue, 29 May 2018 16:08:24 -0700
From: Thomas Garnier <>
To: Christoph Lameter <>
Cc: Kernel Hardening <>, 
	Dave Hansen <>, Vitaly Kuznetsov <>, 
	Tom Lendacky <>, 
	Skip Mathieu Desnoyers <>, 
	Skip Frederic Weisbecker <>, Nicholas Piggin <>, 
	Kees Cook <>, Thomas Gleixner <>, 
	Ingo Molnar <>, "H . Peter Anvin" <>, 
	"the arch/x86 maintainers" <>, Tejun Heo <>, Dennis Zhou <>, 
	Boris Ostrovsky <>, Juergen Gross <>, 
	Dominik Brodowski <>, Borislav Petkov <>, 
	Josh Poimboeuf <>, Andy Lutomirski <>, 
	Peter Zijlstra <>, 
	"Kirill A. Shutemov" <>, Andrew Morton <>, 
	Philippe Ombredanne <>, Greg KH <>, 
	Alexey Dobriyan <>, 
	Francis Deslauriers <>, 
	Masahiro Yamada <>, Cao jin <>, 
	Masami Hiramatsu <>, "Paul E . McKenney" <>, 
	Nicolas Pitre <>, Randy Dunlap <>, 
	LKML <>, xen-devel <>
Subject: Re: [PATCH v4 14/27] x86/percpu: Adapt percpu for PIE support

On Tue, May 29, 2018 at 3:46 PM Christopher Lameter <> wrote:

> On Tue, 29 May 2018, Thomas Garnier wrote:

> > Perpcu uses a clever design where the .percu ELF section has a virtual
> > address of zero and the relocation code avoid relocating specific
> > symbols. It makes the code simple and easily adaptable with or without
> > SMP support.
> >
> > This design is incompatible with PIE because generated code always try
> > access the zero virtual address relative to the default mapping address.

> We always access relative to the "segment register".

> You can already change the segment register to relocate the per cpu
> sections arbitrarily since all per cpu "addresses" are offsets relative to
> the segment register. I am not sure what exactly you are trying to
> accomplish here?

When building with PIE, the compiler wants the code to be relocatable
anywhere in the 64-bit VA space. Instead of taking the segment register as
an immediate value, it takes it as VA that need to be relocated relative to
where the kernel is mapped. The per-cpu section VA is zero to create the
proper offset to the different variable. The kernel could be at the top of
the 64-bit VA space. PIE will try to create the delta between any VA and
zero and fail because segment register based operations do not have full
64-bit VA range. Does it make sense?

For PIE only, this change will remove the per-cpu section VA of zero. Now
the distance between the per-cpu symbol and the kernel base VA can fit in
the generated instructions.

> Maybe you need to explain it better?

I will try do explain it better on the next patch set.


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.