summaryrefslogtreecommitdiffstats
path: root/newlib/libc/sys/arc/sbrk.c
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2001-01-19 01:25:13 +0000
committerJeff Johnston <jjohnstn@redhat.com>2001-01-19 01:25:13 +0000
commita302b48c21aaf08f166b8514705b87f1331c147f (patch)
tree66ba2814d00a53aed3a3df2b0c6ab6a34a2e2735 /newlib/libc/sys/arc/sbrk.c
parent74a3cd0a4f15c1c9dfe4044d7a54b420e5a5f7f6 (diff)
downloadcygnal-a302b48c21aaf08f166b8514705b87f1331c147f.tar.gz
cygnal-a302b48c21aaf08f166b8514705b87f1331c147f.tar.bz2
cygnal-a302b48c21aaf08f166b8514705b87f1331c147f.zip
2001-01-18 Jeff Johnston <jjohnstn@redhat.com>
* libc/sys/arc/Makefile.am: New file. * libc/sys/arc/Makefile.in: Ditto. * libc/sys/arc/aclocal.m4: Ditto. * libc/sys/arc/configure: Ditto. * libc/sys/arc/configure.in: Ditto. * libc/sys/arc/crt0.S: Ditto. * libc/sys/arc/isatty.c: Ditto. * libc/sys/arc/mem-layout.c: Ditto. * libc/sys/arc/sbrk.c: Ditto. * libc/sys/arc/syscalls.c: Ditto. * libc/sys/arc/sys/syscall.h: Ditto.
Diffstat (limited to 'newlib/libc/sys/arc/sbrk.c')
-rw-r--r--newlib/libc/sys/arc/sbrk.c43
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;
+}