[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.DEB.2.21.2502161523290.65342@angie.orcam.me.uk>
Date: Sun, 16 Feb 2025 15:41:55 +0000 (GMT)
From: "Maciej W. Rozycki" <macro@...am.me.uk>
To: Thomas Weißschuh <linux@...ssschuh.net>
cc: Willy Tarreau <w@....eu>, Shuah Khan <shuah@...nel.org>,
Thomas Bogendoerfer <tsbogend@...ha.franken.de>,
linux-kernel@...r.kernel.org, linux-kselftest@...r.kernel.org,
linux-mips@...r.kernel.org, llvm@...ts.linux.dev
Subject: Re: [PATCH] tools/nolibc: add support for N64 and N32 ABIs
On Wed, 12 Feb 2025, Thomas Weißschuh wrote:
> diff --git a/tools/include/nolibc/arch-mips.h b/tools/include/nolibc/arch-mips.h
> index 753a8ed2cf695f0b5eac4b5e4d317fdb383ebf93..638520a3427a985fdbd5f5a49b55853bbadeee75 100644
> --- a/tools/include/nolibc/arch-mips.h
> +++ b/tools/include/nolibc/arch-mips.h
> @@ -190,13 +257,33 @@ void __attribute__((weak, noreturn)) __nolibc_entrypoint __no_stack_protector __
> "1:\n"
> ".cpload $ra\n"
> "move $a0, $sp\n" /* save stack pointer to $a0, as arg1 of _start_c */
> +
> +#if defined(_ABIO32)
> "addiu $sp, $sp, -4\n" /* space for .cprestore to store $gp */
> ".cprestore 0\n"
> "li $t0, -8\n"
> "and $sp, $sp, $t0\n" /* $sp must be 8-byte aligned */
> "addiu $sp, $sp, -16\n" /* the callee expects to save a0..a3 there */
> - "lui $t9, %hi(_start_c)\n" /* ABI requires current function address in $t9 */
> +#else
> + "daddiu $sp, $sp, -8\n" /* space for .cprestore to store $gp */
> + ".cpsetup $ra, 0, 1b\n"
> + "li $t0, -16\n"
> + "and $sp, $sp, $t0\n" /* $sp must be 16-byte aligned */
> +#endif
Why is this code breaking stack alignment just to have to fix it up two
instructions down the line? Or is it that the incoming $sp is not aligned
in the first place (in which case we're having a deeper problem).
> +
> + /* ABI requires current function address in $t9 */
> +#if defined(_ABIO32) || defined(_ABIN32)
> + "lui $t9, %hi(_start_c)\n"
> "ori $t9, %lo(_start_c)\n"
> +#else
> + "lui $t9, %highest(_start_c)\n"
> + "ori $t9, %higher(_start_c)\n"
> + "dsll $t9, 0x10\n"
> + "ori $t9, %hi(_start_c)\n"
> + "dsll $t9, 0x10\n"
> + "ori $t9, %lo(_start_c)\n"
This could be optimised using a temporary (e.g. $at, but I guess any will
do as I gather we don't have any ABI abnormalities here).
> +#endif
> +
> "jalr $t9\n" /* transfer to c runtime
> */
> " nop\n" /* delayed slot
On an unrelated matter JALR above ought to be JAL (or otherwise there's
no point in using the .cprestore pseudo-op). And I fail to see why this
code has to be "noreorder" (except for the .cpload piece, of course), it's
just asking for troubles.
Maciej
Powered by blists - more mailing lists