Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev HEAD → Rev 999

/uspace/trunk/libc/generic/mmap.c
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;
}