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

Corinna Vinschen <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
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
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEoVYPmneWZnwT6kwF9TYGna5ET6AFAl3FNs0ACgkQ9TYGna5E
T6CN1A/+KtDNv8PrHksriF5NlVLwCpCVKb3hQf3x5JeQNJyZo5M+Q4qOuJxeQdUS
HGEanUwFw+Te1r9/9O2qpiFq6N2sCyohoLh8kUiDG19b1PYQikIVBy2eIqiZsN9b
ahFExuJ3Np3bco7aEy2PSPTI2YJ83lLiH5Jyv2L8DNKuGcfqYonjEuDYUguszvik
Ofv9Ijytv90dCcl/uMikuNo69wq4koxOTcL5vYBX91M9GC279qPgvvj3x6Cp6e/w
OCQ4q6ElT/6/HsaTe+6e0M7rWpDC7I/ikCTGYeCvHtNY46y1sOy4q4oOjTgOOmFv
8CgA1t6p6RKY4YzLq82akccscMftQKxQ6yrExSY+fKL3B+yDvC8jvubWR1uMi13w
s/ITq8Q6sQIlA+DPVCwcT7NyMLsXznpUKqIejvd5jX1tqcAHuEfLpUHBhiPmaIRc
7kBO3RlsB8+oFFbsY6Hmmnfd1p110zSWohMfn8sH2mnSv5gHmVx881LYwoxesLyf
lkjmasObKxVmWcBm89c9skXnbrB9FluUJ9tNk/AvMitN3yaZETxMkD64BHxKzgCx
FbUbk5dn+t9XWyGSYQbR9wd2t/vyfrsIiUNkWVf4KH47tsiT7A9mS+XcfMGaju+8
nzkUg8kdbVtN6J7lpGcsdepvNAwOiqOoe7HT/HNGjIFlqCr+u80=
=EhJP
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.