摘要
创建中断对象。
声明
#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);
说明
zx_interrupt_create() 创建一个中断对象,表示(物理)中断#physical-interrupts 或(虚拟)中断#virtual-interrupts 中断。强烈建议 Zircon 中断对象的用户先阅读(中断对象)中断概览文档,熟悉中断对象的运行模式,然后再在代码中使用它们。
如需创建物理中断,用户必须: + 通过 src_obj 参数传递用于创建平台中断的合适资源句柄或 PCI 对象句柄。 + 通过 src_num 参数传递关联的中断编号。
需要平台资源或 PCI 对象句柄在很大程度上限制了中断的创建,使其仅限于驱动程序框架的内部。驱动程序通常通过各种驱动程序框架 API 获取物理中断。
实体中断会遵循 ZX_INTERRUPT_MODE_EDGE_LOW、ZX_INTERRUPT_MODE_EDGE_HIGH、ZX_INTERRUPT_MODE_LEVEL_LOW、ZX_INTERRUPT_MODE_LEVEL_HIGH 和 ZX_INTERRUPT_REMAP_IRQ 选项。
如需创建虚拟中断,用户可以通过 options 参数传递 ZX_INTERRUPT_VIRTUAL 标志。虚拟中断始终表现为边沿触发中断,其极性无需指定,因为它们是由软件通过调用 zx_interrupt_trigger()(而非硬件信号)触发的。
无论是物理中断还是虚拟中断,都会遵循 ZX_INTERRUPT_TIMESTAMP_MONO 选项。
使用此选项创建的中断将从 zx_interrupt_wait() 返回单调时间戳,并将传递给 zx_interrupt_trigger() 的时间戳视为单调时间轴上的时间戳。默认情况下,这些时间戳在启动时间轴上运行。
这些句柄将具有 ZX_RIGHT_INSPECT、ZX_RIGHT_DUPLICATE、ZX_RIGHT_TRANSFER(允许通过 zx_channel_write() 将其发送到另一个进程)、ZX_RIGHT_READ、ZX_RIGHT_WRITE(zx_interrupt_ack() 所需)、ZX_RIGHT_WAIT(zx_interrupt_wait() 所需)和 ZX_RIGHT_SIGNAL(zx_interrupt_trigger() 所需)。
当发生底层物理中断或在虚拟中断上调用 zx_interrupt_trigger() 时,中断会被“触发”。当触发的中断绑定到具有 zx_interrupt_bind() 的端口时,会导致数据包被传递到该端口。或者,如果中断未绑定到端口,用户可以使用对 zx_interrupt_wait() 的调用来阻塞中断上的线程,直到触发中断。
接收到中断发生(来自端口数据包或对 zx_interrupt_wait() 的调用)的通知,并在处理完成后确认中断是一个中等复杂程度的过程,具体取决于多种因素。如需了解详情,请参阅(此处)Interrupts#waiting-for-and-acknowledging-interrupts。
权限
src_obj 必须具有资源种类 ZX_RSRC_KIND_IRQ。
返回值
如果成功,zx_interrupt_create() 会返回 ZX_OK。如果失败,则返回负错误值。
错误
ZX_ERR_BAD_HANDLE src_obj 句柄无效(如果这不是虚拟中断)
ZX_ERR_WRONG_TYPE src_obj 句柄的类型不适合创建中断。
ZX_ERR_ACCESS_DENIED src_obj 句柄不允许执行此操作。
ZX_ERR_INVALID_ARGS options 包含无效标志,或者 out_handle 参数是无效指针。
ZX_ERR_NO_MEMORY 因内存不足而导致的失败。
用户空间无法很好地处理此(不太可能发生的)错误。在未来的 build 中,此错误将不再发生。