3
#define XSIZE(x) ((*x)>>1)
4
#define FREE_P(x) (!((*x)&1))
5
#define MARK_BUSY(x) ((*x)|=1)
6
#define MARK_FREE(x) ((*x)&=0xfffe)
8
extern size_t __bss_end;
9
#define GET_HEAP_BOTTOM(h) asm volatile ("in %A0, __SP_L__\n\t" \
10
"in %B0, __SP_H__" : "=r" (h) :)
12
void *malloc (size_t size)
16
size_t * heap_top = &__bss_end;
23
GET_HEAP_BOTTOM (heap_bottom);
25
size = (size+1) >> 1; /* round to 2 */
28
size_t xsize = XSIZE (heap_top);
29
size_t * heap_next = &heap_top[xsize + 1];
30
if ((xsize<<1)+2 == 0)
34
if (FREE_P (heap_top))
38
xsize = heap_bottom - heap_top - 1;
40
else if (FREE_P(heap_next))
42
*heap_top = ( (XSIZE(heap_next)<<1) + 2 == 0
44
: (xsize + XSIZE(heap_next) + 1)<<1);
50
heap_top[size + 1] = 0xfffe;
51
else if (xsize != size)
52
heap_top[size + 1] = (xsize - size - 1) << 1;
53
*heap_top = size << 1;
58
heap_top += xsize + 1;
65
size_t *t = (size_t*)p - 1;