Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgloss/ChangeLog7
-rw-r--r--libgloss/spu/sbrk.c5
2 files changed, 10 insertions, 2 deletions
diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog
index 4946812ee..b9fcadf5e 100644
--- a/libgloss/ChangeLog
+++ b/libgloss/ChangeLog
@@ -1,3 +1,10 @@
+2007-10-01 Patrick Mansfield <patmans@us.ibm.com>
+
+ * spu/sbrk.c: Use the current stack pointer value rather than the
+ maximum available memory to determine the amount of heap space
+ left. Without this change calling sbrk() can allocate space that
+ is currently in use on the stack.
+
2007-09-26 Patrick Mansfield <patmans@us.ibm.com>
* spu/sched_yield.c: New file (missed on 2007-09-21).
diff --git a/libgloss/spu/sbrk.c b/libgloss/spu/sbrk.c
index b0528c395..6f21b0379 100644
--- a/libgloss/spu/sbrk.c
+++ b/libgloss/spu/sbrk.c
@@ -37,7 +37,6 @@ Author: Andreas Neukoetter (ti95neuk@de.ibm.com)
extern int errno;
extern caddr_t _end;
-#define RAMSIZE 262144
#define STACKSIZE 4096
void *
@@ -47,6 +46,7 @@ sbrk (ptrdiff_t increment)
caddr_t base;
vector unsigned int sp_reg, sp_delta;
vector unsigned int *sp_ptr;
+ caddr_t sps;
/* The stack pointer register. */
volatile register vector unsigned int sp_r1 __asm__("1");
@@ -54,7 +54,8 @@ sbrk (ptrdiff_t increment)
if (heap_ptr == NULL)
heap_ptr = (caddr_t) & _end;
- if (((RAMSIZE - STACKSIZE) - (int) heap_ptr) >= increment)
+ sps = (caddr_t) spu_extract (sp_r1, 0);
+ if (((int) sps - STACKSIZE - (int) heap_ptr) >= increment)
{
base = heap_ptr;
heap_ptr += increment;