diff --git a/lib/libc/io/unistd/mmap.c b/lib/libc/io/unistd/mmap.c index 03e4d67..7845e17 100644 --- a/lib/libc/io/unistd/mmap.c +++ b/lib/libc/io/unistd/mmap.c @@ -57,6 +57,24 @@ static int get_vmo( return err; } +static void *mreserve(kern_handle_t address_space, void *addr, size_t length) +{ + virt_addr_t base = (virt_addr_t)addr; + if (!base) { + base = MAP_ADDRESS_ANY; + } + + kern_status_t status + = address_space_reserve(address_space, base, length, &base); + + if (status != KERN_OK) { + __set_errno(__errno_from_kern_status(status)); + return MAP_FAILED; + } + + return (void *)base; +} + void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) { int tmp = 0; @@ -105,6 +123,12 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) return MAP_FAILED; } + if ((flags & (MAP_ANONYMOUS | MAP_PRIVATE)) && (prot == PROT_NONE)) { + void *ret = mreserve(address_space, addr, length); + kern_handle_close(address_space); + return ret; + } + kern_handle_t vmo = KERN_HANDLE_INVALID; int err = get_vmo(fd, prot, flags, length, &vmo); if (err != SUCCESS) {