| // Copyright 2016 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 SYSROOT_ZIRCON_SYSCALLS_PORT_H_ |
| #define SYSROOT_ZIRCON_SYSCALLS_PORT_H_ |
| |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| |
| __BEGIN_CDECLS |
| |
| // clang-format off |
| |
| // zx_object_wait_async() options |
| #define ZX_WAIT_ASYNC_ONCE ((uint32_t)0u) |
| |
| // packet types. zx_port_packet_t::type |
| #define ZX_PKT_TYPE_USER ((uint8_t)0x00u) |
| #define ZX_PKT_TYPE_SIGNAL_ONE ((uint8_t)0x01u) |
| #define ZX_PKT_TYPE_SIGNAL_REP ((uint8_t)0x02u) |
| #define ZX_PKT_TYPE_GUEST_BELL ((uint8_t)0x03u) |
| #define ZX_PKT_TYPE_GUEST_MEM ((uint8_t)0x04u) |
| #define ZX_PKT_TYPE_GUEST_IO ((uint8_t)0x05u) |
| #define ZX_PKT_TYPE_GUEST_VCPU ((uint8_t)0x06u) |
| #define ZX_PKT_TYPE_INTERRUPT ((uint8_t)0x07u) |
| #define ZX_PKT_TYPE_EXCEPTION(n) ((uint32_t)(0x08u | (((n) & 0xFFu) << 8))) |
| #define ZX_PKT_TYPE_PAGE_REQUEST ((uint8_t)0x09u) |
| |
| // For options passed to port_create |
| #define ZX_PORT_BIND_TO_INTERRUPT ((uint32_t)(0x1u << 0)) |
| |
| #define ZX_PKT_TYPE_MASK ((uint32_t)0x000000FFu) |
| |
| #define ZX_PKT_IS_USER(type) ((type) == ZX_PKT_TYPE_USER) |
| #define ZX_PKT_IS_SIGNAL_ONE(type) ((type) == ZX_PKT_TYPE_SIGNAL_ONE) |
| #define ZX_PKT_IS_SIGNAL_REP(type) ((type) == ZX_PKT_TYPE_SIGNAL_REP) |
| #define ZX_PKT_IS_GUEST_BELL(type) ((type) == ZX_PKT_TYPE_GUEST_BELL) |
| #define ZX_PKT_IS_GUEST_MEM(type) ((type) == ZX_PKT_TYPE_GUEST_MEM) |
| #define ZX_PKT_IS_GUEST_IO(type) ((type) == ZX_PKT_TYPE_GUEST_IO) |
| #define ZX_PKT_IS_GUEST_VCPU(type) ((type) == ZX_PKT_TYPE_GUEST_VCPU) |
| #define ZX_PKT_IS_INTERRUPT(type) ((type) == ZX_PKT_TYPE_INTERRUPT) |
| #define ZX_PKT_IS_EXCEPTION(type) (((type) & ZX_PKT_TYPE_MASK) == ZX_PKT_TYPE_EXCEPTION(0)) |
| #define ZX_PKT_IS_PAGE_REQUEST(type) ((type) == ZX_PKT_TYPE_PAGE_REQUEST) |
| |
| // zx_packet_guest_vcpu_t::type |
| #define ZX_PKT_GUEST_VCPU_INTERRUPT ((uint8_t)0) |
| #define ZX_PKT_GUEST_VCPU_STARTUP ((uint8_t)1) |
| |
| // zx_packet_page_request_t::command |
| #define ZX_PAGER_VMO_READ ((uint16_t) 0) |
| #define ZX_PAGER_VMO_COMPLETE ((uint16_t) 1) |
| // clang-format on |
| |
| // port_packet_t::type ZX_PKT_TYPE_USER. |
| typedef union zx_packet_user { |
| uint64_t u64[4]; |
| uint32_t u32[8]; |
| uint16_t u16[16]; |
| uint8_t c8[32]; |
| } zx_packet_user_t; |
| |
| // port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE and ZX_PKT_TYPE_SIGNAL_REP. |
| typedef struct zx_packet_signal { |
| zx_signals_t trigger; |
| zx_signals_t observed; |
| uint64_t count; |
| uint64_t reserved0; |
| uint64_t reserved1; |
| } zx_packet_signal_t; |
| |
| typedef struct zx_packet_exception { |
| uint64_t pid; |
| uint64_t tid; |
| uint64_t reserved0; |
| uint64_t reserved1; |
| } zx_packet_exception_t; |
| |
| typedef struct zx_packet_guest_bell { |
| zx_gpaddr_t addr; |
| uint64_t reserved0; |
| uint64_t reserved1; |
| uint64_t reserved2; |
| } zx_packet_guest_bell_t; |
| |
| typedef struct zx_packet_guest_mem { |
| zx_gpaddr_t addr; |
| #if __aarch64__ |
| uint8_t access_size; |
| bool sign_extend; |
| uint8_t xt; |
| bool read; |
| uint64_t data; |
| uint64_t reserved; |
| #elif __x86_64__ |
| // NOTE: x86 instructions are guaranteed to be 15 bytes or fewer. |
| #define X86_MAX_INST_LEN 15u |
| uint8_t inst_len; |
| uint8_t inst_buf[X86_MAX_INST_LEN]; |
| // This is the default operand size as determined by the CS and EFER register (Volume 3, |
| // Section 5.2.1). If operating in 64-bit mode then near branches and all instructions, except |
| // far branches, that implicitly reference the RSP will actually have a default operand size of |
| // 64-bits (Volume 2, Section 2.2.1.7), and not the 32-bits that will be given here. |
| uint8_t default_operand_size; |
| uint8_t reserved[7]; |
| #endif |
| } zx_packet_guest_mem_t; |
| |
| typedef struct zx_packet_guest_io { |
| uint16_t port; |
| uint8_t access_size; |
| bool input; |
| union { |
| uint8_t u8; |
| uint16_t u16; |
| uint32_t u32; |
| uint8_t data[4]; |
| }; |
| uint64_t reserved0; |
| uint64_t reserved1; |
| uint64_t reserved2; |
| } zx_packet_guest_io_t; |
| |
| typedef struct zx_packet_guest_vcpu { |
| union { |
| struct { |
| uint64_t mask; |
| uint8_t vector; |
| } interrupt; |
| struct { |
| uint64_t id; |
| zx_gpaddr_t entry; |
| } startup; |
| }; |
| uint8_t type; |
| uint64_t reserved; |
| } zx_packet_guest_vcpu_t; |
| |
| typedef struct zx_packet_interrupt { |
| zx_time_t timestamp; |
| uint64_t reserved0; |
| uint64_t reserved1; |
| uint64_t reserved2; |
| } zx_packet_interrupt_t; |
| |
| typedef struct zx_packet_page_request { |
| uint16_t command; |
| uint16_t flags; |
| uint32_t reserved0; |
| uint64_t offset; |
| uint64_t length; |
| uint64_t reserved1; |
| } zx_packet_page_request_t; |
| |
| typedef struct zx_port_packet { |
| uint64_t key; |
| uint32_t type; |
| zx_status_t status; |
| union { |
| zx_packet_user_t user; |
| zx_packet_signal_t signal; |
| zx_packet_exception_t exception; |
| zx_packet_guest_bell_t guest_bell; |
| zx_packet_guest_mem_t guest_mem; |
| zx_packet_guest_io_t guest_io; |
| zx_packet_guest_vcpu_t guest_vcpu; |
| zx_packet_interrupt_t interrupt; |
| zx_packet_page_request_t page_request; |
| }; |
| } zx_port_packet_t; |
| |
| __END_CDECLS |
| |
| #endif // SYSROOT_ZIRCON_SYSCALLS_PORT_H_ |