On Fri, Feb 1, 2019 at 12:55 PM Chang S. Bae <chang.seok....@intel.com> wrote: > > GSBASE is used to find per-CPU data in the kernel. But when it is unknown, > the per-CPU base can be found from the per_cpu_offset table with a CPU NR. > The CPU NR is extracted from the limit field of the CPUNODE entry in GDT, > or by the RDPID instruction. > > Also, add the GAS-compatible RDPID macro. > > The new macro will be used on a following patch. > > Suggested-by: H. Peter Anvin <h...@zytor.com> > Signed-off-by: Chang S. Bae <chang.seok....@intel.com> > Cc: Andy Lutomirski <l...@kernel.org> > Cc: Thomas Gleixner <t...@linutronix.de> > Cc: Ingo Molnar <mi...@kernel.org> > Cc: Dave Hansen <dave.han...@linux.intel.com> > Cc: Andi Kleen <a...@linux.intel.com> > --- > arch/x86/include/asm/fsgsbase.h | 46 +++++++++++++++++++++++++++++++++ > arch/x86/include/asm/inst.h | 15 +++++++++++ > 2 files changed, 61 insertions(+) > > diff --git a/arch/x86/include/asm/fsgsbase.h b/arch/x86/include/asm/fsgsbase.h > index aefd53767a5d..eecca2250748 100644 > --- a/arch/x86/include/asm/fsgsbase.h > +++ b/arch/x86/include/asm/fsgsbase.h > @@ -78,6 +78,52 @@ extern void x86_gsbase_write_cpu_inactive(unsigned long > gsbase); > > #endif /* CONFIG_X86_64 */ > > +#else /* __ASSEMBLY__ */ > + > +#ifdef CONFIG_X86_64 > + > +#include <asm/inst.h> > + > +#if CONFIG_SMP
ifdef? > + > +/* > + * CPU/node NR is loaded from the limit (size) field of a special segment > + * descriptor entry in GDT. > + */ > +.macro LOAD_CPU_AND_NODE_SEG_LIMIT reg:req > + movq $__CPUNODE_SEG, \reg > + lsl \reg, \reg > +.endm > + Please put the alternative in here instead of in FIND_PERCPU_BASE. > +/* > + * Fetch the per-CPU GSBASE value for this processor and put it in @reg. > + * We normally use %gs for accessing per-CPU data, but we are setting up > + * %gs here and obviously can not use %gs itself to access per-CPU data. > + */ > +.macro FIND_PERCPU_BASE reg:req > + /* > + * The CPU/node NR is initialized earlier, directly in cpu_init(). > + * The CPU NR is extracted from it. > + */ This comment is unnecessary. > + ALTERNATIVE \ > + "LOAD_CPU_AND_NODE_SEG_LIMIT \reg", \ > + "RDPID \reg", \ > + X86_FEATURE_RDPID > + andq $VDSO_CPUNODE_MASK, \reg > + movq __per_cpu_offset(, \reg, 8), \reg > +.endm > + > +#else > + > +.macro FIND_PERCPU_BASE reg:req > + /* Tracking the base offset value */ I don't understand this comment at all. Please just remove it.