blob: 6956859081158d47c02603fb724ab9468799dc2a [file] [log] [blame] [view]
# 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_MMIO**, **ZX_RSRC_KIND_IOPORT**,
**ZX_RSRC_KIND_IRQ**, **ZX_RSRC_KIND_SMC**, and **ZX_RSRC_KIND_SYSTEM**.
The system resource is a special case that contains other resources, all of which have *len*
one. These resources each have their own base within the system resource. Valid *base*
values for the system resource 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**, **ZX_RSRC_SYSTEM_MEXEC_BASE**,
**ZX_RSRC_SYSTEM_ENERGY_INFO_BASE**, **ZX_RSRC_SYSTEM_IOMMU_BASE**,
**ZX_RSRC_SYSTEM_FRAMEBUFFER_BASE**, **ZX_RSRC_SYSTEM_PROFILE_BASE**,
**ZX_RSRC_SYSTEM_MSI_BASE**, and **ZX_SYSTEM_DEBUGLOG_BASE**.
New resources may be created with an appropriate parent resource by calling
[`zx_resource_create()`]. An initial resource of each *kind* 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()`]: /reference/syscalls/interrupt_create.md
[`zx_ioports_request()`]: /reference/syscalls/ioports_request.md
[`zx_resource_create()`]: /reference/syscalls/resource_create.md
[`zx_vmo_create_physical()`]: /reference/syscalls/vmo_create_physical.md