This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Stash reent marker in upper bits of s1 on AMD GCN


On Nov  7 14:46, Kwok Cheung Yeung wrote:
> s[0:3] contain a descriptor used to set up the initial value of the
> stack, but only the lower 48 bits of s[0:1] are currently used.
> The reent marker is currently set in s3, but by stashing it in the
> upper 16 bits of s[0:1] instead, s3 can be freed up for other purposes.
> ---
>  newlib/libc/machine/amdgcn/getreent.c | 20 ++++++++++----------
>  1 file changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/newlib/libc/machine/amdgcn/getreent.c b/newlib/libc/machine/amdgcn/getreent.c
> index bc50ca0..be7d2ed 100644
> --- a/newlib/libc/machine/amdgcn/getreent.c
> +++ b/newlib/libc/machine/amdgcn/getreent.c
> @@ -34,7 +34,7 @@ __getreent (void)
>       s11 contains the offset to the base of the stack.
>       s[4:5] contains the dispatch pointer.
>       
> -     WARNING: this code will break if s[0:3] is ever used for anything!  */
> +     WARNING: this code will break if s[0:1] is ever used for anything!  */
>    const register unsigned long buffer_descriptor asm("s0");
>    unsigned long private_segment = buffer_descriptor & 0x0000ffffffffffff;
>    const register unsigned int stack_offset asm("s11");
> @@ -54,20 +54,20 @@ __getreent (void)
>    if (sp >= addr)
>      goto stackoverflow;
>  
> -  /* Place a marker in s3 to indicate that the reent data is initialized.
> -     The register is known to hold part of an unused buffer descriptor
> -     when the kernel is launched.  This may not be unused forever, but
> -     we already used s0 and s1 above, so this doesn't do extra harm.  */
> -  register int s3 asm("s3");
> -  if (s3 != 123456)
> +  /* Stash a marker in the unused upper 16 bits of s[0:1] to indicate that
> +     the reent data is initialized.  */
> +  const register unsigned int s1 asm("s1");
> +  unsigned int marker = s1 >> 16;
> +  if (marker != 12345)
>      {
> -      asm("s_mov_b32 s3, 123456");
> -      data->marker = 123456;
> +      asm("s_and_b32\ts1, s1, 0xffff");
> +      asm("s_or_b32\ts1, s1, (12345 << 16)");
> +      data->marker = 12345;
>  
>        __builtin_memset (&data->reent, 0, sizeof(struct _reent));
>        _REENT_INIT_PTR_ZEROED (&data->reent);
>      }
> -  else if (data->marker != 123456)
> +  else if (data->marker != 12345)
>      goto stackoverflow;
>  
>  
> -- 
> 2.8.1

Pushed.


Thanks,
Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat

Attachment: signature.asc
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]