blob: 814d9ef7ce8cd41387d74d999b9fa9d95504c89c [file] [log] [blame]
// Copyright 2018 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.
#ifndef LIB_ASYNC_TRAP_H_
#define LIB_ASYNC_TRAP_H_
#include <lib/async/dispatcher.h>
__BEGIN_CDECLS
// Handles an asynchronous trap access.
//
// The |status| is |ZX_OK| if the bell was received and |bell| contains the
// information from the packet, otherwise |bell| is null.
typedef void(async_guest_bell_trap_handler_t)(async_dispatcher_t* dispatcher,
async_guest_bell_trap_t* trap,
zx_status_t status,
const zx_packet_guest_bell_t* bell);
// Holds context for a bell trap and its handler.
//
// After successfully posting setting the trap, the client is responsible for retaining
// the structure in memory (and unmodified) until the guest has been destroyed or the
// dispatcher shuts down. There is no way to cancel a trap which has been set.
struct async_guest_bell_trap {
// Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
async_state_t state;
// The handler to invoke to handle the trap access.
async_guest_bell_trap_handler_t* handler;
};
// Sets a bell trap in the guest to be handled asynchronously via a handler.
//
// |guest| is the handle of the guest the trap will be set on.
// |addr| is the base address for the trap in the guest's physical address space.
// |length| is the size of the trap in the guest's physical address space.
//
// Returns |ZX_OK| if the trap was successfully set.
// Returns |ZX_ERR_ACCESS_DENIED| if the guest does not have |ZX_RIGHT_WRITE|.
// Returns |ZX_ERR_ALREADY_EXISTS| if a bell trap with the same |addr| exists.
// Returns |ZX_ERR_INVALID_ARGS| if |addr| or |length| are invalid.
// Returns |ZX_ERR_OUT_OF_RANGE| if |addr| or |length| are out of range of the
// address space.
// Returns |ZX_ERR_WRONG_TYPE| if |guest| is not a handle to a guest.
// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
//
// This operation is thread-safe.
zx_status_t async_set_guest_bell_trap(async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
zx_handle_t guest, zx_vaddr_t addr, size_t length);
__END_CDECLS
#endif // LIB_ASYNC_TRAP_H_