| # Resource | |
| ## NAME | |
| resource - Address space rights and accounting | |
| ## SYNOPSIS | |
| A resource is an immutable object that is used to validate access to syscalls | |
| that create objects backed by address space, or permit access to address space. | |
| These include [vm objects](vm_object.md), [interrupts](interrupts.md), and x86 | |
| ioports. | |
| ## DESCRIPTION | |
| Resources are used to gate access to specific regions of address space and are | |
| required to create VMOs and IRQs, as well as accessing x86 ioports. | |
| A resource object consists of a single resource *kind*, with *base* address and | |
| *len* parameters that define a range of address space the holder of the resource | |
| is granted access to. The range covers *base* up to but not including *base* + | |
| *len*. These objects are immutable after creation. Valid *kind* values are | |
| **ZX_RSRC_KIND_ROOT**, **ZX_RSRC_KIND_HYPERVISOR**, **ZX_RSRC_KIND_MMIO**, | |
| **ZX_RSRC_KIND_IOPORT**, **ZX_RSRC_KIND_IRQ**, **ZX_RSRC_KIND_VMEX**, and | |
| **ZX_RSRC_KIND_SMC**. New resources may be created with an appropriate parent | |
| resource by calling [`zx_resource_create()`]. An initial root | |
| resource is created by the kernel during boot and handed off to the first | |
| userspace process started by userboot. | |
| Appropriate parent resources are the root resource, or a resource whose own range | |
| from *base* to *base+len* contains the range requested for the new resource. The | |
| *kind* of a parent resource must match the *kind* of the resource being created. | |
| At this time, *exclusive* resources cannot be used to create new resources. After | |
| creation there is no relation between the resource parent used and the new resource | |
| created. | |
| Resource allocations can be either *shared* or *exclusive*. A shared resource | |
| grants the permission to access the given address space, but does not reserve | |
| that address space exclusively for the owner of the resource. An exclusive | |
| resource grants access to the region to only the holder of the exclusive | |
| resource. Exclusive and shared resource ranges may not overlap. | |
| Resources are lifecycle tracked and upon the last handle being closed will be | |
| freed. In the case of exclusive resources this means the given address range | |
| will be released back to the allocator for the given *kind* of resource. Objects | |
| created through a resource do not hold a reference to the resource and thus do | |
| not keep it alive. | |
| ## NOTES | |
| Resources are typically private to the DDK and platform bus drivers. Presently, | |
| this means ACPI and platform bus hold the root resource respectively and hand | |
| out more fine-grained resources to other drivers. | |
| ## SYSCALLS | |
| - [`zx_interrupt_create()`] | |
| - [`zx_ioports_request()`] | |
| - [`zx_resource_create()`] | |
| - [`zx_vmo_create_physical()`] | |
| [`zx_interrupt_create()`]: /docs/reference/syscalls/interrupt_create.md | |
| [`zx_ioports_request()`]: /docs/reference/syscalls/ioports_request.md | |
| [`zx_resource_create()`]: /docs/reference/syscalls/resource_create.md | |
| [`zx_vmo_create_physical()`]: /docs/reference/syscalls/vmo_create_physical.md |