summaryrefslogtreecommitdiff
path: root/c
diff options
context:
space:
mode:
authorcvs2git <rtems-devel@rtems.org>2003-09-26 20:43:23 +0000
committercvs2git <rtems-devel@rtems.org>2003-09-26 20:43:23 +0000
commit673d2963c9b8ba46f7dd96ab19eef372356ea817 (patch)
tree14b693577d5269332c27ad40cb868677c243c95b /c
parent56545bae7e88d7edca1c6f8b65abca971b17f3ba (diff)
This commit was manufactured by cvs2svn to create branch 'rtems-4-6-branch'.
Cherrypick from master 2003-09-26 20:43:22 UTC Joel Sherrill <joel.sherrill@OARcorp.com> '2003-09-26 Till Strauman <strauman@slac.stanford.edu>': c/src/lib/libbsp/powerpc/shared/startup/sbrk.c
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/powerpc/shared/startup/sbrk.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/startup/sbrk.c b/c/src/lib/libbsp/powerpc/shared/startup/sbrk.c
new file mode 100644
index 0000000000..276433a5da
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/shared/startup/sbrk.c
@@ -0,0 +1,64 @@
+/* $Id$ */
+
+/*
+ * sbrk.c
+ *
+ * Author: Till Straumann <strauman@slac.stanford.edu>, 2002
+ *
+ * Hack around the 32bit powerpc 32M problem:
+ *
+ * GCC by default uses relative branches which can not jump
+ * farther than 32M. Hence all program text is confined to
+ * a single 32M segment.
+ * This hack gives the RTEMS malloc region all memory below
+ * 32M at startup. Only when this region is exhausted will sbrk
+ * add more memory. Loading modules may fail at that point, hence
+ * the user is expected to load all modules at startup _prior_
+ * to malloc()ing lots of memory...
+ *
+ * NOTE: it would probably be better to have a separate region
+ * for module code.
+ */
+
+#include <rtems.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+static rtems_unsigned32 remaining_start=0;
+static rtems_unsigned32 remaining_size=0;
+
+#define LIMIT_32M 0x02000000
+
+rtems_unsigned32
+_bsp_sbrk_init(rtems_unsigned32 heap_start, rtems_unsigned32 *heap_size_p)
+{
+ rtems_unsigned32 rval=0;
+
+ remaining_start = heap_start;
+ remaining_size =* heap_size_p;
+ if (remaining_start < LIMIT_32M &&
+ remaining_start + remaining_size > LIMIT_32M) {
+ /* clip at LIMIT_32M */
+ rval = remaining_start + remaining_size - LIMIT_32M;
+ *heap_size_p = LIMIT_32M - remaining_start;
+ }
+ return rval;
+}
+
+void * sbrk(ptrdiff_t incr)
+{
+ void *rval=(void*)-1;
+
+ if (incr <= remaining_size) {
+ remaining_size-=incr;
+ rval = (void*)remaining_start;
+ remaining_start += incr;
+ } else {
+ errno = ENOMEM;
+ }
+ return rval;
+}
+