Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2012-02-22 02:37:47 +0400
committerJeff Johnston <jjohnstn@redhat.com>2012-02-22 02:37:47 +0400
commitb07cfbff06094de1a41c6935cbd91ef8b03ebca5 (patch)
tree6a2a7e50fcaa7cc430e1637ce50fc4b7b4e4dace /libgloss/epiphany/sbrk.c
parent9edde1d2c4430fd79bbf494d5e8cec0359a0b267 (diff)
2012-02-21 Jeremy Bennett <jeremy.bennett@embecosm.com>
Alan Lehotsky <apl@alum.mit.edu> Joern Rennecke <joern.rennecke@embecosm.com> * configure.in: Add Epiphany support. * configure: Regenerate. * epiphany: New directory. * libgloss/README: Add Epiphany entry.
Diffstat (limited to 'libgloss/epiphany/sbrk.c')
-rw-r--r--libgloss/epiphany/sbrk.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/libgloss/epiphany/sbrk.c b/libgloss/epiphany/sbrk.c
new file mode 100644
index 000000000..4880c0f8c
--- /dev/null
+++ b/libgloss/epiphany/sbrk.c
@@ -0,0 +1,165 @@
+/* EPIPHANY implementation of _sbrk ()
+
+ Copyright (c) 2011, Adapteva, Inc.
+ All rights reserved.
+
+ Contributor Jeremy Bennett <jeremy.bennett@embecosm.com> for Adapteva Inc
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Adapteva nor the names of its contributors may be
+ used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE. */
+/* ------------------------------------------------------------------------- */
+/* This implementation is suitable for use with the Verilator simulation of
+ the EPIPHANY.
+
+ Commenting suitable for processing by Doxygen is provided throughout. */
+/* ------------------------------------------------------------------------- */
+#include <sys/types.h>
+#include <errno.h>
+#include <stddef.h>
+
+/* ------------------------------------------------------------------------- */
+/*!Increase program data space
+
+ This is a minimal implementation. Assuming the heap is growing upwards
+ from __heap_start towards __heap_end.
+ See linker file for definition.
+
+ @param[in] incr The number of bytes to increment the stack by.
+
+ @return A pointer to the start of the new block of memory */
+/* ------------------------------------------------------------------------- */
+void *
+_sbrk (int incr)
+{
+ extern char __heap_start;//set by linker
+ extern char __heap_end;//set by linker
+
+ static char *heap_end; /* Previous end of heap or 0 if none */
+ char *prev_heap_end;
+
+ if (0 == heap_end) {
+ heap_end = &__heap_start; /* Initialize first time round */
+ }
+
+ prev_heap_end = heap_end;
+ heap_end += incr;
+ //check
+ if( heap_end < (&__heap_end)) {
+
+ } else {
+ errno = ENOMEM;
+ return (char*)-1;
+ }
+ return (void *) prev_heap_end;
+
+} /* _sbrk () */
+
+
+
+///* 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");
+//extern char end; /* Defined by linker. */
+//
+///*caddr_t _sbrk_r (struct _reent *, size_t) asm ("__sbrk_r");*/
+//
+//
+///* This symbol can be defined with the --defsym linker option. */
+//extern char __heap_end __attribute__((weak));
+//
+//
+///* FIXME: We need a semaphore here. */
+//
+//caddr_t
+//_sbrk_r (struct _reent *r, size_t nbytes)
+//{
+// extern char end; /* Defined by linker. */
+// static char *heap_end; /* Previous end of heap or 0 if none */
+// char *prev_heap_end;
+// register char* stack asm("sp");
+//
+// if (0 == heap_end)
+// {
+// heap_end = &end; /* Initialize first time round */
+// }
+//
+// prev_heap_end = heap_end;
+//
+// if (stack < (prev_heap_end+nbytes)) {
+// /* heap would overlap the current stack depth.
+// * Future: use sbrk() system call to make simulator grow memory beyond
+// * the stack and allocate that
+// */
+// errno = ENOMEM;
+// return (char*)-1;
+// }
+//
+// heap_end += nbytes;
+//
+// return (caddr_t) prev_heap_end;
+//
+//} /* _sbrk () */
+
+
+//caddr_t
+//_sbrk_r (struct _reent *r, size_t nbytes)
+//{
+// caddr_t result;
+//
+// void *heap_end;
+//
+// heap_end = &__heap_end;
+// if (!heap_end)
+// heap_end = sbrk_start + sbrk_size;
+// if (
+// /* Ensure we don't underflow. */
+// sbrk_loc + nbytes < sbrk_start
+// /* Ensure we don't overflow. */
+// || sbrk_loc + nbytes > (caddr_t)heap_end)
+// {
+// errno = ENOMEM;
+// return ((caddr_t) -1);
+// }
+//
+// if (0 == sbrk_loc)
+// sbrk_loc = &end; /* Initialize first time round */
+// result = sbrk_loc;
+// sbrk_loc += nbytes;
+// return result;
+//}