Create a resource object.


#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);


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.


parent_rsrc must be of type ZX_OBJ_TYPE_RESOURCE and have ZX_RIGHT_WRITE.


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