blob: 194492659042ca14170d9356d0a055b018d24348 [file] [log] [blame] [view] [edit]
# zx_vmar_map
## NAME
vmar_map - add a memory mapping
## SYNOPSIS
```
#include <zircon/syscalls.h>
zx_status_t zx_vmar_map(zx_handle_t vmar, uint64_t vmar_offset,
zx_handle_t vmo, uint64_t vmo_offset, uint64_t len,
uint32_t map_flags, zx_vaddr_t* mapped_addr)
```
## DESCRIPTION
Maps the given VMO into the given virtual memory address region. The mapping
retains a reference to the underlying virtual memory object, which means
closing the VMO handle does not remove the mapping added by this function.
*map_flags* is a bit vector of the following flags:
- **ZX_VM_FLAG_SPECIFIC** Use the *vmar_offset* to place the mapping, invalid if
vmar does not have the **ZX_VM_FLAG_CAN_MAP_SPECIFIC** permission.
*vmar_offset* is an offset relative to the base address of the given VMAR.
It is an error to specify a range that overlaps with another VMAR or mapping.
- **ZX_VM_FLAG_SPECIFIC_OVERWRITE** Same as **ZX_VM_FLAG_SPECIFIC**, but can
overlap another mapping. It is still an error to partially-overlap another VMAR.
If the range meets these requirements, it will atomically (with respect to all
other map/unmap/protect operations) replace existing mappings in the area.
- **ZX_VM_FLAG_PERM_READ** Map *vmo* as readable. It is an error if *vmar*
does not have *ZX_VM_FLAG_CAN_MAP_READ* permissions, the *vmar* handle does
not have the *ZX_RIGHT_READ* right, or the *vmo* handle does not have the
*ZX_RIGHT_READ* right.
- **ZX_VM_FLAG_PERM_WRITE** Map *vmo* as writable. It is an error if *vmar*
does not have *ZX_VM_FLAG_CAN_MAP_WRITE* permissions, the *vmar* handle does
not have the *ZX_RIGHT_WRITE* right, or the *vmo* handle does not have the
*ZX_RIGHT_WRITE* right.
- **ZX_VM_FLAG_PERM_EXECUTE** Map *vmo* as executable. It is an error if *vmar*
does not have *ZX_VM_FLAG_CAN_MAP_EXECUTE* permissions, the *vmar* handle does
not have the *ZX_RIGHT_EXECUTE* right, or the *vmo* handle does not have the
*ZX_RIGHT_EXECUTE* right.
- **ZX_VM_FLAG_MAP_RANGE** Immediately page into the new mapping all backed
regions of the VMO. This cannot be specified if
*ZX_VM_FLAG_SPECIFIC_OVERWRITE* is used.
- **ZX_VM_FLAG_REQUIRE_NON_RESIZABLE** Maps the VMO only if the VMO is non-resizable,
that is, it was created with the **ZX_VMO_NON_RESIZABLE** option.
*vmar_offset* must be 0 if *map_flags* does not have **ZX_VM_FLAG_SPECIFIC** or
**ZX_VM_FLAG_SPECIFIC_OVERWRITE** set. If neither of those flags are set, then
the mapping will be assigned an offset at random by the kernel (with an
allocator determined by policy set on the target VMAR).
## RIGHTS
TODO(ZX-2399)
## RETURN VALUE
**vmar_map**() returns **ZX_OK** and the absolute base address of the
mapping (via *mapped_addr*) 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** *vmar* or *vmo* is not a valid handle.
**ZX_ERR_WRONG_TYPE** *vmar* or *vmo* is not a VMAR or VMO handle, respectively.
**ZX_ERR_BAD_STATE** *vmar* refers to a destroyed VMAR.
**ZX_ERR_INVALID_ARGS** *mapped_addr* or *map_flags* are not valid, *vmar_offset* is
non-zero when neither **ZX_VM_FLAG_SPECIFIC** nor
**ZX_VM_FLAG_SPECIFIC_OVERWRITE** are given,
**ZX_VM_FLAG_SPECIFIC_OVERWRITE** and **ZX_VM_FLAG_MAP_RANGE** are both given,
*vmar_offset* and *len* describe an unsatisfiable allocation due to exceeding the region bounds,
*vmar_offset* or *vmo_offset* are not page-aligned,
*vmo_offset* + ROUNDUP(*len*, PAGE_SIZE) overflows, or *len* is 0.
**ZX_ERR_ACCESS_DENIED** Insufficient privileges to make the requested mapping.
**ZX_ERR_NOT_SUPPORTED** The VMO is resizable and **ZX_VM_FLAG_REQUIRE_NON_RESIZABLE** was
requested.
**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
The VMO that backs a memory mapping can be resized to a smaller size. This can cause the
thread is reading or writting to the VMAR region to fault. To avoid this hazard, services
that receive VMOs from clients should use **ZX_VM_FLAG_REQUIRE_NON_RESIZABLE** when mapping
the VMO.
## SEE ALSO
[vmar_allocate](vmar_allocate.md),
[vmar_destroy](vmar_destroy.md),
[vmar_protect](vmar_protect.md),
[vmar_unmap](vmar_unmap.md).