// 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
// Do not use ZX_WAIT_ASYNC_ONCE. It is now superfluous and will be removed.
#define ZX_WAIT_ASYNC_ONCE          ((uint32_t)0u)
#define ZX_WAIT_ASYNC_TIMESTAMP     ((uint32_t)1u)
#define ZX_WAIT_ASYNC_EDGE          ((uint32_t)2u)

// packet types.  zx_port_packet_t::type
#define ZX_PKT_TYPE_USER            ((uint8_t)0x00u)
#define ZX_PKT_TYPE_SIGNAL_ONE      ((uint8_t)0x01u)
// 0x02 was previously used for "ZX_PKT_TYPE_SIGNAL_REP".
#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_PAGE_REQUEST    ((uint8_t)0x09u)

// For options passed to port_create
#define ZX_PORT_BIND_TO_INTERRUPT   ((uint32_t)(0x1u << 0))

#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_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_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.
typedef struct zx_packet_signal {
  zx_signals_t trigger;
  zx_signals_t observed;
  uint64_t count;
  uint64_t timestamp;
  uint64_t reserved1;
} zx_packet_signal_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;
  uint8_t padding1[4];
  uint64_t data;
  uint64_t reserved;
#elif __x86_64__
  zx_gpaddr_t cr3;
  zx_vaddr_t rip;
  uint8_t instruction_size;
  // 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[6];
#endif
} zx_packet_guest_mem_t;

typedef struct zx_packet_guest_io {
  uint16_t port;
  uint8_t access_size;
  bool input;
  union {
    struct {
      uint8_t u8;
      uint8_t padding1[3];
    };
    struct {
      uint16_t u16;
      uint8_t padding2[2];
    };
    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;
      uint8_t padding1[7];
    } interrupt;
    struct {
      uint64_t id;
      zx_gpaddr_t entry;
    } startup;
  };
  uint8_t type;
  uint8_t padding1[7];
  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_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_
