# Copyright 2017 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

include <zircon/syscalls.h>

resource zx_vmar[zx_handle]

zx_vmar_allocate(parent_handle zx_vmar, allocate_flags flags[vmar_allocate_flags], offset intptr, size intptr, out ptr[out, zx_vmar], child_addr ptr[out, intptr])
zx_vmar_map(handle zx_vmar, map_flags flags[vmar_map_flags], vmar_offset intptr, vmo zx_vmo, vmo_offset int64, len intptr, mapped_addr ptr[out, intptr])
zx_vmar_unmap(handle zx_vmar, addr vma, len len[addr])
zx_vmar_protect(handle zx_vmar, prot_flags flags[vmar_protect_flags], addr vma, len len[addr])
zx_vmar_destroy(handle zx_vmar)

vmar_allocate_flags = ZX_VM_COMPACT, ZX_VM_SPECIFIC, ZX_VM_CAN_MAP_SPECIFIC, ZX_VM_CAN_MAP_READ, ZX_VM_CAN_MAP_WRITE, ZX_VM_CAN_MAP_EXECUTE
vmar_map_flags = ZX_VM_SPECIFIC, ZX_VM_SPECIFIC_OVERWRITE, ZX_VM_PERM_READ, ZX_VM_PERM_WRITE, ZX_VM_PERM_EXECUTE, ZX_VM_MAP_RANGE
vmar_protect_flags = ZX_VM_PERM_READ, ZX_VM_PERM_WRITE, ZX_VM_PERM_EXECUTE
