blob: 8c45f7a94c591134635d01ad4e21ecef06c4898d [file] [log] [blame]
#include <errno.h>
#include <sys/mman.h>
#include <zircon/process.h>
#include <zircon/syscalls.h>
#include <zircon/types.h>
#include "libc.h"
#include "zircon_impl.h"
int __mprotect(void* addr, size_t len, int prot) {
uintptr_t ptr = (uintptr_t)addr;
zx_vm_option_t zx_prot = 0;
zx_prot |= (prot & PROT_READ) ? ZX_VM_PERM_READ : 0;
zx_prot |= (prot & PROT_WRITE) ? ZX_VM_PERM_WRITE : 0;
zx_prot |= (prot & PROT_EXEC) ? ZX_VM_PERM_EXECUTE : 0;
zx_status_t status = _zx_vmar_protect(_zx_vmar_root_self(), zx_prot, ptr, len);
if (!status)
return 0;
switch (status) {
case ZX_ERR_ACCESS_DENIED:
errno = EACCES;
break;
case ZX_ERR_INVALID_ARGS:
errno = ENOTSUP;
break;
default:
errno = EINVAL;
break;
}
return -1;
}
weak_alias(__mprotect, mprotect);