1 // Copyright 2016 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef ZIRCON_SYSCALLS_PORT_H_ 6 #define ZIRCON_SYSCALLS_PORT_H_ 7 8 #include <zircon/compiler.h> 9 #include <zircon/types.h> 10 11 __BEGIN_CDECLS 12 13 // clang-format off 14 15 // zx_object_wait_async() options 16 #define ZX_WAIT_ASYNC_ONCE ((uint32_t)0u) 17 #define ZX_WAIT_ASYNC_REPEATING ((uint32_t)1u) 18 19 // packet types. zx_port_packet_t::type 20 #define ZX_PKT_TYPE_USER ((uint8_t)0x00u) 21 #define ZX_PKT_TYPE_SIGNAL_ONE ((uint8_t)0x01u) 22 #define ZX_PKT_TYPE_SIGNAL_REP ((uint8_t)0x02u) 23 #define ZX_PKT_TYPE_GUEST_BELL ((uint8_t)0x03u) 24 #define ZX_PKT_TYPE_GUEST_MEM ((uint8_t)0x04u) 25 #define ZX_PKT_TYPE_GUEST_IO ((uint8_t)0x05u) 26 #define ZX_PKT_TYPE_GUEST_VCPU ((uint8_t)0x06u) 27 #define ZX_PKT_TYPE_INTERRUPT ((uint8_t)0x07u) 28 #define ZX_PKT_TYPE_EXCEPTION(n) ((uint32_t)(0x08u | (((n) & 0xFFu) << 8))) 29 30 // For options passed to port_create 31 #define ZX_PORT_BIND_TO_INTERRUPT ((uint32_t)(0x1u << 0)) 32 33 #define ZX_PKT_TYPE_MASK ((uint32_t)0x000000FFu) 34 35 #define ZX_PKT_IS_USER(type) ((type) == ZX_PKT_TYPE_USER) 36 #define ZX_PKT_IS_SIGNAL_ONE(type) ((type) == ZX_PKT_TYPE_SIGNAL_ONE) 37 #define ZX_PKT_IS_SIGNAL_REP(type) ((type) == ZX_PKT_TYPE_SIGNAL_REP) 38 #define ZX_PKT_IS_GUEST_BELL(type) ((type) == ZX_PKT_TYPE_GUEST_BELL) 39 #define ZX_PKT_IS_GUEST_MEM(type) ((type) == ZX_PKT_TYPE_GUEST_MEM) 40 #define ZX_PKT_IS_GUEST_IO(type) ((type) == ZX_PKT_TYPE_GUEST_IO) 41 #define ZX_PKT_IS_GUEST_VCPU(type) ((type) == ZX_PKT_TYPE_GUEST_VCPU) 42 #define ZX_PKT_IS_INTERRUPT(type) ((type) == ZX_PKT_TYPE_INTERRUPT) 43 #define ZX_PKT_IS_EXCEPTION(type) (((type) & ZX_PKT_TYPE_MASK) == ZX_PKT_TYPE_EXCEPTION(0)) 44 45 // zx_packet_guest_vcpu_t::type 46 #define ZX_PKT_GUEST_VCPU_INTERRUPT ((uint8_t)0) 47 #define ZX_PKT_GUEST_VCPU_STARTUP ((uint8_t)1) 48 // clang-format on 49 50 // port_packet_t::type ZX_PKT_TYPE_USER. 51 typedef union zx_packet_user { 52 uint64_t u64[4]; 53 uint32_t u32[8]; 54 uint16_t u16[16]; 55 uint8_t c8[32]; 56 } zx_packet_user_t; 57 58 // port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE and ZX_PKT_TYPE_SIGNAL_REP. 59 typedef struct zx_packet_signal { 60 zx_signals_t trigger; 61 zx_signals_t observed; 62 uint64_t count; 63 uint64_t reserved0; 64 uint64_t reserved1; 65 } zx_packet_signal_t; 66 67 typedef struct zx_packet_exception { 68 uint64_t pid; 69 uint64_t tid; 70 uint64_t reserved0; 71 uint64_t reserved1; 72 } zx_packet_exception_t; 73 74 typedef struct zx_packet_guest_bell { 75 zx_gpaddr_t addr; 76 uint64_t reserved0; 77 uint64_t reserved1; 78 uint64_t reserved2; 79 } zx_packet_guest_bell_t; 80 81 typedef struct zx_packet_guest_mem { 82 zx_gpaddr_t addr; 83 #if __aarch64__ 84 uint8_t access_size; 85 bool sign_extend; 86 uint8_t xt; 87 bool read; 88 uint64_t data; 89 uint64_t reserved; 90 #elif __x86_64__ 91 // NOTE: x86 instructions are guaranteed to be 15 bytes or fewer. 92 #define X86_MAX_INST_LEN 15u 93 uint8_t inst_len; 94 uint8_t inst_buf[X86_MAX_INST_LEN]; 95 uint8_t default_operand_size; 96 uint8_t reserved[7]; 97 #endif 98 } zx_packet_guest_mem_t; 99 100 typedef struct zx_packet_guest_io { 101 uint16_t port; 102 uint8_t access_size; 103 bool input; 104 union { 105 uint8_t u8; 106 uint16_t u16; 107 uint32_t u32; 108 uint8_t data[4]; 109 }; 110 uint64_t reserved0; 111 uint64_t reserved1; 112 uint64_t reserved2; 113 } zx_packet_guest_io_t; 114 115 typedef struct zx_packet_guest_vcpu { 116 union { 117 struct { 118 uint64_t mask; 119 uint8_t vector; 120 } interrupt; 121 struct { 122 uint64_t id; 123 zx_gpaddr_t entry; 124 } startup; 125 }; 126 uint8_t type; 127 uint64_t reserved; 128 } zx_packet_guest_vcpu_t; 129 130 typedef struct zx_packet_interrupt { 131 zx_time_t timestamp; 132 uint64_t reserved0; 133 uint64_t reserved1; 134 uint64_t reserved2; 135 } zx_packet_interrupt_t; 136 137 typedef struct zx_port_packet { 138 uint64_t key; 139 uint32_t type; 140 zx_status_t status; 141 union { 142 zx_packet_user_t user; 143 zx_packet_signal_t signal; 144 zx_packet_exception_t exception; 145 zx_packet_guest_bell_t guest_bell; 146 zx_packet_guest_mem_t guest_mem; 147 zx_packet_guest_io_t guest_io; 148 zx_packet_guest_vcpu_t guest_vcpu; 149 zx_packet_interrupt_t interrupt; 150 }; 151 } zx_port_packet_t; 152 153 __END_CDECLS 154 155 #endif // ZIRCON_SYSCALLS_PORT_H_ 156