Hi! On Wed, Feb 17, 2021 at 04:43:45PM +1100, Michael Ellerman wrote: > Segher Boessenkool <seg...@kernel.crashing.org> writes: > > On Tue, Feb 16, 2021 at 08:36:02PM +1100, Michael Ellerman wrote: > >> Feng Tang <feng.t...@intel.com> writes: > >> > {standard input}:577: Error: unsupported relocation against base > >> > {standard input}:580: Error: unsupported relocation against base > >> > {standard input}:583: Error: unsupported relocation against base > > > >> > The reason is macro 'mfdcr' requirs an instant number as parameter, > >> > which is not met by show_plbopb_regs(). > >> > >> It doesn't require a constant, it checks if the argument is constant: > >> > >> #define mfdcr(rn) \ > >> ({unsigned int rval; \ > >> if (__builtin_constant_p(rn) && rn < 1024) \ > >> asm volatile("mfdcr %0," __stringify(rn) \ > >> : "=r" (rval)); \ > >> else if (likely(cpu_has_feature(CPU_FTR_INDEXED_DCR))) \ > >> rval = mfdcrx(rn); \ > >> else \ > >> rval = __mfdcr(rn); \ > >> rval;}) > > > > It requires a constant number with known (at compile time) value, while > > __builtin_constant_p checks for any constant. The address of some > > defined symbol is a constant as well normally, for example. > > > > It's better to write that asm as > > asm volatile("mfdcr %0,%1" : "=r" (rval) : "n"(rn)); > > btw (the "n" constraint means "constant integer with known value" (it > > stands for "numeric"), while the "i" constraint means just "constant > > integer"). > > Actually that fixes it.
Huh interesting. I was going to suggest to use __is_constexpr instead, but that should return true for slightly fewer expressions (but probably still okay in this case). > diff --git a/arch/powerpc/include/asm/dcr-native.h > b/arch/powerpc/include/asm/dcr-native.h > index 7141ccea8c94..d143308b0f95 100644 > --- a/arch/powerpc/include/asm/dcr-native.h > +++ b/arch/powerpc/include/asm/dcr-native.h > @@ -53,8 +53,8 @@ static inline void mtdcrx(unsigned int reg, unsigned int > val) > #define mfdcr(rn) \ > ({unsigned int rval; \ > if (__builtin_constant_p(rn) && rn < 1024) \ > - asm volatile("mfdcr %0," __stringify(rn) \ > - : "=r" (rval)); \ > + asm volatile("mfdcr %0, %1" : "=r" (rval) \ > + : "n" (rn)); \ > else if (likely(cpu_has_feature(CPU_FTR_INDEXED_DCR))) \ > rval = mfdcrx(rn); \ > else \ > > > I guess because we give the compiler time to work out the constant, > rather than stringifying it immediately. Yeah, this is not preprocessor magic, the compiler actually does its thing here. It still won't work if the compiler cannot reduce the expression to a number (but it does see it is constant), but that is the best you can do here probably. Segher