blob: 31aee485e7e6d97cca7181e8480c596943b7546e [file] [log] [blame] [view] [edit]
<!--
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_iob_create
## Summary
Create an IOBuffer with a set of options.
## Declaration
```c
#include <zircon/syscalls.h>
zx_status_t zx_iob_create(uint64_t options,
const zx_iob_region_t* regions,
uint32_t region_count,
zx_handle_t* ep0_out,
zx_handle_t* ep1_out);
```
## Description
`zx_iob_create()` creates an IOBuffer, a memory object designed for
efficient point-to-point communication. An IOBuffer can be thought
of an abstraction over a shared buffer with (optionally kernel mediated)
reads and writes that maintain data integrity and enforce permissions.
An IOBuffer may have multiple regions, specified by *region_count*.
Each region may be set to support varying access patterns or permissions
configured by **regions*.
### Region Descriptions
The geometry and configuration of a region are specified by a `zx_iob_region_t`
region description structure. The base structure includes fields that are common
to all region types.
```C++
struct zx_iob_region_t {
uint32_t type;
uint32_t access;
uint64_t size;
zx_iob_discipline_t discipline;
union {
zx_iob_region_private_t private_region;
uint8_t max_extension[4 * 8];
};
};
```
*type* specifies the type of the region and memory object backing it.
The valid types are:
- ZX_IOB_REGION_TYPE_PRIVATE: a region backed by a private memory
uniquely owned by the IOB.
*access* specifies the access control modifiers for each endpoint. It
must be a combination of one or more of:
- **ZX_IOB_EP0_CAN_MAP_READ** to grant endpoint 0 to ability to map the region as readable
- **ZX_IOB_EP0_CAN_MAP_WRITE** to grant endpoint 0 to ability to map the region as writable
- **ZX_IOB_EP1_CAN_MAP_READ** to grant endpoint 1 to ability to map the region as readable
- **ZX_IOB_EP1_CAN_MAP_WRITE** to grant endpoint 1 to ability to map the region as writable
*size* is the requested size of the region in bytes. The size will be
rounded up to the next system page size boundary, as reported by
zx_system_get_page_size(). Use `zx_object_get_info` with topic
`ZX_INFO_IOB_REGIONS` to determine the actual size of the region.
*discipline* specifies the memory access discipline to employ for
kernel-mediated operations. The valid disciplines are:
- ZX_IOB_DISCIPLINE_TYPE_NONE: a free form region with no kernel mediated operations.
### Region Types
#### ZX_IOB_REGION_TYPE_PRIVATE
Specifies a region backed by a private memory object uniquely owned by the IOB.
This memory object is only accessible through operations on, and mappings of,
the owning IOB.
```
struct zx_iob_region_private_t {
uint64_t options;
};
```
*options* must be 0
### Discipline Types
#### ZX_IOB_DISCIPLINE_TYPE_NONE
```C++
struct iob_discipline_t {
uint64_t type; // Must be ZX_IOB_DISCIPLINE_TYPE_NONE
};
```
Specifies a free form region with no kernel mediated operations.
## Return value
`zx_iob_create()` returns **ZX_OK** on success. In the event of failure,
a negative error value is returned.
## Errors
**ZX_ERR_INVALID_ARGS** *ep_out0* or *ep_out1* is an invalid pointer or
NULL, *options* is any value other than 0, or the regions configuration
is invalid
**ZX_ERR_NO_MEMORY** Failure due to lack of memory to allocated the
requested buffers.