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;
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.