public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Khem Raj <raj.khem@gmail.com>
To: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Cc: libc-alpha@sourceware.org
Subject: Re: [PATCH] mips: FIx clone3 implementation (BZ 31325)
Date: Thu, 1 Feb 2024 16:06:31 -0800	[thread overview]
Message-ID: <CAMKF1soLOpbJQYPbpNq5YG12F8mnvd5C8jFYdBGJMC8p9CfUsA@mail.gmail.com> (raw)
In-Reply-To: <20240201174103.798138-1-adhemerval.zanella@linaro.org>

On Thu, Feb 1, 2024 at 9:41 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> For o32 we need to setup a minimal stack frame to allow cprestore
> on __thread_start_clone3 (which instruct the linker to save the
> gp for PIC).  Also, there is no guarantee by kABI that $8 will be
> preserved after syscall execution, so we need to save it on the
> provided stack.
>
> Checked on mipsel-linux-gnu.

works ok on yocto reference mips ( Big-endian ) ( mips-linux-gnu )

Tested-by: Khem Raj <raj.khem@gmail.com>

>
> Reported-by: Khem Raj <raj.khem@gmail.com>
> ---
>  sysdeps/unix/sysv/linux/mips/clone3.S | 32 ++++++++++++++++++++++-----
>  1 file changed, 27 insertions(+), 5 deletions(-)
>
> diff --git a/sysdeps/unix/sysv/linux/mips/clone3.S b/sysdeps/unix/sysv/linux/mips/clone3.S
> index e9fec2fa47..481b8ae963 100644
> --- a/sysdeps/unix/sysv/linux/mips/clone3.S
> +++ b/sysdeps/unix/sysv/linux/mips/clone3.S
> @@ -37,11 +37,6 @@
>
>         .text
>         .set            nomips16
> -#if _MIPS_SIM == _ABIO32
> -# define EXTRA_LOCALS 1
> -#else
> -# define EXTRA_LOCALS 0
> -#endif
>  #define FRAMESZ ((NARGSAVE*SZREG)+ALSZ)&ALMASK
>  GPOFF= FRAMESZ-(1*SZREG)
>  NESTED(__clone3, SZREG, sp)
> @@ -68,8 +63,31 @@ NESTED(__clone3, SZREG, sp)
>         beqz    a0, L(error)    /* No NULL cl_args pointer.  */
>         beqz    a2, L(error)    /* No NULL function pointer.  */
>
> +#if _MIPS_SIM == _ABIO32
> +       /* Both stack and stack_size on clone_args are defined as uint64_t, and
> +          there is no need to handle values larger than to 32 bits for o32.  */
> +# if __BYTE_ORDER == __BIG_ENDIAN
> +#  define CL_STACKPOINTER_OFFSET  44
> +#  define CL_STACKSIZE_OFFSET     52
> +# else
> +#  define CL_STACKPOINTER_OFFSET  40
> +#  define CL_STACKSIZE_OFFSET     48
> +# endif
> +
> +       /* For o32 we need to setup a minimal stack frame to allow cprestore
> +          on __thread_start_clone3.  Also there is no guarantee by kABI that
> +          $8 will be preserved after syscall execution (so we need to save it
> +          on the provided stack).  */
> +       lw      t0, CL_STACKPOINTER_OFFSET(a0)  /* Load the stack pointer.  */
> +       lw      t1, CL_STACKSIZE_OFFSET(a0)     /* Load the stack_size.  */
> +       addiu   t1, -32                         /* Update the stack size.  */
> +       addu    t2, t1, t0                      /* Calculate the thread stack.  */
> +       sw      a3, 0(t2)                       /* Save argument pointer.  */
> +       sw      t1, CL_STACKSIZE_OFFSET(a0)     /* Save the new stack size.  */
> +#else
>         move    $8, a3          /* a3 is set to 0/1 for syscall success/error
>                                    while a4/$8 is returned unmodified.  */
> +#endif
>
>         /* Do the system call, the kernel expects:
>            v0: system call number
> @@ -125,7 +143,11 @@ L(thread_start_clone3):
>
>         /* Restore the arg for user's function.  */
>         move            t9, a2          /* Function pointer.  */
> +#if _MIPS_SIM == _ABIO32
> +       PTR_L           a0, 0(sp)
> +#else
>         move            a0, $8          /* Argument pointer.  */
> +#endif
>
>         /* Call the user's function.  */
>         jal             t9
> --
> 2.34.1
>

  reply	other threads:[~2024-02-02  0:06 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-01 17:41 Adhemerval Zanella
2024-02-02  0:06 ` Khem Raj [this message]
2024-02-02 13:28   ` Adhemerval Zanella Netto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAMKF1soLOpbJQYPbpNq5YG12F8mnvd5C8jFYdBGJMC8p9CfUsA@mail.gmail.com \
    --to=raj.khem@gmail.com \
    --cc=adhemerval.zanella@linaro.org \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).