blob: 9542fe3285001ca52183865b8ccba00751af67e5 [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_resource_create
## Summary
Create a resource object.
## Declaration
```c
#include <zircon/syscalls.h>
zx_status_t zx_resource_create(zx_handle_t parent_rsrc,
uint32_t options,
uint64_t base,
size_t size,
const char* name,
size_t name_size,
zx_handle_t* resource_out);
```
## Description
`zx_resource_create()` creates a resource object for use with other DDK
syscalls. Resources are typically handed out to bus drivers and rarely need to
be interacted with directly by drivers using driver protocols. Resource objects
grant access to an address space range starting at *base* up to but not
including *base* + *size*. Two special values for *kind* exist:
**ZX_RSRC_KIND_ROOT** and **ZX_RSRC_KIND_SYSTEM**. The root resource has no range
associated with it. The system resource is a ranged resource which is the parent
of a number of resources, all of *size* 1, which are used as privileged checks
for syscalls.
*parent_rsrc* must be a handle to a resource of *kind* **ZX_RSRC_KIND_ROOT**, or
a resource that matches the requested *kind* and contains [*base*, *base*+*size*]
in its range.
*options* must specify which kind of resource to create and may contain optional
flags. Valid kinds of resources are **ZX_RSRC_KIND_MMIO**, **ZX_RSRC_KIND_IRQ**,
**ZX_RSRC_KIND_IOPORT** (x86 only), **ZX_RSRC_KIND_ROOT**, **ZX_RSRC_KIND_SMC**
(ARM only), and **ZX_RSRC_KIND_SYSTEM**.
Valid bases for **ZX_RSRC_KIND_SYSTEM** are **ZX_RSRC_SYSTEM_HYPERVISOR_BASE**,
**ZX_RSRC_SYSTEM_VMEX_BASE**, **ZX_RSRC_SYSTEM_DEBUG_BASE**,
**ZX_RSRC_SYSTEM_INFO_BASE**, **ZX_RSRC_SYSTEM_CPU_BASE**,
**ZX_RSRC_SYSTEM_POWER_BASE**, and **ZX_RSRC_SYSTEM_MEXEC_BASE**. These all have
*size* 1.
**ZX_RSRC_KIND_ROOT** must be paired with zero values for *base* and *size*, as
it does not use an address space range.
The **ZX_RSRC_FLAG_EXCLUSIVE** flag is optional. If **ZX_RSRC_FLAG_EXCLUSIVE** is
provided then the syscall will attempt to exclusively reserve the requested
address space region, preventing other resources creation from overlapping with
it as long as it exists.
*name* and *name_size* are optional and truncated to **ZX_MAX_NAME_LENGTH** - 1.
This name is provided for debugging / tool use only and is not used by the
kernel.
On success, a valid resource handle is returned in *resource_out*.
## Return value
`zx_resource_create()` returns **ZX_OK** on success. In the event of failure, a
negative error value is returned.
The returned handle will have **ZX_RIGHT_TRANSFER** (allowing it to be sent to
another process via [`zx_channel_write()`]), **ZX_RIGHT_DUPLICATE** (allowing
the handle to be duplicated), **ZX_RIGHT_INSPECT** (to allow inspection of the
object with [`zx_object_get_info()`] and **ZX_RIGHT_WRITE** which is checked by
`zx_resource_create()` itself.
## Rights
*parent_rsrc* must be of type **ZX_OBJ_TYPE_RESOURCE** and have **ZX_RIGHT_WRITE**.
## Errors
**ZX_ERR_BAD_HANDLE** the *parent_rsrc* handle is invalid.
**ZX_ERR_WRONG_TYPE** the *parent_rsrc* handle is not a resource handle.
**ZX_ERR_ACCESS_DENIED** The *parent_rsrc* handle is not a resource of either
*kind* or **ZX_RSRC_KIND_ROOT**.
**ZX_ERR_INVALID_ARGS** *options* contains an invalid kind or flag combination,
*name* is an invalid pointer, or the *kind* specified is **ZX_RSRC_KIND_ROOT**
but *base* and *size* are not 0.
**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_handle_close()`]
- [`zx_interrupt_create()`]
- [`zx_ioports_request()`]
- [`zx_vmo_create_physical()`]
[`zx_channel_write()`]: channel_write.md
[`zx_handle_close()`]: handle_close.md
[`zx_interrupt_create()`]: interrupt_create.md
[`zx_ioports_request()`]: ioports_request.md
[`zx_object_get_info()`]: object_get_info.md
[`zx_vmo_create_physical()`]: vmo_create_physical.md