mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
x86/percpu: Use %RIP-relative address in untagged_addr()
%RIP-relative addresses are nowadays correctly handled in alternative instructions, so remove misleading comment and improve assembly to use %RIP-relative address. Also, explicitly using %gs: prefix will segfault for non-SMP builds. Use macros from percpu.h which will DTRT with segment prefix register as far as SMP/non-SMP builds are concerned. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradaed.org> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/all/20231213150357.5942-1-ubizjak%40gmail.com
This commit is contained in:
parent
86ed430cf5
commit
de8c6a3521
|
|
@ -11,6 +11,7 @@
|
|||
#include <asm/alternative.h>
|
||||
#include <asm/cpufeatures.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/percpu.h>
|
||||
|
||||
#ifdef CONFIG_ADDRESS_MASKING
|
||||
/*
|
||||
|
|
@ -18,14 +19,10 @@
|
|||
*/
|
||||
static inline unsigned long __untagged_addr(unsigned long addr)
|
||||
{
|
||||
/*
|
||||
* Refer tlbstate_untag_mask directly to avoid RIP-relative relocation
|
||||
* in alternative instructions. The relocation gets wrong when gets
|
||||
* copied to the target place.
|
||||
*/
|
||||
asm (ALTERNATIVE("",
|
||||
"and %%gs:tlbstate_untag_mask, %[addr]\n\t", X86_FEATURE_LAM)
|
||||
: [addr] "+r" (addr) : "m" (tlbstate_untag_mask));
|
||||
"and " __percpu_arg([mask]) ", %[addr]", X86_FEATURE_LAM)
|
||||
: [addr] "+r" (addr)
|
||||
: [mask] "m" (__my_cpu_var(tlbstate_untag_mask)));
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user