diff options
Diffstat (limited to 'newlib/libc/sys/arc/sbrk.c')
-rw-r--r-- | newlib/libc/sys/arc/sbrk.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/newlib/libc/sys/arc/sbrk.c b/newlib/libc/sys/arc/sbrk.c new file mode 100644 index 000000000..9f863cded --- /dev/null +++ b/newlib/libc/sys/arc/sbrk.c @@ -0,0 +1,43 @@ +/* sbrk support */ + +/* The current plan is to have one sbrk handler for all cpus. + Hence use `asm' for each global variable here to avoid the cpu prefix. + We can't intrude on the user's namespace (another reason to use asm). */ + +#include <sys/types.h> +#include <sys/syscall.h> +#include <errno.h> +#include <stddef.h> + +/* These variables are publicly accessible for debugging purposes. + The user is also free to set sbrk_size to something different. + See mem-layout.c. */ + +extern int sbrk_size asm ("sbrk_size"); + +caddr_t sbrk_start asm ("sbrk_start"); +caddr_t sbrk_loc asm ("sbrk_loc"); + +/*caddr_t _sbrk_r (struct _reent *, size_t) asm ("__sbrk_r");*/ + +/* FIXME: We need a semaphore here. */ + +caddr_t +_sbrk_r (struct _reent *r, size_t nbytes) +{ + caddr_t result; + + if ( + /* Ensure we don't underflow. */ + sbrk_loc + nbytes < sbrk_start + /* Ensure we don't overflow. */ + || sbrk_loc + nbytes > sbrk_start + sbrk_size) + { + errno = ENOMEM; + return ((caddr_t) -1); + } + + result = sbrk_loc; + sbrk_loc += nbytes; + return result; +} |