1,5 → 1,5 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
24,36 → 24,49 |
* 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. |
*/ |
*/ |
|
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
|
#include <sys/mman.h> |
#include <as.h> |
#include <libc.h> |
#include <unistd.h> |
|
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) |
/** Mremap syscall */ |
void *mremap(void *address, size_t size, unsigned long flags) |
{ |
if (!start) |
start = as_get_mappable_page(length); |
|
// if (! ((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE))) |
// return MAP_FAILED; |
if (! (flags & MAP_ANONYMOUS)) |
return MAP_FAILED; |
|
return as_area_create(start, length, prot); |
return (void *) __SYSCALL3(SYS_MREMAP, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags); |
} |
|
int munmap(void *start, size_t length) |
|
static size_t heapsize = 0; |
/* Start of heap linker symbol */ |
extern char _heap; |
|
/** Sbrk emulation |
* |
* @param size New area that should be allocated or negative, |
if it should be shrinked |
* @return Pointer to newly allocated area |
*/ |
void *sbrk(ssize_t incr) |
{ |
return as_area_destroy(start); |
} |
void *res; |
/* Check for invalid values */ |
if (incr < 0 && -incr > heapsize) |
return NULL; |
/* Check for too large value */ |
if (incr > 0 && incr+heapsize < heapsize) |
return NULL; |
/* Check for too small values */ |
if (incr < 0 && incr+heapsize > heapsize) |
return NULL; |
|
res = mremap(&_heap, heapsize + incr,0); |
if (!res) |
return NULL; |
|
/* Compute start of new area */ |
res = (void *)&_heap + heapsize; |
|
/** @} |
*/ |
heapsize += incr; |
|
return res; |
} |