lib: c: io: mmap can now reserve a region of memory when called with PROT_NONE
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user