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-----