µOS++ IIIe Reference  v6.3.15
“Perfekt ist nicht gut genug”
The third edition of µOS++, a POSIX inspired open source system, written in C++.
_sbrk.c
Go to the documentation of this file.
1 /*
2  * This file is part of the µOS++ distribution.
3  * (https://github.com/micro-os-plus)
4  * Copyright (c) 2015 Liviu Ionescu.
5  *
6  * Permission is hereby granted, free of charge, to any person
7  * obtaining a copy of this software and associated documentation
8  * files (the "Software"), to deal in the Software without
9  * restriction, including without limitation the rights to use,
10  * copy, modify, merge, publish, distribute, sublicense, and/or
11  * sell copies of the Software, and to permit persons to whom
12  * the Software is furnished to do so, subject to the following
13  * conditions:
14  *
15  * The above copyright notice and this permission notice shall be
16  * included in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25  * OTHER DEALINGS IN THE SOFTWARE.
26  */
27 
28 #if defined(__ARM_EABI__)
29 
30 // ----------------------------------------------------------------------------
31 
32 #include <unistd.h>
33 #include <stdlib.h>
34 #include <sys/types.h>
35 #include <errno.h>
36 #include <stddef.h>
37 
38 // ----------------------------------------------------------------------------
39 
40 void*
41 _sbrk (ptrdiff_t incr);
42 
43 // ----------------------------------------------------------------------------
44 
45 // The definitions used here should be kept in sync with the
46 // stack definitions in the linker script.
47 
48 void*
49 _sbrk (ptrdiff_t incr)
50 {
51  extern unsigned int _Heap_Begin; // Defined by the linker.
52  extern unsigned int _Heap_Limit; // Defined by the linker.
53 
54  static char* current_heap_end; // STATIC! Zero after BSS init.
55  char* current_block_address;
56 
57  if (current_heap_end == 0)
58  {
59  current_heap_end = (char*)&_Heap_Begin;
60  }
61 
62  current_block_address = current_heap_end;
63 
64  // Need to align heap to word boundary, else will get
65  // hard faults on Cortex-M0. So we assume that heap starts on
66  // word boundary, hence make sure we always add a multiple of
67  // 4 to it.
68  incr = (incr + 3) & (~3); // align value to 4
69  if (current_heap_end + incr > ((char*)&_Heap_Limit))
70  {
71  // Some of the libstdc++-v3 tests rely upon detecting
72  // out of memory errors, so DO NOT abort here.
73 
74  errno = ENOMEM; // Heap has overflowed.
75  return (caddr_t) -1;
76  }
77 
78  current_heap_end += incr;
79 
80  return (caddr_t) current_block_address;
81 }
82 
83 void*
84 __attribute__((weak, alias ("_sbrk")))
85 sbrk (ptrdiff_t incr);
86 
87 void*
88 _sbrk_r (struct _reent* impure, ptrdiff_t incr);
89 
90 void*
91 _sbrk_r (struct _reent* impure __attribute__((unused)), ptrdiff_t incr)
92 {
93  return _sbrk (incr);
94 }
95 
96 // ----------------------------------------------------------------------------
97 
98 #endif /* defined(__ARM_EABI__) */
void * _sbrk(ptrdiff_t incr)
Definition: _sbrk.c:49
unsigned int _Heap_Begin
unsigned int _Heap_Limit
void * sbrk(ptrdiff_t incr)
void * _sbrk_r(struct _reent *impure, ptrdiff_t incr)
Definition: _sbrk.c:91