summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Albrecht <prom@berlin.ccc.de>2010-07-16 03:40:27 +0200
committerIngo Albrecht <prom@berlin.ccc.de>2010-08-17 00:29:08 +0200
commita2b7a3ce7c0946e03a7a65f159e4d5367e0418d2 (patch)
treece633529727947d88cc7e058aee7b775c70a8463
parent2c6c27662d51077aa22af056179655f9118931a7 (diff)
dietlibc: half-hearted attempt at getting malloc working
-rw-r--r--src/target/firmware/lib/system.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/target/firmware/lib/system.c b/src/target/firmware/lib/system.c
index 48ef5f1e..2c44aada 100644
--- a/src/target/firmware/lib/system.c
+++ b/src/target/firmware/lib/system.c
@@ -1,8 +1,10 @@
+#include <sys/mman.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
+#include <stdio.h>
#include <unistd.h>
#include <comm/sercomm_cons.h>
@@ -13,6 +15,40 @@ int ioctl(int fd, long int request, ...) {
return 0;
}
+extern char _end;
+
+const char *heaptop = &_end;
+
+void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {
+ if(addr || (fd != -1) || offset) {
+ errno = ENOTSUP;
+ return NULL;
+ }
+ if(flags != (MAP_PRIVATE|MAP_ANONYMOUS)) {
+ errno = ENOTSUP;
+ return NULL;
+ }
+ void *result = heaptop;
+ heaptop += length;
+ return result;
+}
+
+void *mremap(void *old_address, size_t old_size, size_t new_size, unsigned long flags) {
+ if(new_size <= old_size) {
+ return old_address;
+ }
+ if(!(flags & MREMAP_MAYMOVE)) {
+ errno = ENOTSUP;
+ return NULL;
+ }
+
+ return mmap(NULL, new_size, 0, (MAP_PRIVATE|MAP_ANONYMOUS), -1, 0);
+}
+
+int munmap(void *addr, size_t length) {
+ return 0;
+}
+
ssize_t __libc_write(int fd, const void *buf, size_t count) {
char c;
int i;