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

Reply via email to