13 u32 MALLOC_MEM2
__attribute__((weak
)) = 1;
16 void* _DEFUN(__libogc_sbrk_r
,(ptr
,incr
),
17 struct _reent
*ptr _AND
24 static char *mem2_start
= NULL
;
27 _CPU_ISR_Disable(level
);
30 // use MEM2 aswell for malloc
32 heap_end
= (char*)SYS_GetArenaLo();
34 heap_end
= (char*)SYS_GetArena2Lo();
38 if((heap_end
+incr
)>(char*)SYS_GetArena2Hi()) {
41 prev_heap
= (char *)-1;
42 } else if ((heap_end
+incr
) < mem2_start
) {
43 // trying to sbrk() back below the MEM2 start barrier
45 prev_heap
= (char *)-1;
49 SYS_SetArena2Lo((void*)(heap_end
+incr
));
51 // if MEM2 area is exactly at the barrier, transition back to MEM1 again
52 if(SYS_GetArena2Lo() == mem2_start
) mem2_start
= NULL
;
55 if((heap_end
+incr
)>(char*)SYS_GetArenaHi()) {
56 // out of MEM1, transition into MEM2
57 if(((char*)SYS_GetArena2Lo() + incr
) > (char*)SYS_GetArena2Hi()) {
58 // this increment doesn't fit in available MEM2
60 prev_heap
= (char *)-1;
62 // MEM2 is available, move into it
63 mem2_start
= heap_end
= prev_heap
= SYS_GetArena2Lo();
64 SYS_SetArena2Lo((void*)(heap_end
+incr
));
67 // MEM1 is available (or we're freeing memory)
69 SYS_SetArenaLo((void*)(heap_end
+incr
));
74 heap_end
= (char*)SYS_GetArenaLo();
76 if((heap_end
+incr
)>(char*)SYS_GetArenaHi()) {
79 prev_heap
= (char *)-1;
84 SYS_SetArenaLo((void*)(heap_end
+incr
));
89 _CPU_ISR_Restore(level
);
91 return (void*)prev_heap
;