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