summaryrefslogtreecommitdiffstats
path: root/libgloss/m68k/bdm-sbrk.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/m68k/bdm-sbrk.c')
-rw-r--r--libgloss/m68k/bdm-sbrk.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/libgloss/m68k/bdm-sbrk.c b/libgloss/m68k/bdm-sbrk.c
new file mode 100644
index 000000000..b1d539d46
--- /dev/null
+++ b/libgloss/m68k/bdm-sbrk.c
@@ -0,0 +1,49 @@
+/*
+ * bdm-open.c --
+ *
+ * Copyright (c) 2006 CodeSourcery Inc
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+#include <errno.h>
+/*
+ * sbrk -- changes heap size size. Get nbytes more
+ * RAM. We just increment a pointer in what's
+ * left of memory on the board.
+ */
+
+extern char __end[] __attribute__ ((aligned (4)));
+/* Optional explicit end of heap. */
+extern char __heap_end[] __attribute__ ((aligned (4), weak));
+
+void *
+sbrk (int nbytes)
+{
+ static char *heap = __end;
+ char *end = __heap_end;
+ char *base = heap;
+ char *new_heap = heap + nbytes;
+
+ if (!end)
+ {
+ /* Use sp - 256 as the heap limit. */
+ __asm__ __volatile__ ("move.l %/sp,%0" : "=r"(end));
+ end -= 256;
+ }
+ if (nbytes < 0 || (long)(end - new_heap) < 0)
+ {
+ errno = ENOMEM;
+ return (void *)-1;
+ }
+ heap = new_heap;
+ return base;
+}