Re: [PATCH v2] mips: lib: uncached: fix non-standard usage of variable 'sp'

From: Nathan Chancellor
Date: Sat Dec 12 2020 - 00:54:09 EST


On Fri, Dec 11, 2020 at 07:54:07PM +0000, Maciej W. Rozycki wrote:
> On Fri, 11 Dec 2020, Anders Roxell wrote:
>
> > diff --git a/arch/mips/lib/uncached.c b/arch/mips/lib/uncached.c
> > index 09d5deea747f..f80a67c092b6 100644
> > --- a/arch/mips/lib/uncached.c
> > +++ b/arch/mips/lib/uncached.c
> > @@ -37,10 +37,12 @@
> > */
> > unsigned long run_uncached(void *func)
> > {
> > - register long sp __asm__("$sp");
> > register long ret __asm__("$2");
> > long lfunc = (long)func, ufunc;
> > long usp;
> > + long sp;
> > +
> > + __asm__("move %0, $sp" : "=r" (sp));
>
> I thought it might be better to make `sp' global instead, so that it's
> the compiler that chooses how to schedule accesses. Have you tried that?
>
> Maciej

This will not work, as the LLVM Mips backend does not support using $sp
as a global register variable:

https://github.com/llvm/llvm-project/commit/1440bb2a26ff13df1b29762658ee122cc0bc47ae

$ make -skj"$(nproc)" ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- LLVM=1 O=out \
distclean malta_kvm_guest_defconfig vmlinux
fatal error: error in backend: Invalid register name global variable
...

Cheers,
Nathan