From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 91513 invoked by alias); 8 Nov 2019 09:34:46 -0000 Mailing-List: contact newlib-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-cvs-owner@sourceware.org Received: (qmail 91470 invoked by uid 9078); 8 Nov 2019 09:34:46 -0000 Date: Fri, 08 Nov 2019 09:34:00 -0000 Message-ID: <20191108093446.91468.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] Stash reent marker in upper bits of s1 on AMD GCN X-Act-Checkin: newlib-cygwin X-Git-Author: Kwok Cheung Yeung X-Git-Refname: refs/heads/master X-Git-Oldrev: 04d85dea5746572ef4b45df9add7d7aaec9a0821 X-Git-Newrev: d14714c690c0b11b0aa7e6d09c930a321eeac7f9 X-SW-Source: 2019-q4/txt/msg00015.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=d14714c690c0b11b0aa7e6d09c930a321eeac7f9 commit d14714c690c0b11b0aa7e6d09c930a321eeac7f9 Author: Kwok Cheung Yeung Date: Thu Nov 7 14:46:41 2019 -0800 Stash reent marker in upper bits of s1 on AMD GCN 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. Diff: --- 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;