diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2019-06-07 20:57:45 +0300 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2019-06-07 20:57:45 +0300 |
commit | eb429ad509bf30a27a40b7a9b68d65915e18fb4f (patch) | |
tree | f079d4c0bc54fed61f69a102d1702748fb1f9898 /newlib/libc/machine | |
parent | 007bc1923c505f18dce5949b57a849640f25b15c (diff) |
Fix __getreent stack calculations for AMD GCN
From: Andrew Stubbs <ams@codesourcery.com>
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.
Diffstat (limited to 'newlib/libc/machine')
-rw-r--r-- | newlib/libc/machine/amdgcn/getreent.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/newlib/libc/machine/amdgcn/getreent.c b/newlib/libc/machine/amdgcn/getreent.c index 5a28aa406..bc50ca022 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"); |