aboutsummaryrefslogtreecommitdiff
path: root/libgloss/mep/sbrk.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/mep/sbrk.c')
-rw-r--r--libgloss/mep/sbrk.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/libgloss/mep/sbrk.c b/libgloss/mep/sbrk.c
new file mode 100644
index 0000000..9ec8676
--- /dev/null
+++ b/libgloss/mep/sbrk.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2003 Red Hat, Inc. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the BSD
+ * License. This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY expressed or implied, including the implied
+ * warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. A copy
+ * of this license is available at http://www.opensource.org/licenses. Any
+ * Red Hat trademarks that are incorporated in the source code or documentation
+ * are not subject to the BSD License and may only be used or replicated with
+ * the express permission of Red Hat, Inc.
+ */
+
+#include <errno.h>
+
+extern int __heap __far; /* beginning of heap */
+extern int __heap_end __far; /* if at address 0, use stack pointer as limit */
+
+static char *the_break = (char *)(& __heap);
+
+int
+is_addr_0 (int address)
+{
+ return address ? 0 : 1;
+}
+
+void *
+sbrk(int inc)
+{
+ char *current_heap_limit = (char *) (& __heap_end);
+
+ /* is_addr_0 avoids optimizing out this block. */
+ if (is_addr_0 ((int) current_heap_limit))
+ {
+ int something;
+ int margin = 4096;
+ current_heap_limit = (char *) (& something) - margin;
+ }
+
+ if ((the_break + inc) < current_heap_limit)
+ {
+ void *rv = (void *) the_break;
+ the_break += inc;
+ return rv;
+ }
+ else
+ {
+ errno = ENOMEM;
+ return (void *) -1;
+ }
+}
+
+int
+brk (void *ptr)
+{
+ the_break = ptr;
+ return 0;
+}