| // 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; |
| |
| // port_packet_t::type ZX_PKT_TYPE_USER. |
| union PacketUser { |
| 1: array<uint64>:4 u64; |
| 2: array<uint32>:8 u32; |
| 3: array<uint16>:16 u16; |
| 4: array<int8>:32 c8; |
| }; |
| |
| // port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE. |
| struct PacketSignal { |
| signals trigger; |
| signals observed; |
| uint64 count; |
| uint64 reserved0; |
| uint64 reserved1; |
| }; |
| |
| struct PacketException { |
| uint64 pid; |
| uint64 tid; |
| uint64 reserved0; |
| uint64 reserved1; |
| }; |
| |
| struct PacketGuestBell { |
| gpaddr addr; |
| uint64 reserved0; |
| uint64 reserved1; |
| uint64 reserved2; |
| }; |
| |
| // TODO(scottmg): Arch-specific definition. |
| struct PacketGuestMem { |
| gpaddr 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 |
| }; |
| |
| struct PacketGuestIo { |
| uint16 port; |
| uint8 access_size; |
| bool input; |
| // TODO(scottmg): Unnamed union. |
| //union { |
| // uint8_t u8; |
| // uint16_t u16; |
| // uint32_t u32; |
| // uint8_t data[4]; |
| //}; |
| uint64 reserved0; |
| uint64 reserved1; |
| uint64 reserved2; |
| }; |
| |
| struct PacketGuestVcpu { |
| // TODO(scottmg): Unnamed union. |
| //union { |
| // struct { |
| // uint64_t mask; |
| // uint8_t vector; |
| // } interrupt; |
| // struct { |
| // uint64_t id; |
| // zx_gpaddr_t entry; |
| // } startup; |
| //}; |
| uint8 type; |
| uint64 reserved; |
| }; |
| |
| struct PacketInterrupt { |
| time timestamp; |
| uint64 reserved0; |
| uint64 reserved1; |
| uint64 reserved2; |
| }; |
| |
| struct PacketPageRequest { |
| uint16 command; |
| uint16 flags; |
| uint32 reserved0; |
| uint64 offset; |
| uint64 length; |
| uint64 reserved1; |
| }; |
| |
| struct PortPacket { |
| uint64 key; |
| uint32 type; |
| status status; |
| // TODO(scottmg): Unnamed union. |
| // union { |
| PacketUser user; |
| PacketSignal signal; |
| PacketException exception; |
| PacketGuestBell guest_bell; |
| PacketGuestMem guest_mem; |
| PacketGuestIo guest_io; |
| PacketGuestVcpu guest_vcpu; |
| PacketInterrupt interrupt; |
| PacketPageRequest page_request; |
| // }; |
| }; |
| |
| [Transport = "Syscall"] |
| protocol port { |
| /// Create an IO port. |
| port_create(uint32 options) -> (status status, handle<port> out); |
| |
| /// Queue a packet to a port. |
| /// Rights: handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| port_queue(handle<port> handle, PortPacket packet) -> (status status); |
| |
| /// Wait for a packet arrival in a port. |
| /// Rights: handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_READ. |
| [blocking] |
| port_wait(handle<port> handle, time deadline) -> (status status, optional_PortPacket packet); |
| |
| /// Cancels async port notifications on an object. |
| /// Rights: handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE. |
| port_cancel(handle<port> handle, handle source, uint64 key) -> (status status); |
| }; |