Summary
Allocate a new subregion.
Declaration
#include <zircon/syscalls.h>
zx_status_t zx_vmar_allocate(zx_handle_t parent_vmar,
zx_vm_option_t options,
size_t offset,
size_t size,
zx_handle_t* child_vmar,
zx_vaddr_t* child_addr);
Description
Creates a new VMAR within the one specified by parent_vmar.
options is a bit vector that contains one more of the following:
ZX_VM_COMPACTA hint to the kernel that allocations and mappings within the newly created subregion should be kept close together. See the NOTES section below for discussion.ZX_VM_SPECIFICUse the offset to place the mapping, invalid if parent_vmar does not have theZX_VM_CAN_MAP_SPECIFICpermission. offset is an offset relative to the base address of the parent region. It is an error to specify an address range that overlaps with another VMAR or mapping.ZX_VM_OFFSET_IS_UPPER_LIMITInterpret the offset as an upper limit to constrain the selection of the offset by the kernel, invalid if parent_vmar does not have theZX_VM_CAN_MAP_SPECIFICpermission. The resulting mapping will have an offset + size that is <= offset. This option cannot be specified ifZX_VM_SPECIFICis used.ZX_VM_CAN_MAP_SPECIFICThe new VMAR can have subregions/mappings created withZX_VM_SPECIFIC. It is NOT an error if the parent does not haveZX_VM_CAN_MAP_SPECIFICpermissions.ZX_VM_CAN_MAP_READThe new VMAR can contain readable mappings. It is an error if the parent does not haveZX_VM_CAN_MAP_READpermissions.ZX_VM_CAN_MAP_WRITEThe new VMAR can contain writable mappings. It is an error if the parent does not haveZX_VM_CAN_MAP_WRITEpermissions.ZX_VM_CAN_MAP_EXECUTEThe new VMAR can contain executable mappings. It is an error if the parent does not haveZX_VM_CAN_MAP_EXECUTEpermissions.
offset must be 0 if options does not have ZX_VM_SPECIFIC or
ZX_VM_OFFSET_IS_UPPER_LIMIT set.
In addition, the following power-of-two alignment flags can added:
ZX_VM_ALIGN_1KBaligns child_addr to a power-of-2 at least 1K bytes.ZX_VM_ALIGN_2KBaligns child_addr to a power-of-2 at least 2K bytes.ZX_VM_ALIGN_4KBaligns child_addr to a power-of-2 at least 4K bytes.ZX_VM_ALIGN_8KBaligns child_addr to a power-of-2 at least 8K bytes.
and continues up to
ZX_VM_ALIGN_4GBaligns child_addr to a power-of-2 at least 4G bytes.
Using ZX_VM_ALIGN flags with ZX_VM_SPECIFIC will fail if the
parent_vmar base address + offset are not aligned to the requested
value.
Rights
If options & ZX_VM_CAN_MAP_READ, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_READ.
If options & ZX_VM_CAN_MAP_WRITE, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_WRITE.
If options & ZX_VM_CAN_MAP_EXECUTE, parent_vmar must be of type ZX_OBJ_TYPE_VMAR and have ZX_RIGHT_EXECUTE.
Return value
zx_vmar_allocate() returns ZX_OK, the absolute base address of the
subregion (via child_addr), and a handle to the new subregion (via
child_vmar) on success. The base address will be page-aligned and non-zero.
In the event of failure, a negative error value is returned.
Errors
ZX_ERR_BAD_HANDLE parent_vmar is not a valid handle.
ZX_ERR_WRONG_TYPE parent_vmar is not a VMAR handle.
ZX_ERR_BAD_STATE parent_vmar refers to a destroyed VMAR.
ZX_ERR_INVALID_ARGS for any of the following:
- child_vmar or child_addr are not valid,
- offset is non-zero when ZX_VM_SPECIFIC or ZX_VM_OFFSET_IS_UPPER_LIMIT is not given.
- ZX_VM_OFFSET_IS_UPPER_LIMIT is specified together with ZX_VM_SPECIFIC.
- offset and size describe an unsatisfiable allocation due to exceeding the region bounds
- offset or size is not page-aligned, or size is 0.
ZX_ERR_NO_MEMORY This may be due to the following:
- A free address range of the requested size is not available within parent_vmar.
- The system is out of memory resources.
ZX_ERR_ACCESS_DENIED Insufficient privileges to make the requested allocation.
Notes
Deallocation
The address space occupied by a VMAR will remain allocated (within its
parent VMAR) until the VMAR is destroyed by calling zx_vmar_destroy().
Note that just closing the VMAR's handle does not deallocate the address space occupied by the VMAR.
The COMPACT flag
The kernel interprets this flag as a request to reduce sprawl in allocations. While this does not necessitate reducing the absolute entropy of the allocated addresses, there will potentially be a very high correlation between allocations. This is a trade-off that the developer can make to increase locality of allocations and reduce the number of page tables necessary, if they are willing to have certain addresses be more correlated.