| # zx_resource_create | |
| ## NAME | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| Create a resource object. | |
| ## SYNOPSIS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| ```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_HYPERVISOR**. These resources have no | |
| range associated with them and are used as a privilege check. | |
| *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_HYPERVISOR**, **ZX_RSRC_KIND_VMEX**, and **ZX_RSRC_KIND_SMC** | |
| (ARM only). | |
| **ZX_RSRC_KIND_ROOT**, **ZX_RSRC_KIND_HYPERVISOR**, and **ZX_RSRC_KIND_VMEX** | |
| must be paired with zero values for *base* and *size*, as they do not use | |
| an address space range. | |
| At this time the only optional flag is **ZX_RSRC_FLAG_EXCLUSIVE**. 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 | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| *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 one of | |
| **ZX_RSRC_KIND_ROOT** or **ZX_RSRC_KIND_HYPERVISOR** 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()`] | |
| <!-- References updated by update-docs-from-fidl, do not edit. --> | |
| [`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 |