Re: {standard input}:577: Error: unsupported relocation against base

From: Michael Ellerman
Date: Wed Feb 17 2021 - 00:44:38 EST


Segher Boessenkool <segher@xxxxxxxxxxxxxxxxxxx> writes:
> Hi!
>
> On Tue, Feb 16, 2021 at 08:36:02PM +1100, Michael Ellerman wrote:
>> Feng Tang <feng.tang@xxxxxxxxx> 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