| <!-- |
| Copyright 2023 The Fuchsia Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| |
| DO NOT EDIT. Generated from FIDL library zx by zither, a Fuchsia platform tool. |
| |
| See //docs/reference/syscalls/README.md#documentation-generation for |
| regeneration instructions. |
| --> |
| |
| # zx_vmar_protect |
| |
| ## Summary |
| |
| Set protection of virtual memory pages. |
| |
| ## Declaration |
| |
| ```c |
| #include <zircon/syscalls.h> |
| |
| zx_status_t zx_vmar_protect(zx_handle_t handle, |
| zx_vm_option_t options, |
| zx_vaddr_t addr, |
| size_t len); |
| ``` |
| |
| ## Description |
| |
| `zx_vmar_protect()` alters the access protections for the memory mappings |
| in the range of *len* bytes starting from *addr*. The *options* argument should |
| be a bitwise-or of one or more of the following: |
| |
| - `ZX_VM_PERM_READ` Map as readable. It is an error if *handle* |
| does not have `ZX_VM_CAN_MAP_READ` permissions or *handle* does |
| not have the `ZX_RIGHT_READ` right. It is also an error if the VMO handle |
| used to create the mapping did not have the `ZX_RIGHT_READ` right. |
| - `ZX_VM_PERM_WRITE` Map as writable. It is an error if *handle* |
| does not have `ZX_VM_CAN_MAP_WRITE` permissions or *handle* does |
| not have the `ZX_RIGHT_WRITE` right. It is also an error if the VMO handle |
| used to create the mapping did not have the `ZX_RIGHT_WRITE` right. |
| - `ZX_VM_PERM_EXECUTE` Map as executable. It is an error if *handle* |
| does not have `ZX_VM_CAN_MAP_EXECUTE` permissions or *handle* does |
| not have the `ZX_RIGHT_EXECUTE` right. It is also an error if the VMO handle |
| used to create the mapping did not have the `ZX_RIGHT_EXECUTE` right. |
| - `ZX_VM_PERM_READ_IF_XOM_UNSUPPORTED` Map as readable if the system does |
| not support mapping execute-only pages. If the system can map execute-only |
| this flag is ignored. |
| |
| For any mappings in sub-regions in the requested range, their access permissions must either |
| be reduced, or left unchanged, by the requested change. |
| |
| *len* must be page-aligned. |
| |
| ## Rights |
| |
| If *options* & `ZX_VM_PERM_READ`, *handle* must be of type `ZX_OBJ_TYPE_VMAR` and have `ZX_RIGHT_READ`. |
| |
| If *options* & `ZX_VM_PERM_WRITE`, *handle* must be of type `ZX_OBJ_TYPE_VMAR` and have `ZX_RIGHT_WRITE`. |
| |
| If *options* & `ZX_VM_PERM_EXECUTE`, *handle* must be of type `ZX_OBJ_TYPE_VMAR` and have `ZX_RIGHT_EXECUTE`. |
| |
| ## Return value |
| |
| `zx_vmar_protect()` returns `ZX_OK` on success. |
| |
| ## Errors |
| |
| `ZX_ERR_BAD_HANDLE` *handle* is not a valid handle. |
| |
| `ZX_ERR_WRONG_TYPE` *handle* is not a VMAR handle. |
| |
| `ZX_ERR_INVALID_ARGS` *prot_flags* is an unsupported combination of flags |
| (e.g., `ZX_VM_PERM_WRITE` but not `ZX_VM_PERM_READ`), *addr* is |
| not page-aligned, *len* is 0, or some subrange of the requested range is |
| occupied by a subregion and *handle* did not have `ZX_RIGHT_OP_CHILDREN`. |
| |
| `ZX_ERR_NOT_FOUND` Some subrange of the requested range is not mapped. |
| |
| `ZX_ERR_ACCESS_DENIED` *handle* does not have the proper rights for the |
| requested change, the original VMO handle used to create the mapping did not |
| have the rights for the requested change, or the VMAR itself does not allow |
| the requested change, or there is a mapping in a sub-region that would have |
| its mapping permissions increased. |
| |
| `ZX_ERR_NO_MEMORY` Failure due to lack of memory. |
| There is no good way for userspace to handle this (unlikely) error. |
| In a future build this error will no longer occur. |
| |
| ## Notes |
| |
| For failures other than `ZX_ERR_NO_MEMORY`, all access permissions in the range |
| will have been left unchanged. |
| |
| ## See also |
| |
| - [`zx_vmar_allocate()`] |
| - [`zx_vmar_destroy()`] |
| - [`zx_vmar_map()`] |
| - [`zx_vmar_unmap()`] |
| |
| [`zx_vmar_allocate()`]: vmar_allocate.md |
| [`zx_vmar_destroy()`]: vmar_destroy.md |
| [`zx_vmar_map()`]: vmar_map.md |
| [`zx_vmar_unmap()`]: vmar_unmap.md |