-
Notifications
You must be signed in to change notification settings - Fork 4
/
_sbrk.c
48 lines (38 loc) · 1.17 KB
/
_sbrk.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//
// This file is part of the GNU ARM Eclipse Plug-in
// Copyright (c) 2013 Liviu Ionescu
//
#include <sys/types.h>
#include <errno.h>
caddr_t
_sbrk(int incr)
{
extern char _end; /* Defined by the linker. */
//extern char _Heap_Limit; /* Defined by the linker. */
static char* current_heap_end;
char* current_block_address;
if (current_heap_end == 0)
current_heap_end = &_end;
current_block_address = current_heap_end;
// Need to align heap to word boundary, else will get
// hard faults on Cortex-M0. So we assume that heap starts on
// word boundary, hence make sure we always add a multiple of
// 4 to it.
incr = (incr + 3) & (~3); // align value to 4
if (current_heap_end + incr > &_end + HEAP_SIZE)
{
// Some of the libstdc++-v3 tests rely upon detecting
// out of memory errors, so do not abort here.
#if 0
extern void abort (void);
_write (1, "_sbrk: Heap and stack collision\n", 32);
abort ();
#else
// Heap has overflowed
errno = ENOMEM;
return (caddr_t) - 1;
#endif
}
current_heap_end += incr;
return (caddr_t) current_block_address;
}