From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6519 invoked by alias); 7 Jun 2019 17:59:08 -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 6486 invoked by uid 447); 7 Jun 2019 17:59:08 -0000 Date: Fri, 07 Jun 2019 17:59:00 -0000 Message-ID: <20190607175908.6485.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Jeff Johnston To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] Fix __getreent stack calculations for AMD GCN X-Act-Checkin: newlib-cygwin X-Git-Author: Jeff Johnston X-Git-Refname: refs/heads/master X-Git-Oldrev: 007bc1923c505f18dce5949b57a849640f25b15c X-Git-Newrev: eb429ad509bf30a27a40b7a9b68d65915e18fb4f X-SW-Source: 2019-q2/txt/msg00022.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=eb429ad509bf30a27a40b7a9b68d65915e18fb4f commit eb429ad509bf30a27a40b7a9b68d65915e18fb4f Author: Jeff Johnston Date: Fri Jun 7 13:57:45 2019 -0400 Fix __getreent stack calculations for AMD GCN From: Andrew Stubbs Fix a bug in which the high-part of 64-bit values are being corrupted, leading to erroneous stack overflow errors. The problem was only that the mixed-size calculations are being treated as signed when they should be unsigned. Diff: --- newlib/libc/machine/amdgcn/getreent.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/newlib/libc/machine/amdgcn/getreent.c b/newlib/libc/machine/amdgcn/getreent.c index 5a28aa4..bc50ca0 100644 --- a/newlib/libc/machine/amdgcn/getreent.c +++ b/newlib/libc/machine/amdgcn/getreent.c @@ -35,9 +35,9 @@ __getreent (void) s[4:5] contains the dispatch pointer. WARNING: this code will break if s[0:3] is ever used for anything! */ - const register long buffer_descriptor asm("s0"); - long private_segment = buffer_descriptor & 0x0000ffffffffffff; - const register int stack_offset asm("s11"); + const register unsigned long buffer_descriptor asm("s0"); + unsigned long private_segment = buffer_descriptor & 0x0000ffffffffffff; + const register unsigned int stack_offset asm("s11"); const register hsa_kernel_dispatch_packet_t *dispatch_ptr asm("s4"); struct data { @@ -45,9 +45,9 @@ __getreent (void) struct _reent reent; } *data; - long stack_base = private_segment + stack_offset; - long stack_end = stack_base + dispatch_ptr->private_segment_size * 64; - long addr = (stack_end - sizeof(struct data)) & ~7; + unsigned long stack_base = private_segment + stack_offset; + unsigned long stack_end = stack_base + dispatch_ptr->private_segment_size * 64; + unsigned long addr = (stack_end - sizeof(struct data)) & ~7; data = (struct data *)addr; register long sp asm("s16");