diff options
author | Ingo Albrecht <prom@berlin.ccc.de> | 2010-07-16 03:40:27 +0200 |
---|---|---|
committer | Ingo Albrecht <prom@berlin.ccc.de> | 2010-08-17 00:29:08 +0200 |
commit | a2b7a3ce7c0946e03a7a65f159e4d5367e0418d2 (patch) | |
tree | ce633529727947d88cc7e058aee7b775c70a8463 | |
parent | 2c6c27662d51077aa22af056179655f9118931a7 (diff) |
dietlibc: half-hearted attempt at getting malloc working
-rw-r--r-- | src/target/firmware/lib/system.c | 36 |
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; |