Messages in this thread Patch in this message | | | From | Michael Ellerman <> | Subject | Re: {standard input}:577: Error: unsupported relocation against base | Date | Wed, 17 Feb 2021 16:43:45 +1100 |
| |
Segher Boessenkool <segher@kernel.crashing.org> writes: > Hi! > > On Tue, Feb 16, 2021 at 08:36:02PM +1100, Michael Ellerman wrote: >> Feng Tang <feng.tang@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.
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.
cheers
| |