[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87a6s3uu3y.fsf@mpe.ellerman.id.au>
Date: Wed, 17 Feb 2021 16:43:45 +1100
From: Michael Ellerman <mpe@...erman.id.au>
To: Segher Boessenkool <segher@...nel.crashing.org>
Cc: Feng Tang <feng.tang@...el.com>,
Christophe Leroy <christophe.leroy@...roup.eu>,
lkp <lkp@...el.com>,
"kbuild-all@...ts.01.org" <kbuild-all@...ts.01.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: Re: {standard input}:577: Error: unsupported relocation against base
Segher Boessenkool <segher@...nel.crashing.org> writes:
> Hi!
>
> On Tue, Feb 16, 2021 at 08:36:02PM +1100, Michael Ellerman wrote:
>> Feng Tang <feng.tang@...el.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
Powered by blists - more mailing lists