// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(fxb/39732): This should be read as "library zx".
library zz;

[Transport = "Syscall"]
protocol interrupt {
    /// Create an interrupt object.
    /// Rights: src_obj must have resource kind ZX_RSRC_KIND_IRQ.
    interrupt_create(handle<resource> src_obj, uint32 src_num, uint32 options)
        -> (status status, handle<interrupt> out_handle);

    /// Bind an interrupt object to a port.
    /// Rights: handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_READ.
    /// Rights: port_handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE.
    interrupt_bind(handle<interrupt> handle, handle<port> port_handle, uint64 key, uint32 options)
        -> (status status);

    /// Wait for an interrupt.
    /// Rights: handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_WAIT.
    [blocking]
    interrupt_wait(handle<interrupt> handle) -> (status status, optional_time out_timestamp);

    // TODO(ZX-2967): No DESTROY rights here.
    /// Destroys an interrupt object.
    interrupt_destroy(handle<interrupt> handle) -> (status status);

    /// Acknowledge an interrupt and re-arm it.
    /// Rights: handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_WRITE.
    interrupt_ack(handle<interrupt> handle) -> (status status);

    /// Triggers a virtual interrupt object.
    /// Rights: handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_SIGNAL.
    interrupt_trigger(handle<interrupt> handle, uint32 options, time timestamp) -> (status status);

    /// Bind an interrupt object to a VCPU.
    /// Rights: handle must be of type ZX_OBJ_TYPE_INTERRUPT and have ZX_RIGHT_READ.
    /// Rights: vcpu must be of type ZX_OBJ_TYPE_VCPU and have ZX_RIGHT_WRITE.
    interrupt_bind_vcpu(handle<interrupt> handle, handle<vcpu> vcpu, uint32 options)
        -> (status status);
};
