Messages in this thread | | | From | Andy Lutomirski <> | Date | Sat, 2 Feb 2019 09:17:22 -0800 | Subject | Re: [PATCH v5 08/13] x86/fsgsbase/64: Introduce the FIND_PERCPU_BASE macro |
| |
On Fri, Feb 1, 2019 at 12:55 PM Chang S. Bae <chang.seok.bae@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 <hpa@zytor.com> > Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com> > Cc: Andy Lutomirski <luto@kernel.org> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Ingo Molnar <mingo@kernel.org> > Cc: Dave Hansen <dave.hansen@linux.intel.com> > Cc: Andi Kleen <ak@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.
| |