| # zx_interrupt_create | |
| ## NAME | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| Create an interrupt object. | |
| ## SYNOPSIS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| ```c | |
| #include <zircon/syscalls.h> | |
| zx_status_t zx_interrupt_create(zx_handle_t src_obj, | |
| uint32_t src_num, | |
| uint32_t options, | |
| zx_handle_t* out_handle); | |
| ``` | |
| ## DESCRIPTION | |
| `zx_interrupt_create()` creates an interrupt object which represents a physical | |
| or virtual interrupt. | |
| If *options* is **ZX_INTERRUPT_VIRTUAL**, *src_obj* and *src_num* are ignored and | |
| a virtual interrupt is returned. | |
| Otherwise *src_obj* must be a suitable resource for creating platform interrupts | |
| or a PCI object, and *src_num* is the associated interrupt number. This restricts | |
| the creation of interrupts to the internals of the DDK (driver development kit). | |
| Physical interrupts are obtained by drivers through various DDK APIs. | |
| Physical interrupts honor the options **ZX_INTERRUPT_EDGE_LOW**, **ZX_INTERRUPT_EDGE_HIGH**, | |
| **ZX_INTERRUPT_LEVEL_LOW**, **ZX_INTERRUPT_LEVEL_HIGH**, and **ZX_INTERRUPT_REMAP_IRQ**. | |
| The handles will have **ZX_RIGHT_INSPECT**, **ZX_RIGHT_DUPLICATE**, **ZX_RIGHT_TRANSFER** | |
| (allowing them to be sent to another process via [`zx_channel_write()`]), **ZX_RIGHT_READ**, | |
| **ZX_RIGHT_WRITE** (required for [`zx_interrupt_ack()`]), **ZX_RIGHT_WAIT** (required for | |
| [`zx_interrupt_wait()`], and **ZX_RIGHT_SIGNAL** (required for [`zx_interrupt_trigger()`]). | |
| Interrupts are said to be "triggered" when the underlying physical interrupt occurs | |
| or when [`zx_interrupt_trigger()`] is called on a virtual interrupt. A triggered interrupt, | |
| when bound to a port with [`zx_interrupt_bind()`], causes a packet to be delivered to the port. | |
| If not bound to a port, an interrupt object may be waited on with [`zx_interrupt_wait()`]. | |
| Interrupts cannot be waited on with the `zx_object_wait_` family of calls. | |
| ## RIGHTS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| *src_obj* must have resource kind **ZX_RSRC_KIND_IRQ**. | |
| ## RETURN VALUE | |
| `zx_interrupt_create()` returns **ZX_OK** on success. In the event | |
| of failure, a negative error value is returned. | |
| ## ERRORS | |
| **ZX_ERR_BAD_HANDLE** the *src_obj* handle is invalid (if this is not a virtual interrupt) | |
| **ZX_ERR_WRONG_TYPE** the *src_obj* handle is not of an appropriate type to create an interrupt. | |
| **ZX_ERR_ACCESS_DENIED** the *src_obj* handle does not allow this operation. | |
| **ZX_ERR_INVALID_ARGS** *options* contains invalid flags or the *out_handle* | |
| parameter is an invalid pointer. | |
| **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_ack()`] | |
| - [`zx_interrupt_bind()`] | |
| - [`zx_interrupt_destroy()`] | |
| - [`zx_interrupt_wait()`] | |
| - [`zx_port_wait()`] | |
| <!-- References updated by update-docs-from-fidl, do not edit. --> | |
| [`zx_channel_write()`]: channel_write.md | |
| [`zx_handle_close()`]: handle_close.md | |
| [`zx_interrupt_ack()`]: interrupt_ack.md | |
| [`zx_interrupt_bind()`]: interrupt_bind.md | |
| [`zx_interrupt_destroy()`]: interrupt_destroy.md | |
| [`zx_interrupt_trigger()`]: interrupt_trigger.md | |
| [`zx_interrupt_wait()`]: interrupt_wait.md | |
| [`zx_port_wait()`]: port_wait.md |