diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2011-04-07 17:25:07 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-04-11 15:57:51 +0200 |
commit | 2a3762495056381e1ef1809b482b670fcd45b6d5 (patch) | |
tree | f5ea3bf85ed5bf81baae0c0f79514195bea9010e /common/memory.c | |
parent | 4bfc4b44582670182c1519f931cbe0b0efec616e (diff) | |
download | barebox-2a3762495056381e1ef1809b482b670fcd45b6d5.tar.gz barebox-2a3762495056381e1ef1809b482b670fcd45b6d5.tar.xz |
malloc: put common memory functions to seperate file
These functions are needed independently of the specific
malloc implementation, so move them out.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/memory.c')
-rw-r--r-- | common/memory.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/common/memory.c b/common/memory.c new file mode 100644 index 0000000000..8f4a7681b0 --- /dev/null +++ b/common/memory.c @@ -0,0 +1,71 @@ +/* + * memory.c + * + * Copyright (c) 2011 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <common.h> + +/* + * Begin and End of memory area for malloc(), and current "brk" + */ +static unsigned long malloc_start; +static unsigned long malloc_end; +static unsigned long malloc_brk; + +unsigned long mem_malloc_start(void) +{ + return malloc_start; +} + +unsigned long mem_malloc_end(void) +{ + return malloc_end; +} + +void mem_malloc_init(void *start, void *end) +{ + malloc_start = (unsigned long)start; + malloc_end = (unsigned long)end; + malloc_brk = malloc_start; +} + +static void *sbrk_no_zero(ptrdiff_t increment) +{ + unsigned long old = malloc_brk; + unsigned long new = old + increment; + + if ((new < malloc_start) || (new > malloc_end)) + return NULL; + + malloc_brk = new; + + return (void *)old; +} + +void *sbrk(ptrdiff_t increment) +{ + void *old = sbrk_no_zero(increment); + + /* Only clear increment, if valid address was returned */ + if (old != NULL) + memset(old, 0, increment); + + return old; +} |