blob: 2c2aee1787f0c5bad8c5f54cb0cf99c0fe232cbd [file] [log] [blame] [view]
<!--
Copyright 2022 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_bti_pin
## Summary
Pin pages and grant devices access to them.
## Declaration
```c
#include <zircon/syscalls.h>
zx_status_t zx_bti_pin(zx_handle_t handle,
uint32_t options,
zx_handle_t vmo,
uint64_t offset,
uint64_t size,
zx_paddr_t* addrs,
size_t num_addrs,
zx_handle_t* pmt);
```
## Description
`zx_bti_pin()` pins pages of a VMO (i.e. prevents them from being decommitted
with [`zx_vmo_op_range()`]) and grants the hardware
transaction ID represented by the BTI the ability to access these pages,
with the permissions specified in *options*.
*offset* must be aligned to page boundaries.
*options* is a bitfield that may contain one or more of **ZX_BTI_PERM_READ**,
**ZX_BTI_PERM_WRITE**, **ZX_BTI_PERM_EXECUTE**, **ZX_BTI_COMPRESS**, and
**ZX_BTI_CONTIGUOUS**. In order for the call to succeed, *vmo* must have the
READ/WRITE rights corresponding to the permissions flags set in *options*.
(Note: **ZX_BTI_PERM_EXECUTE** requires **ZX_RIGHT_READ**, not **ZX_RIGHT_EXECUTE**.)
**ZX_BTI_CONTIGUOUS** is only allowed if *vmo* was allocated via
[`zx_vmo_create_contiguous()`] or [`zx_vmo_create_physical()`].
**ZX_BTI_COMPRESS** and **ZX_BTI_CONTIGUOUS** are mutually exclusive.
If the range in *vmo* specified by *offset* and *size* contains non-committed
pages, a successful invocation of this function will result in those pages
having been committed. On failure, it is undefined whether they have been
committed.
*addrs* will be populated with the device-physical addresses of the requested
VMO pages. These addresses may be given to devices that issue memory
transactions with the hardware transaction ID associated with the BTI. The
number of addresses returned depends on whether the **ZX_BTI_COMPRESS** or
**ZX_BTI_CONTIGUOUS** options were given. The number of addresses will be one
of three possibilities:
1. If neither is set, one per page (`size / PAGE_SIZE`).
2. If **ZX_BTI_COMPRESS** is set, `size / minimum-contiguity`, rounded up
(each address representing a run of *minimum-contiguity* run of bytes,
with the last one being potentially short if *size* is not a multiple of
*minimum-contiguity*). It is guaranteed that all returned addresses will be
*minimum-contiguity*-aligned. Note that *minimum-contiguity* is discoverable
via [`zx_object_get_info()`].
3. If **ZX_BTI_CONTIGUOUS** is set, the single address of the start of the memory.
*num_addrs* is the number of entries in the *addrs* array. It is an error for
*num_addrs* to not match the value calculated above.
The PMT retains a reference to the associated VMO, so the underlying VMO won't be
destroyed until the PMT is unpinned.
Resizable VMOs can be pinned. If a call to [`zx_vmo_set_size()`] would discard
pinned pages, that call will fail.
## Options
- **ZX_BTI_PERM_READ**, **ZX_BTI_PERM_WRITE**, and **ZX_BTI_PERM_EXECUTE** define
the access types that the hardware bus transaction initiator will be allowed
to use.
- **ZX_BTI_COMPRESS** causes the returned address list to contain one entry per
block of *minimum-contiguity* bytes, rather than one per *PAGE_SIZE*.
## Rights
*handle* must be of type **ZX_OBJ_TYPE_BTI** and have **ZX_RIGHT_MAP**.
*vmo* must be of type **ZX_OBJ_TYPE_VMO** and have **ZX_RIGHT_MAP**.
If *options* & **ZX_BTI_PERM_READ**, *vmo* must be of type **ZX_OBJ_TYPE_VMO** and have **ZX_RIGHT_READ**.
If *options* & **ZX_BTI_PERM_WRITE**, *vmo* must be of type **ZX_OBJ_TYPE_VMO** and have **ZX_RIGHT_WRITE**.
If *options* & **ZX_BTI_PERM_EXECUTE**, *vmo* must be of type **ZX_OBJ_TYPE_VMO** and have **ZX_RIGHT_READ**.
## Return value
On success, `zx_bti_pin()` returns **ZX_OK**. The device-physical addresses of the
requested VMO pages will be written in *addrs*. A handle to the created Pinned
Memory Token is returned via *pmt*. When the PMT is no longer needed,
[`zx_pmt_unpin()`] should be invoked.
In the event of failure, a negative error value is returned.
## Errors
**ZX_ERR_BAD_HANDLE** *handle* or *vmo* is not a valid handle.
**ZX_ERR_WRONG_TYPE** *handle* is not a BTI handle or *vmo* is not a VMO
handle.
**ZX_ERR_ACCESS_DENIED** *handle* or *vmo* does not have the **ZX_RIGHT_MAP**,
or *options* contained a permissions flag corresponding to a right that *vmo*
does not have.
**ZX_ERR_INVALID_ARGS** *options* is 0 or contains an undefined flag, either
*addrs* or *pmt* is not a valid pointer, *num_addrs* is not the same as the
number of entries that would be returned, or *offset* or *size* is not
page-aligned.
**ZX_ERR_OUT_OF_RANGE** `offset + size` is out of the bounds of *vmo*.
**ZX_ERR_UNAVAILABLE** (Temporary) At least one page in the requested range
could not be pinned at this time.
**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.
## See also
- [`zx_bti_create()`]
- [`zx_object_get_info()`]
- [`zx_pmt_unpin()`]
[`zx_bti_create()`]: bti_create.md
[`zx_object_get_info()`]: object_get_info.md
[`zx_pmt_unpin()`]: pmt_unpin.md
[`zx_vmo_create_contiguous()`]: vmo_create_contiguous.md
[`zx_vmo_create_physical()`]: vmo_create_physical.md
[`zx_vmo_op_range()`]: vmo_op_range.md
[`zx_vmo_set_size()`]: vmo_set_size.md