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 + + * 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 * 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;