Re: [PATCH] Enable '-Werror' by default for all kernel builds

From: Guenter Roeck
Date: Wed Sep 08 2021 - 08:42:37 EST


On 9/8/21 2:50 AM, Arnd Bergmann wrote:
On Wed, Sep 8, 2021 at 9:49 AM Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> wrote:
On Wed, Sep 8, 2021 at 7:16 AM Guenter Roeck <linux@xxxxxxxxxxxx> wrote:
On 9/7/21 9:48 PM, Al Viro wrote:
On Tue, Sep 07, 2021 at 09:28:38PM -0700, Guenter Roeck wrote:
memcpy(eth_addr, sanitize_address((void *) 0xfffc1f2c), ETH_ALEN);

but that just seems weird. Is there a better solution ?

(char (*)[ETH_ALEN])? Said that, shouldn't that be doing something like
ioremap(), rather than casting explicit constants?

Typecasts or even assigning the address to a variable does not help.
The sanitizer function can not be static either.

So it can only be fixed by obfuscating the constant address in a
chain of out-of-line functions...
How is this compiler to be used for bare-metal programming?

I reported this as a gcc bug when I first saw it back in March:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578

Martin Sebor suggested marking the pointer as 'volatile' as a workaround,
which is probably fine for bare-metal programming, but I would consider
that bad style for the kernel boot arguments. The RELOC_HIDE trick is probably
fine here, as there are only a couple of instances, and for the network
driver, using volatile is probably appropriate as well.

I still hope this can be fixed in a future gcc-11.x release. Maybe we should
add further instances of the problem on the gcc bug to boost the priority?

I don't know the hardware, so I can not answer the ioremap() question.

Yes it should. But this driver dates back to 2.1.110, when only
half of the architectures already had ioremap().

How does mvme16x even create the mapping? Is this a virtual address
that is hardwired to the bus or do you have a static mapping somewhere?
I see two other drivers accessing the nvram here

arch/m68k/mvme16x/config.c:static MK48T08ptr_t volatile rtc =
(MK48T08ptr_t)MVME_RTC_BASE;

Is that even correct ? I am always shaky with qualifiers, but doesn't
that mean that the pointer is volatile, not the object it points to ?

arch/m68k/mvme16x/rtc.c: volatile MK48T08ptr_t rtc =
(MK48T08ptr_t)MVME_RTC_BASE;

The same trick should work here, just create a local variable with a
volatile pointer and read from that.


I had tried that; it doesn't work because then the compiler complains
that the 'volatile' qualifier is discarded when passing the argument.

drivers/net/ethernet/i825xx/82596.c: In function 'i82596_probe':
drivers/net/ethernet/i825xx/82596.c:1147:34: error:
passing argument 2 of '__builtin_memcpy' discards 'volatile' qualifier from pointer target type

Oddly enough, a memcpy on the 'rtc' variable doesn't fail,
neither with nor without volatile. Something else is going on.

Guenter